性能優化-安裝包大小優化

安裝包大小優化

安裝包大小對應用的使用沒什麼影響,但提高來用戶的下載門檻。減少安裝包大小用戶更願意下載和體驗。減少安裝包大小之前先了解安裝包(APK文件)的構成。

應用裝包的構成

APK是一個壓縮文件,包含Android應用程序的所有內容,是Android平臺用於安裝應用程序的文件。

  1. assets

assets目錄可以根據應用需求存放任何文件夾架構,如配置文件、資源文件,這些文件的內容可通過AssetManager類獲得。和res的不同點在於,res目錄下的文件會在.R文件中生成對應的資源ID,assets不會自動生成對應的ID,而是通過AssetManager類的接口獲取。

  1. lib

存放應用程序依賴的用C/C++編寫的native庫文件。

  1. res

這個目錄存放資源文件,在這個文件夾下的所有文件都會生成對應的ID映射到Android工程的.R文件中。

  1. META-INF

保存應用的簽名信息,簽名信息可以驗證APK文件的完整性。

  1. AndroidManifest.xml

是用來描述Android應用“整體資訊”的設定文件,文件名是固定的不能修改。

  1. classes.dex

Java可執行程序,需要先把Java文件編譯成class文件,字節碼都保存在class文件中,Android虛擬機把Java字節碼轉爲Dalvik字節碼。

  1. proguard.cfg

代碼混淆配置文件

  1. 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應用性能優化最佳實踐》

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