Apk瘦身
Apk的大小對于用戶是否選擇下載應(yīng)用起著至關(guān)重要的影響
下面是對于減小Apk大小的一些常用且實用的方法總結(jié)
如有錯誤饵史,歡迎大家踴躍指出
目錄
- 資源占用分析
- 圖片壓縮
- 圖片類型
- 壓縮
- PNG壓縮
- Webp
- 混淆
- 代碼混淆
- 資源混淆
- resConfig和lib
- 優(yōu)化代碼
- 致謝
資源占用分析
- 使用AndroidStudio,將APK拖拽到AS里面就出現(xiàn)如下圖:
- 簡單分析目錄作用:
- 針對大小較大的目錄進行優(yōu)化
圖片壓縮
圖片類型
- JPEG :一種廣泛使用的有損壓縮圖像的標(biāo)準格式,不支持透明通道和多幀動畫滤港。
- PNG : 一種無損壓縮圖片格式鼠冕,支持透明通道
- WebP :支持有損和無損壓縮添寺、支持完整的透明通道、支持多幀動畫懈费,同時大小也得到很好的限制
壓縮
使用 TinyPNG工具支持對PNG/JPEG圖片類型的壓縮
PNG替換
根據(jù)情況使用一下資源替換PNG
-
Drawable.xml
: 一些漸變背景圖或者形狀都可以直接通過xml繪制出來计露,SVG在Android中的應(yīng)用 也可以給你提供一些繪制的思路 -
NinePatch
: 點9圖,體積小憎乙,支持拉伸不變形票罐,實現(xiàn)一圖多用,降低APK體積寨闹。AndroidStudio提供PNG轉(zhuǎn)換成 NinePatch的方法胶坠,只需要對著PNG右鍵Create 9-Patch file
-
JPEG
: 在對透明通道無需求的情況下,使用JPEG代替PNG也可以降低APK 體積
WebP
- 優(yōu)勢:
- PNG 轉(zhuǎn) WebP 的壓縮率要高于 PNG 原圖壓縮率繁堡,同樣支持有損與無損壓縮
- 轉(zhuǎn)換后的 WebP 體積大幅減少沈善,圖片質(zhì)量也得到保障(同時肉眼幾乎無法看出差異)
- 轉(zhuǎn)換后的 WebP 支持 Alpha 透明和 24-bit 顏色數(shù)乡数,不存在 PNG8 色彩不夠豐富和在瀏覽器中可能會出現(xiàn)毛邊的問題
- AndroidStudio2.3之后支持對WebP的預(yù)覽和直接轉(zhuǎn)換
- 注意:
- Android 4.0 以后才支持, 4.2.1以后才支持帶透明通道的WebP
- 對于不需要透明度的PNG需要 先轉(zhuǎn)換成JPEG再轉(zhuǎn)化成WebP闻牡,否則會因為帶有透明通道净赴,而在4.2.1以下的版本中無法顯示
混淆
代碼混淆
-
minifyEnable
: 啟動混淆,啟用混淆的同時他會對代碼壓縮和優(yōu)化罩润,找出沒有引用的代碼并 在生成APK之前剔除 -
shrinkResources
: 只有當(dāng)minifyEnable
開啟玖翅,才能起作用。去除無用的resource文件割以。 注意 :shrinkResources
不能幫你移除資源文件金度, 只會幫你壓縮合并(可能是因為R文件 生成id索引信息)。 - 使用Lint刪除無用資源 : Refactor -> Remove Unused Resource 严沥。 注意 : 刪除之前最好Preview一下猜极,不然會把一些通過反射或者Uri等方式引用的資源也會被刪除,最終導(dǎo)致
Resources Not Found Exception
資源混淆
關(guān)于資源混淆目前比較好的是微信的方案:AndResGuard
相關(guān)的注意事項和使用方式在項目地址也有很清晰的說明了~~
resConfig和lib
android {
...
defaultConfig {
...
resConfigs "en","fr"
ndk{
//設(shè)置支持的SO庫架構(gòu)
abiFilters 'armeabi','x86','armeabi-v7a','x86_64','arm64-v8a'
}
}
}
根據(jù)需要指定需要的語言和需要兼容的so庫文件消玄,從而減少不必要的文件達到瘦身的目的跟伏。
優(yōu)化代碼
- 移除廢棄功能的代碼,反正有 VCS 翩瓜,刪了代碼隨時可以找回受扳;
- 移除重復(fù)的代碼,如:已經(jīng)有了的功能代碼兔跌,團隊成員不知道自己又寫了一套,只能靠代碼 Review 解決了相满;
- 移除功能重疊的框架桦卒,如:項目中有幾套網(wǎng)絡(luò)訪問框架 Volley匿又、AsyncHttpClient、Retrofit 等碌更,同樣只能靠代碼 Review 解決;
- 移除無用的 dependencies 或者 jar 包嘿棘;
- 減小對 Support 兼容包的依賴旭绒,Support-V4 包非常大焦人,項目引入無疑會增大 dex 文件的大小重父,Google 已經(jīng)意識到這個問題,所以 Support-V7 一開始就做了拆分房午,并且開始對 Support-V4 做拆分,雖然目前成果還不明顯袋倔,不過還是蠻值得期待的折柠,特別是發(fā)現(xiàn)你少了 Support-V4 包后,可能就從2個 dex 變成1個 dex 了呢液走;
- 插件化,一種懶加載思想的體現(xiàn)缘眶,先讓用戶能夠安裝宿主包巷懈,對于一些功能模塊做插件化,在特定的時機再下載安裝顶燕;
綜上所述,就可以有效的精簡我們安裝包中的 dex 文件大小涌攻,從而達到瘦身目的。
致謝
《Android高級進階》 - 顧浩鑫
APK瘦身實踐
APK應(yīng)用瘦身的一些坑
APK應(yīng)用瘦身
WebP探索