背景
- 隨着業務的發展app體積越來越大,由剛開始的幾M到後來的幾十M。APP越來越大會導致用戶使用成本會上升,進而導致用戶的流失等等。。。。
壓縮APP,減小app體積刻不容緩!!! - 隨着Android studio 3.0 發佈,也隨之提供了 Analyser 來分析apk
apk結構分析
apk有lib、classes.dex、assets、resources.arsc、res等文件組成
- lib/:存放so文件
- classes.dex:Dalvik字節碼
- assets /:可以存放一些配置文件,這些文件的內容在程序運行過程中可以通過相關的API獲得。
- resources.arsc:編譯後的二進制資源文件的索引(apk文件的資源表索引)
- res/ :資源文件目錄,包括圖片、字符串等等。
結構詳細介紹請移步
以上面截圖爲例我們apk瘦身的主要目標有了,主要是lib、res、classes.dex。話不多說,開始步入正題;
apk瘦身開始
1、lib
so文件與cpu的關係或者聯繫
可以看到,該目錄下主要存放so文件的,so文件包括:armeabi、armeabi-v7a、arm64-v8a、mips、mips64、x86、x86_64等。
目前市面上的兼容市面是的手機主要保留armeabi-v7a和arm64-v8a就可以了
或者把so文件放在服務器上動態獲取
buildTypes {
release {
//省略其他配置
ndk {
//選擇要添加的對應cpu類型的.so庫。
abiFilters 'arm64-v8a', 'armeabi-v7a'
}
}
}
2、classes.dex
classes.dex中包含了所有的java代碼,當你打包時,gradle會將所有模板力的.class文件轉換成classes.dex文件,當然,如果方法數超過64K的話,需要多個classes.dex來存放。換句話說,就是減少代碼量。我們可以通過以下方法來實現:
- 減少不必要的第三方庫的引用
- 避免使用枚舉
- 避免引用重複功能的庫(如glide,picasso,fresco,image_loader,只需引用一個就好)
- 嘗試自己造輪子
- 開啓minifyEnabled混淆代碼
等等
3、res
該目錄下存放各種圖片、佈局文件以及資源文件等,優化步驟主要有
圖片資源
- 保真壓縮圖片
可以使用一些圖片壓縮網站或者工具壓縮你的資源文件吧,例如TinyPng、智圖等。 - 保留一套圖片(xxxhdpi)
- 使用webp格式
- 合理的服用圖片資源
- 避免使用幀動畫
- 清除不使用的圖片
- 開啓壓縮
release {
//省略其他配置
minifyEnabled true //混淆代碼
zipAlignEnabled true
shrinkResources true //資源瘦身
}
}
等等
語言資源
根據app使用範圍,刪除不一樣的語音資源
defaultConfig {
//隱藏其他配置
resConfigs "zh-rCN"//只保留中文簡體
}
其他方面優化
合理使用lint工具,刪除不在使用的資源文件和代碼等等