当你执行 build apk 后,flutter会默认进行混淆,若你的应用中引用了第三方的sdk,在debug模式下没问题,但在release下可能就会出现各种各样的问题,找不到某个类,或者某个功能无法使用,甚至直接崩溃等,此时,就需要你去处理混淆的相关问题。
1.禁用混淆:
flutter build apk --no-shrink
在使用flutter命令进行打包时,后面可以加上支持的cup架构,如:
flutter build apk --no-shrink --target-platform android-arm,android-arm64
就只会打’armeabi-v7a’, ‘arm64-v8a’,若想支持x84_64,可以添加上android-x64。
如果想把各种架构分开打包,可以添加上--split-per-abi
,最终打包结果会是这样:
- [project]/build/app/outputs/apk/release/app-armeabi-v7a-release.apk
- [project]/build/app/outputs/apk/release/app-arm64-v8a-release.apk
- [project]/build/app/outputs/apk/release/app-x86_64-release.apk
2.配置混淆规则:
1).在android主工程app下添加 proguard-rules.pro 文件,并配置混淆规则:
-keep class io.flutter.plugin.** { *; }
......
2).在app的build.gradle中引用proguard-rules.pro:
signingConfigs {
release {
storeFile file('test.jks')
storePassword '123456'
keyAlias 'test'
keyPassword '123456'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
shrinkResources true
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.release
}
}
以上两种方法,基本上可以解决打release后出现的各种问题。
但还有一种情况,可能以上两种方法都无法解决,即第三方sdk引用了drawable中的一个图片资源进行安全验证,例如阿里百川的安全图片yw_1222_baichuan.jpg。这种情况,即便你禁用混淆,在打完release包后,可能仍然会报安全验证失败(找不到安全图片资源)。
本人在最初的测试中,将release包解压后看到资源文件列表如下:
资源文件是被混淆了的(禁用混淆没用),但使用反编译工具查看,图片资源基本都正常:
这里我就黑人问号了???图片资源路径没有任何问题,但安装后为什么仍然报找不到资源?猜测,可能是打包过程中对资源进行了压缩或其它操作导致图片属性发生变化,以至于sdk无法识别!
最后的终极解决办法:通过以上两种方式打release包后,解压apk,找到混淆后的jpg格式文件(nQ.jpg,需要确认这个就是安全图片),删除之,创建drawable文件夹,将正常的yw_1222_baichuan.jpg复制进去,重新修改为apk格式。
若此时直接安装,会提示无签名文件,需要你手动再次签名一下,然后再安装,会发现,已可以成功运行,并验证通过!