一、背景空的flutter項(xiàng)目編譯生成Android apk包其體積約50MB左右,而空的原生Android項(xiàng)目編譯生成的Android apk包其體積僅3.6MB左右,二者相差巨大!什么原因?qū)е逻@一結(jié)果呢? 基本猜測:flutter生成的Android安裝包apk中包含了大量flutter基礎(chǔ)庫代碼。這些基礎(chǔ)代碼以什么樣的形式存在apk中的呢? 為了解決以上疑惑故對flutter的Android包進(jìn)行分析對比。 二、Android包結(jié)構(gòu)Android apk包本質(zhì)是一個zip壓縮包,可以將apk后綴改為zip并通過解壓工具得到內(nèi)部文件,一般包含如下文件:
如原生apk包文件: apk反編譯工具通過反編譯工具可以進(jìn)一步分析apk包內(nèi)容,常用工具如下:
三、原生APK與Flutter對比一般apk分debug和release版本,故分別對這兩種情況對比! 3.1 Debug包對比flutter的debug apk包:原生Android的debug apk包:二者Debug包對比總體體積(下載體積為apk應(yīng)用商店內(nèi)包實(shí)際大?。?/p>
通過對比發(fā)現(xiàn),造成debug包體積差異過大的主要原因(解壓文件對比):
3.2 Release包對比flutter的release apk包:包含三種ABI的.so庫Android的release apk包:二者Release包對比總體體積(下載體積為apk應(yīng)用商店內(nèi)包實(shí)際大小):
通過對比發(fā)現(xiàn),造成release包體積差異過大的主要原因(解壓文件對比):
四、flutter生成不同ABI動態(tài)庫的apk包通過剔除不必要的ABI動態(tài)庫.so包,從而減少apk包體積大小。 4.1 ABI簡介不同的 Android 設(shè)備使用不同的 CPU,而不同的 CPU 支持不同的指令集。CPU 與指令集的每種組合都有專屬的應(yīng)用二進(jìn)制接口 (ABI)。 android支持的 ABI如下:
高版本的arm架構(gòu)會兼容低版本的arm架構(gòu),一般廠商只會選定一個cpu架構(gòu)進(jìn)行適配,為了減少apk包大小我們可以選定armeabi-v7a或者arm64-v8a即可。 4.2 flutter打不同ABI的apk包通過下面的命令,可以生成不同ABI的apk包,該命令默認(rèn)release并開啟壓縮:
包大小列表: 打包含單獨(dú)ABI的release apk包平均大小6MB左右,可以有效的降低包體大小。 五、總結(jié)初始項(xiàng)目的flutter打apk包情況如下:
|
|