一、背景空的flutter项目编译生成Android apk包其体积约50MB左右,而空的原生Android项目编译生成的Android apk包其体积仅3.6MB左右,二者相差巨大!什么原因导致这一结果呢? 基本猜测:flutter生成的Android安装包apk中包含了大量flutter基础库代码。这些基础代码以什么样的形式存在apk中的呢? 为了解决以上疑惑故对flutter的Android包进行分析对比。 二、Android包结构Android apk包本质是一个zip压缩包,可以将apk后缀改为zip并通过解压工具得到内部文件,一般包含如下文件:
如原生apk包文件: apk反编译工具通过反编译工具可以进一步分析apk包内容,常用工具如下:
三、原生APK与Flutter对比一般apk分debug和release版本,故分别对这两种情况对比! 3.1 Debug包对比flutter的debug apk包:原生Android的debug apk包:二者Debug包对比总体体积(下载体积为apk应用商店内包实际大小):
通过对比发现,造成debug包体积差异过大的主要原因(解压文件对比):
3.2 Release包对比flutter的release apk包:包含三种ABI的.so库Android的release apk包:二者Release包对比总体体积(下载体积为apk应用商店内包实际大小):
通过对比发现,造成release包体积差异过大的主要原因(解压文件对比):
四、flutter生成不同ABI动态库的apk包通过剔除不必要的ABI动态库.so包,从而减少apk包体积大小。 4.1 ABI简介不同的 Android 设备使用不同的 CPU,而不同的 CPU 支持不同的指令集。CPU 与指令集的每种组合都有专属的应用二进制接口 (ABI)。 android支持的 ABI如下:
高版本的arm架构会兼容低版本的arm架构,一般厂商只会选定一个cpu架构进行适配,为了减少apk包大小我们可以选定armeabi-v7a或者arm64-v8a即可。 4.2 flutter打不同ABI的apk包通过下面的命令,可以生成不同ABI的apk包,该命令默认release并开启压缩:
包大小列表: 打包含单独ABI的release apk包平均大小6MB左右,可以有效的降低包体大小。 五、总结初始项目的flutter打apk包情况如下:
|
|