為什么apk越來(lái)越大?
1.項(xiàng)目不斷發(fā)展,功能越多,代碼量增加的同時(shí),資源文件也在不斷的增多。
2.app支持的主流dpi越來(lái)越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,間接導(dǎo)致資源增多。
3.引入的第三方sdk或開源庫(kù)越來(lái)越多,增加了很多重復(fù)的資源或方法以及無(wú)效代碼。
4.用于體驗(yàn)要求高,圖片資源為保證清晰度會(huì)使用分辨率更高的圖片。
apk瘦身的切入點(diǎn)
解壓一個(gè)沒有加固過的apk文件我們會(huì)看到下邊的內(nèi)容,相信你對(duì)這些文件或目錄的含義都已經(jīng)清楚,接下來(lái)我們將會(huì)從三個(gè)方面進(jìn)行apk的瘦身操作:
1.Java代碼,對(duì)應(yīng)classes.dex文件,我們要剔除無(wú)效代碼,減小dex文件大小。
2.資源文件,對(duì)應(yīng)res文件夾,assets目錄。
3.減小lib中引入的so大小。
開始瘦身
接下來(lái)我們將分別針對(duì)上邊的三個(gè)切入點(diǎn)進(jìn)行apk瘦身。
一.減小Java代碼的體積
有人認(rèn)為這個(gè)方面的處理很雞肋,因?yàn)槊恳恍写a都對(duì)應(yīng)相應(yīng)的功能,這里能有多大的精簡(jiǎn)空間,其實(shí)并非完全如此,隨著項(xiàng)目的不斷推進(jìn),編碼過程中會(huì)產(chǎn)生很多的冗余代碼,比如該刪掉的沒有刪掉,過多的重復(fù)性功能的工具類,無(wú)效的引用等,這還是其次,比較大的一個(gè)問題是,隨著你引入的開源庫(kù)不斷增多,無(wú)效代碼的出現(xiàn)幾乎是必然事件,過多的重復(fù)方法還會(huì)導(dǎo)致64k方法數(shù)的問題。接下來(lái)進(jìn)入正題。
開啟minifyEnable
它的作用不僅僅是混淆代碼,還有壓縮優(yōu)化的功能,他會(huì)遍歷所有代碼并找出沒有引用到的代碼,這些代碼不會(huì)生成在apk中;另外混淆的效果是使用簡(jiǎn)短的字母替代原來(lái)的類名屬性名等,一定程度上也可以減小代碼體積。
定期review重構(gòu)代碼
對(duì)代碼的不斷優(yōu)化是提升個(gè)人能力的有效手段,同時(shí)優(yōu)化的結(jié)果也會(huì)間接的對(duì)apk進(jìn)行精簡(jiǎn)。
慎重選擇你使用的開源庫(kù)
很多開源庫(kù)針對(duì)不同平臺(tái)提供了精簡(jiǎn)版,目的就是移除在本平臺(tái)上不需要的代碼,例如fastJson,我們選擇精簡(jiǎn)版就可以使開源代碼縮小一倍左右,另外針對(duì)沒有精簡(jiǎn)版的開源庫(kù),需要根據(jù)場(chǎng)景考慮是否使用源碼依賴,手動(dòng)移除不必要的文件資源。
二.資源文件瘦身
優(yōu)先采用WebP圖片
資源文件是apk中體積占用較大的一部分,尤其是圖片資源,所以我們首要以圖片的瘦身為主。首先要對(duì)圖片編碼格式有簡(jiǎn)單了解。Android平臺(tái)支持的格式有:JPEG,PNG,GIF,BNP,WebP(4.0開始支持WebP),但是Android應(yīng)用開發(fā)中,Bitmap所支持的只有三種JPEG,PNG,WebP,從Bitmap類的CompressFormat枚舉可以看出(詳見源碼)。
JPEG:有損壓縮,不支持透明通道和多幀動(dòng)畫(RGB)
PNG:無(wú)損壓縮,支持透明通道(ARGB),PNG大小大于JPEG
WebP:支持有損和無(wú)損壓縮,支持透明通道和多幀動(dòng)畫,4.0以上是開發(fā)首選,Google官方測(cè)試,WebP比PNG能減少45%大小,即便PNG經(jīng)過壓縮,也能相比PNG減小28%
PNG格式圖片盡量使用NinePatch格式
9圖具有體積小,拉伸不變形的特點(diǎn),并且Android studio可以一鍵轉(zhuǎn)換,使用起來(lái)相當(dāng)方便。
Lint查找無(wú)效資源
Lint可以檢查res目錄下的無(wú)效資源(無(wú)法檢查assets),然后將其刪除,但是有一點(diǎn)要注意,如果資源文件是通過反射機(jī)制調(diào)用的,Lint是無(wú)法知道的,所以使用lint檢查出的每一個(gè)資源都需要人工進(jìn)行確認(rèn),防止發(fā)生異常刪除。
開啟shrinkResources功能
shrinkResources標(biāo)識(shí)是否去除無(wú)用的resource文件,它需要配合minifyEnable使用,同樣存在反射機(jī)制引用的問題,這種情況會(huì)被誤刪
```
android {
buildTypes {
release {
minifyEnable true
shrinkResources true
}
}
}
```
resConfigs剔除第三方庫(kù)或者SDK中的資源
第三方庫(kù)中包含的無(wú)效資源通常包含以下兩點(diǎn):
dpi目錄,第三方庫(kù)通常會(huì)提供所有的dpi目錄以及對(duì)應(yīng)的資源文件,因?yàn)樗轻槍?duì)大眾使用的,而我們未必都需要,這時(shí)候需要選擇性的移除。
很多第三方sdk是做了國(guó)際化,而我們可能用不到,此時(shí)也需要?jiǎng)h除國(guó)際化資源。
```
defaultConfig {
。。。
resConfigs "zh" //表示只使用中文
resConfigs "xxhdpi" // 表示只是用xxhdpi目錄下的資源文件
}
```
三.libs目錄瘦身
so文件最終會(huì)被打包到libs目錄中,我們針對(duì)libs目錄的瘦身主要是去除不必要的平臺(tái)ABI的so文件,例如我們只保留v7a和x86平臺(tái)的so
```
defaultConfig {
ndk {
abiFilters "armeabi-v7a","x86"
}
}
```
四.其他的一些優(yōu)化
1.不涉及透明圖層的圖片可以轉(zhuǎn)換為jpg格式,比如歡迎頁(yè)的圖片。
2.使用shape(Vector)替換圖片。
3.刪除或者替換兼容包中無(wú)用的一些圖(v4.v7.v13)。
4.刪除第三方aar庫(kù)中使用的大圖。
5.把so文件放置在網(wǎng)上或者sd卡內(nèi)。
-
Android
+關(guān)注
關(guān)注
12文章
3937瀏覽量
127484 -
apk
+關(guān)注
關(guān)注
0文章
23瀏覽量
4944
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論