原文链接:https://github.com/flutter/flutter/wiki/Obfuscating-Dart-Code
以下内容均来自Flutter Github官方Wiki。
代码混淆可以隐藏你的Dart代码中的函数和类名,让反编译App变得困难。
注:Dart的混淆还没有经过完全的测试,如果发现问题请到GitHub上提 issue 。关于混淆的问题,还可以参考 Stack Overflow 上的这个问题。
Flutter中的混淆配置其实是在Android和iOS端分别配置的。
Android
在<ProjectRoot>/android/gradle.properties
文件中添加如下代码:
extra-gen-snapshot-options=--obfuscate
默认情况下,Flutter不会混淆或者缩减Android host,如果你使用了第三方的Java或者Android库,那么你可能需要减小APK体积,或者防止你的App被反编译。
- Step 1:配置Proguard文件
新建/android/app/proguard-rules.pro
文件,然后添加如下配置:
#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.** { *; }
-keep class io.flutter.util.** { *; }
-keep class io.flutter.view.** { *; }
-keep class io.flutter.** { *; }
-keep class io.flutter.plugins.** { *; }
上面的配置只保护Flutter库,其他额外的库(比如Firebase)需要你自己添加配置。
- Step 2:
打开/android/app/build.gradle
文件,定位到buildTypes
处,在release
配置中将minifiyEnabled
和useProguard
标志设为true,同时还需要指向Step1中创建的ProGuard文件:
android {
...
buildTypes {
release {
signingConfig signingConfigs.debug
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
注意混淆和缩减无用代码会加长App的编译时间。
iOS
- Step 1:修改 “build aot”
在<ProjectRoot>/packages/flutter_tools/bin/xcode_backend.sh
文件中添加build aot
flag:
${extra_gen_snapshot_options_or_none}
然后定义这个flag:
local extra_gen_snapshot_options_or_none=""
if [[ -n "$EXTRA_GEN_SNAPSHOT_OPTIONS" ]]; then
extra_gen_snapshot_options_or_none="--extra-gen-snapshot-options=$EXTRA_GEN_SNAPSHOT_OPTIONS"
fi
- Step 2:应用你的修改
在你的App的根目录下运行以下两条命令:
git commit -am "Enable obfuscation on iOS"
flutter
- Step 3:更改release配置
在<ProjectRoot>/ios/Flutter/Release.xcconfig
中添加下面这行:
EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate