Flutter split-debug-info 用法介绍
介绍如何使用 Flutter 1.7 提供的 split-debug-info
编译选项来减小包大小。
简介
先介绍下什么是 Code obfuscation。Code obfuscation 翻译过来就是代码混淆。代码混淆是修改应用二进制文件以增加理解难度的过程。混淆会隐藏编译后的 Dart 代码中的函数名和类名,让攻击者难以对应用进行逆向工程。
目前 Flutter (v1.7.14) stable 分支仅在 release build 中支持代码混淆。Pull Request #49650 · flutter/flutter 添加了这个功能。
用法
同时使用 --obfuscate
和 --split-debug-info
标志来在 release 版本的应用中开启混淆。--split-debug-info
用于指定一个目录来存放 debug 文件,即 symbol map。目前 Flutter (v1.7.14) stable 分支支持 apk
、appbundle
、ios
和 ios-framework
,master 和 dev 分支上还支持 macos
和 aar
。
示例:编译并混淆一个 APK,在 tmp
目录下保存 symbol map。
1 | flutter build apk --release --target-platform android-arm64 \ |
对于 Android 项目,也可以通过在 <project>/app/gradle.properties
中添加如下配置来开启代码混淆。
1 | extra-gen-snapshot-options=--obfuscate |
编译完成后 tmp
目录将生成一个后缀名为 .symbols
的文件。
注意:也可以单独使用 --split-debug-info
。实际上这个参数是用来减小代码大小的 (即 libapp.so
的大小)
分别使用如下命令编译 APK。第一条命令生成优化前的 APK,第二条命令生成优化后的 APK。
1 | flutter build apk --release --target-platform android-arm64 |
1 | flutter build apk --release --target-platform android-arm64 \ |
使用 --split-debug-info
优化后,APK 大小较之前减少 435KB。
- 优化前未压缩状态下
libapp.so
大小是 9.7MB - 优化后未压缩状态下
libapp.so
大小是 8.6MB
真正的减少来自 libapp.so
,约 1.1MB。正如文档所言,--split-debug-info
可以减少代码大小。不过考虑到 APK 是压缩包,所以 libapp.so
的减小反映在 APK 包大小变化上并不明显。
优化效果
我们项目以 AAR 产物方式集成 Flutter。我从我们最新发布的 APK 中解压出 libapp.so
,不作称为 libapp-当前发布包.so
。
flutter build aot --release --target-platform android-arm
编译结果为 libapp-优化前.so
flutter build aot --release --target-platform android-arm
加上 --obfuscate
和 --split-debug-info
的编译结果为 libapp-优化后.so
。
可以看到前两个 so 文件大小接近,后一个 so 文件小了将近 0.9MB。(注意:这里的 so 是32位,不同于上一节中的64位,所以文件大小变化不同)。这里的 0.9MB(减小约11%) 并不太起眼,不过考虑到最小的 libapp.so
也有将近 3.7MB,所以其实还是很可观的。
文件 | 大小 | 备注 |
---|---|---|
最小的 libapp.so |
3.7MB | 从 flutter create 创建的工程编译而来 |
libapp-当前发布包.so |
8.3MB | 从最新发布的APK解压而来 |
libapp-优化后.so |
7.4MB | 使用 split-debug-info 编译编译 |
参考
官方 Measuring your app’s size - Flutter 中提供了几种减小 Flutter 包大小的方法,可以作为参考
- Remove unused resources
- Minimize resource imported from libraries
- Support a limited number of screen densities
- Compress PNG and JPEG files
其他资料: