安裝包大小優化
安裝包大小對應用的使用沒什麼影響,但提高來用戶的下載門檻。減少安裝包大小用戶更願意下載和體驗。減少安裝包大小之前先了解安裝包(APK文件)的構成。
應用裝包的構成
APK是一個壓縮文件,包含Android應用程序的所有內容,是Android平臺用於安裝應用程序的文件。
- assets
assets目錄可以根據應用需求存放任何文件夾架構,如配置文件、資源文件,這些文件的內容可通過AssetManager類獲得。和res的不同點在於,res目錄下的文件會在.R文件中生成對應的資源ID,assets不會自動生成對應的ID,而是通過AssetManager類的接口獲取。
- lib
存放應用程序依賴的用C/C++編寫的native庫文件。
- res
這個目錄存放資源文件,在這個文件夾下的所有文件都會生成對應的ID映射到Android工程的.R文件中。
- META-INF
保存應用的簽名信息,簽名信息可以驗證APK文件的完整性。
- AndroidManifest.xml
是用來描述Android應用“整體資訊”的設定文件,文件名是固定的不能修改。
- classes.dex
Java可執行程序,需要先把Java文件編譯成class文件,字節碼都保存在class文件中,Android虛擬機把Java字節碼轉爲Dalvik字節碼。
- proguard.cfg
代碼混淆配置文件
- rsources.arsc
記錄資源文件和資源ID之間的映射關係,用來根據資源ID尋找資源。
以上APK組成中,classes.dex、lib、資源文件是大頭,AKP瘦身主要就是優化這三類。
減少安裝包大小的常用方案
1. 代碼混淆
ProGuard是一個開源的Java代碼混淆器,默認集成到Android SDK中,主要具有以下功能:
- 壓縮:移除無效的類、屬性、方法等
- 優化:移除沒有的結構
- 混淆:把類名、屬性名、方法名替換爲一到兩個字母
ProGuard配置參數非常多,具體可參考網站
按照語法規則編寫proguard-rules.pro後,需要在build.gradle中配置,同時設置minifyEnabled爲true,在編譯工程時自動混淆代碼,代碼如下:
buildTypes{
debug{
minifyEnabled false
}
release{
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles 'proguard-rule.pro'
}
}
2. 資源優化
ProGuard只能對代碼進行分析和優化,但對資源文件沒有類似的效果。
- 使用Android Lint檢測並刪除冗餘資源
(1)單擊菜單欄中的Analyze -> Run Inspection by Name,彈出工具選擇框;
(2)在彈出的輸入框中輸入Unused resources,回車;
(3)選擇要掃描的目錄或整個工程,單擊OK開始掃描;
(4)掃描完生成報告,可在AS中直接查看並刪除確認無用的資源文件。
Android Lint不會分析assets文件夾下的資源,因爲它們不需要通過具體的引用,Lint無法判斷資源是否被用到。
- 資源文件最少化
如果爲了適配不同屏幕,每個文件夾都放一套圖,對安裝包大小影響很大。雖然Android支持很多中屏幕密度,但不代表應用爲沒一個屏幕都提供一套資源,在這方面可以參考以下幾點:
(1)儘量使用一套圖片資源,遇到一些圖片在不同分辨率手機變化過大時,在考慮在相應文件放入特定圖片;
(2)使用一套圖、一套佈局、多套dimens.xml文件,在使用最小資源都情況下,解決多分辨率適配;
(3)使用輕量級的第三方庫;
(4)減少項目中預置圖片,改成服務下發。
- 圖片優化
對於非透明大圖,JPG文件會比PNG小很多,一般情況下能用JPG代替PNG就用JPG,如果用PNG可以用工具降低圖片色彩位數和壓縮(Zopfli和PNGoo)。
WebP是一種新的圖片格式,支持透明度,壓縮比JPG更高,但效果不比JPG差,是一種更好的選擇。(但只能4.2.2以上版本使用)
3. 其他優化
- 避免重複功能的庫:比如幾種圖片庫,最好只選擇一種,如果有業務無法滿足,最好在這個基礎上擴展而不是加入另一個庫。不僅增加體檢也增加維護成本。
- 插件化
本文參考書籍《Android應用性能優化最佳實踐》