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 分支支持 apkappbundleiosios-framework,master 和 dev 分支上还支持 macosaar

示例:编译并混淆一个 APK,在 tmp 目录下保存 symbol map。

1
2
3
flutter build apk --release --target-platform android-arm64 \
--obfuscate \
--split-debug-info=tmp/

对于 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
2
3
flutter build apk --release --target-platform android-arm64 \
--obfuscate \
--split-debug-info=tmp/

使用 --split-debug-info 优化后,APK 大小较之前减少 435KB。

-w727

  • 优化前未压缩状态下 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

其他资料: