1.App瘦身經驗總結

爲什麼apk越來越大?

1.項目不斷髮展,功能越多,代碼量增加的同時,資源文件也在不斷的增多
2.app支持的主流dpi越來越多,如ldpi、mdpi、hdpi、xh xxh xxxh等等,間接導致資源增多
3.引入的第三方sdk或開源庫越來越多,增加了很多重複的資源或方法以及無效代碼
4.用於體驗要求高,圖片資源爲保證清晰度會使用分辨率更高的圖片

apk瘦身的切入點

解壓一個沒有加固過的apk文件我們會看到下邊的內容,相信你對這些文件或目錄的含義都已經清楚,接下來我們將會從三個方面進行apk的瘦身操作:
1.Java代碼,對應classes.dex文件,我們要剔除無效代碼,減小dex文件大小
2.資源文件,對應res文件夾,assets目錄
3.減小lib中引入的so大小


開始瘦身

接下來我們將分別針對上邊的三個切入點進行apk瘦身

1.減小Java代碼的體積

有人認爲這個方面的處理很雞肋,因爲每一行代碼都對應相應的功能,這裏能有多大的精簡空間,其實並非完全如此,隨着項目的不斷推進,編碼過程中會產生很多的冗餘代碼,比如該刪掉的沒有刪掉,過多的重複性功能的工具類,無效的引用等,這還是其次,比較大的一個問題是,隨着你引入的開源庫不斷增多,無效代碼的出現幾乎是必然事件,過多的重複方法還會導致64k方法數的問題。接下來進入正題。

1.開啓minifyEnable

它的作用不僅僅是混淆代碼,還有壓縮優化的功能,他會遍歷所有代碼並找出沒有引用到的代碼,這些代碼不會生成在apk中;另外混淆的效果是使用簡短的字母替代原來的類名屬性名等,一定程度上也可以減小代碼體積

2.定期review重構代碼

對代碼的不斷優化是提升個人能力的有效手段,同時優化的結果也會間接的對apk進行精簡

3.慎重選擇你使用的開源庫

很多開源庫針對不同平臺提供了精簡版,目的就是移除在本平臺上不需要的代碼,例如fastJson,我們選擇精簡版就可以使開源代碼縮小一倍左右,另外針對沒有精簡版的開源庫,需要根據場景考慮是否使用源碼依賴,手動移除不必要的文件資源。

2.資源文件瘦身

1.優先採用WebP圖片

資源文件是apk中體積佔用較大的一部分,尤其是圖片資源,所以我們首要以圖片的瘦身爲主。首先要對圖片編碼格式有簡單瞭解。Android平臺支持的格式有:JPEG,PNG,GIF,BNP,WebP(4.0開始支持WebP),但是Android應用開發中,Bitmap所支持的只有三種JPEG,PNG,WebP,從Bitmap類的CompressFormat枚舉可以看出(詳見源碼)。

JPEG:有損壓縮,不支持透明通道和多幀動畫(RGB)
PNG:無損壓縮,支持透明通道(ARGB),PNG大小大於JPEG
WebP:支持有損和無損壓縮,支持透明通道和多幀動畫,4.0以上是開發首選,Google官方測試,WebP比PNG能減少45%大小,即便PNG經過壓縮,也能相比PNG減小28%

2.PNG格式圖片儘量使用NinePatch格式

.9圖具有體積小,拉伸不變形的特點,並且Android studio可以一鍵轉換,使用起來相當方便。

3.Lint查找無效資源

Lint可以檢查res目錄下的無效資源(無法檢查assets),然後將其刪除,但是有一點要注意,如果資源文件是通過反射機制調用的,Lint是無法知道的,所以使用lint檢查出的每一個資源都需要人工進行確認,防止發生異常刪除。

4.開啓shrinkResources功能

shrinkResources標識是否去除無用的resource文件,它需要配合minifyEnable使用,同樣存在反射機制引用的問題,這種情況會被誤刪

android {
        buildTypes {
            release {
                minifyEnable true
                shrinkResources true
            }
        }
}
5.resConfigs剔除第三方庫或者SDK中的資源

第三方庫中包含的無效資源通常包含以下兩點:
1.dpi目錄,第三方庫通常會提供所有的dpi目錄以及對應的資源文件,因爲它是針對大衆使用的,而我們未必都需要,這時候需要選擇性的移除。
2.很多第三方sdk是做了國際化,而我們可能用不到,此時也需要刪除國際化資源

defaultConfig {
        。。。
        resConfigs "zh"  //表示只使用中文
        resConfigs "xxhdpi" // 表示只是用xxhdpi目錄下的資源文件
}

libs目錄瘦身

so文件最終會被打包到libs目錄中,我們針對libs目錄的瘦身主要是去除不必要的平臺ABI的so文件,例如我們只保留v7a和x86平臺的so

defaultConfig {
       ndk {
          abiFilters "armeabi-v7a","x86"
      }
}

其他的一些優化

1.不涉及透明圖層的圖片可以轉換爲jpg格式,比如歡迎頁的圖片
2.使用shape(Vector)替換圖片
3.刪除或者替換兼容包中無用的一些圖(v4.v7.v13)
4.刪除第三方aar庫中使用的大圖
5.把so文件放置在網上或者sd卡內

總結

目前我所瞭解的瘦身方法只有這些

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章