參考:
- 《Android高級進階》第24章
- [Android技術專題]APK瘦身看這一篇文章就夠了
- Android 瘦身實踐
- Android APP終極瘦身指南
為什么瘦身?
- 省流量
- 給用戶一個好印象
為什么APP會變胖?
- Android系統碎片化嚴重,為了適配,每個APP要支持的主流dpi分類會很多,dpi越多,那么就相當于資源文件變多,也許一個圖標,我們要給它對應的ldpi,mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi等都要弄一張圖標文件
- Android生態系統的不斷發展成熟,出現了許多方便開發者的函數庫和SDK,庫或SDK引入過多,不可避免的引入很多重復功能代碼和資源文件。
APK文件結構
apk解壓后的目錄
- AndroidManifest.xml:系統清單文件
- assets:存放用來需要打包到Android應用程序的靜態資源文件,例如圖片資源文件,json配置文件,渠道配置文件,二進制數據文件
- classes.dex:應用程序的可執行文件,可以通過反編譯工具反編譯后進行查看,如果APP的方法數超過65K的限制,需要進行分包,這樣就會存在多個dex文件。
- lib:存放程序依賴的不同ABI類型的.so文件
- res:存放應用的資源文件,包括圖片資源,字符串資源,顏色資源,尺寸資源等,這些資源都會出現在資源清單文件R.java的索引中
res目錄g
- resources.arsc:資源索引表,用來描述具有ID值的資源的配置信息
- META-INF:存放簽名相關的信息,用于驗證APK包的完整性以及保證系統的安全,主要包含三個文件
- MANIFEST.MF:主要存放APK包中每個文件的名字及每個文件的SHA1哈希值
MANIFEST.MF
- CERT.SF:通常每個APP會有一個特定的名字,例如BDMOBILE.SF,NETDISK_.SF等,它保存的是MANIFEST.MF的哈希值以及MANIFEST.MF文件中每一個哈希項的哈希值
- CERT.RSA:保存了apk包的簽名和證書的公鑰信息
從中可以分析出,一個APK包中的組成中,對APK大小影響較大的文件分別是
- Java代碼文件:classs*.dex
- Native代碼文件:.so文件
- 資源文件:包括assets文件,res目錄以及resources.arsc索引文件
優化圖片資源占用的空間
- 使用一套設計圖,建議取720p的資源,放到xhdpi目錄
- 使用webp格式的圖片,webp支持有損與無損壓縮,在既保證圖片質量有要限制圖片大小的需求下,webp應該是首選。
- 有損壓縮tinypng https://tinypng.com/
- 無損壓縮ImageOptim
- 有損壓縮ImageAlpha
- 使用jpg格式,jpg將會比png的大小有顯著的優勢,在啟動頁,活動頁等之類的大圖展示區采用jpg將是非常明智的選擇。
- 盡量使用NinePatch格式的PNG圖
- 使用shape背景,背景或圖標用代碼實現,特別是在扁平化盛行的當下,很多純色的漸變的圓角的圖片都可以用shape實現,代碼靈活可控,省去了大量的背景圖片。
- 使用著色方案:相信你的工程里也有很多selector文件,也有很多相似的圖片只是顏色不同,通過著色方案我們能大大減輕這樣的工作量,減少這樣的文件。借助于android support庫可實現一個全版本兼容的著色方案
- 使用LInt刪除無用資源,Proguard只會對Java代碼起作用,Lint會分析res目錄下面的資源文件,分析后給給出哪些資源沒用,但不會分析assets目錄下面的資源文件。
- 在線加載素材,不過不是很常用
使用Android Gradle配置
- minifyEnable:是否開啟Proguard混淆,設置為true時同時設置Proguard配置文件名和規則,Proguard的作用不僅僅是混淆,它還具有壓縮,優化等功能,他會遍歷所有代碼并找出沒有引用到的代碼,這些無用代碼字啊生成最終的APL文件之前會被剔除掉,同時Proguard會使用簡潔的字符組合替換原來的類名,屬性名等,在一定程度上減少APP的大小。
- shrinkResource:表示是否去除無用的resource文件,但是它依賴minifyEnable,需要nimifyEnabe為true時才生效
- resConfigs 通過resConfig的取值設置要剔除的資源
defaultConfig{
resConfigs "en" , "fr"
resConfigs "nodpi","hdpi","xhdpi"
}
減少庫的使用
- 在工程的build.gradle文件增加ndk.abiFilters配置,指定我們需要的ABI類型,建議實際工作的配置是只保留armable、armable-x86下的so文件,算是一個折中的方案。
- 避免重復庫
- 使用更小的庫
資源混淆 方案有美團和微信兩種
精簡功能業務
重構和優化代碼
支持插件化
把APP分割開來,實現動態加載代碼