Android的極致瘦身
刪除無用代碼
代碼也是占用apk的大小挤茄,而且有部分代碼引用一些無關(guān)的資源冰木,然而你想刪除這部分資源必須刪除特定的代碼
資源壓縮
- 第一個壓縮是通過TinyPNG網(wǎng)站進行壓縮的歇终。這里的壓縮也有個好處练湿,當你圖片格式選擇
BitmapFactory.decodeByteArray(b, 0, b.length, opt);
opt.inPreferredConfig = Bitmap.Config.RGB_565;
或者inPreferredConfig不填時辽俗,占用內(nèi)存會小3/4.這個會對通道有影響崖飘,但是在大部分圖片的現(xiàn)實沒有問題
- 圖片格式的選擇朱浴,大圖可以選擇使用webp的格式,可以很好的壓縮圖片大小项乒,但是有個兼容性的問題:Android4.0到Android4.2.1之間的版本不支持無損壓縮和透明格式的WebP圖片的編解碼,這個需要也可以解決使用通用自己的webp格式decode廷支,但是這也會增加包大小垛孔,當圖片很多時辛萍,可以采取這種方式。我打的so有82K辉阶,自己權(quán)衡吧,我覺得值的规辱。
- .9圖之坑,apk打包的時候會把.9圖轉(zhuǎn)成png浴讯,這時會無形中增加3倍圖片大小.如果一張很大的.9圖,最好放在網(wǎng)上奈籽,能不用大的.9圖就不用.9圖,放在外網(wǎng)時需要對.9圖做特殊處理鸵赫。
- 合并項目中一樣的圖,如關(guān)閉按鈕等勾拉,刪除一樣的圖
- 將一些不是很重要的圖放服務器下載盗温,有可能的話使用webp卖局,放網(wǎng)上也能節(jié)省流量斧蜕。我這里是剔除了所有大于10K的圖。
- 使用cocosjs的朋友砚偶,可以將打成的圖集過下TinyPNG,能節(jié)省不少均芽。
- 資源盡量放在drawable-xhdpi中劲妙,一些適配的資源可以單獨抽出來放镣奋,大部分資源沒必要放很多
- 如果支持的so的版本不多的話盡量放在armeabi中余赢,不使用其他的so没佑,如果不能的話拜秧,會有一個壓縮的庫供大家選擇聊替,下面會具體介紹的肩钠,so可以使用7Z再次壓縮泣港。有compile的包使用如下的代碼放gradle
ndk {
// 設置支持的SO庫架構(gòu)
abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a'
}
gradle優(yōu)化和工具使用
- 在gradle使用minifyEnabled進行Proguard混淆的配置
android {
buildTypes {
release {
minifyEnabled true
}
}
}
- 開啟shrinkResources去除無用資源
android {
buildTypes {
release {
shrinkResources true
}
}
}
- 清理無用資源
通過Android Studio自帶的 “Remove Unused Resources”小插件來實現(xiàn)了暂殖,但是在某些大型項目上這個是不好使的。刪除后很大概率編譯失敗或部分頁面掛死当纱、無圖等問題呛每。 - 刪除無用的語言資源
android {
defaultConfig {
resConfigs "zh"
}
}
- 微信資源壓縮打包工具通過短資源名稱,采用7zip對APP進行極致壓縮實現(xiàn)減小APP的目標坡氯,效果非常的好莉给。建議開啟7zip,注意白名單的配置
- 針對so的7z壓縮方案廉沮,如果項目so多的話颓遏,可以節(jié)省很多空間。
https://github.com/liyuming1978/NativeLibCompression - 支持插件化滞时,這個需要拆分代碼叁幢,我們還在努力拆分中。
插件化技術(shù)支持動態(tài)的加載代碼和動態(tài)的加載資源坪稽,把APP的一部分分離出來了曼玩,對于業(yè)務龐大的項目來說非常有用,極大的分解了APP大小窒百。
因為插件化技術(shù)需要一定的技術(shù)保障和服務端系統(tǒng)支持黍判,有一定的風險,如無必要(比如一些小型項目篙梢,也沒什么擴展業(yè)務)就不需要了顷帖,建議酌情選擇
- 清理第三方庫和冗余代碼,比如httpclient4.3 jar等等公共基礎庫
- Facebook的redex優(yōu)化字節(jié)碼
另外,據(jù)反應redex后會有崩潰的現(xiàn)象渤滞,這個要留意一下贬墩,我這里壓縮之后都是可以正常運行的
綜上:我們原來49M左右大小的包 優(yōu)化后大約34.27M