App架構師實踐指南器之效能優化五
針對App包size,如果硬是要犧牲業務或者消耗太多時間且效果也不一定最佳,那就得不償失了,因此要學會把握這個度。
1、App包Size優化概述
1.1 瘦身目的
App包Size優化,即通過App瘦身來提高App的下載轉化率,這是具體業務運營指標,通俗一點理解就是APP包Size越小,使用者下載等待時間越短,更適應低儲存容量配置的手機,應用下載轉化率也就越高。
1.2安裝包組成
APP釋出時,最終是以安裝包的形式提供給使用者,如Android中的APK格式、iOS的IPA格式。知曉App安裝包具體由哪些內容組成,才能更好地、有針對性地進行包大小的控制和優化,如Android中體積較大的檔案一般主要集中在dex、res、assets和lib檔案,iOS中的LinkMap檔案等。
2、App包Size分析
具體優化App包Size時,需要藉助APP包Size分析工具來識別和判斷當前APP安裝包各個檔案等大小,如圖9-16所示為常見APP包Size分析工具。
2.1 Android Studio。Android Studio提供了一系列包Size分析優化工具。Analyze APK是Android Studio2.2.3開始整合的APK結構瀏覽的工具,非常便捷實用,直接將APK拖入Android Studio中即可(或者通過build--->Analyze APK匯入APK),能清晰地看出APK中具體檔案的大小,方便分析和對比。圖9-17所示為微信APK展示結果,總大小為35MB左右。
2.2 APK Size統計。除了Analyze APK可以統計APK大小外,其他還有apkcal等多款工具可以用來統計APK Size。
---apkcal是一款開源的統計APK檔案中class、method、field、string數量的工具。
---Dxcount Gradle Plugin針對的是庫大小統計,通過Gradle外掛方式引入和使用。
---NimbleDroid是美國哥倫比亞大學的博士創業團隊研發出來的自動化分析Android App效能指標系統,有靜態和動態兩種方式,其中靜態方式可以分析出APK安裝包中大檔案排行榜,各種知名SDK的大小以及佔程式碼整體的比例,各種型別檔案的大小以及佔比排行,各種知名SDK的方法數以及佔所有dex中方法數的比例等。
---ClassShark是一款APK瀏覽工具,有APK和桌面(jar)兩個版本,執行後可以清晰地看出APK具體檔案大小。
2.3資源壓縮。資源壓縮包括圖片等多媒體資源壓縮,也包括assets目錄下的字型等檔案壓縮。FontZip是一款不錯的開業字型壓縮工具,AndroidUn7Zip可以用於程式碼中對壓縮檔案解壓縮。
2.4 資源優化。
2.4.1 AndResGuard。微信團隊開源的一款減小APK大小工具,類似於java proguard,但僅對資源進行分析,不涉及具體編譯過程,通過資源混淆縮短resource.arsc內的資源路徑、資源型別名、資源名以達到瘦身的目的,例如將冗長的資源路徑名res/drawble/wechat變為r/d/a等。
2.4.2 ewswz。Facebook提供的一款針對dex位元組碼優化開源工具包,可以優化包size的同時提高位元組碼的載入效能,從而提升App速度。使用該工具需要在Linux環境下編譯其C++程式碼,涉及較多依賴庫,其優化項很多,可以自行配置。主要優化專案如下。
---減少和壓縮字串(如類路徑、原始檔路徑、函式名等),將冗長字串”/path/**/**/ClassX.java“用較短字串“1”表示,再通過重對映來反向對映還原。
---消除冗餘程式碼。刪除原始碼中一些冗餘不用的四程式碼,移除空類。
---內聯。內聯是將被調函式功能移動到其呼叫函式中,從而減少函式呼叫開銷,去除了一些多級呼叫中間層級,如func A>static func B>static func C優化成func A>static func C.
---Interdex。一種冷啟動的優化方法,需要程式提供冷啟動時載入類序列配置檔案,按此順序調整dex中類的順序,從而提升冷啟動速度。
2.5 圖片壓縮。Android打包時對PNG圖片進行的是無失真壓縮,如果沒有特定業務需求,可以對PNG圖片進行有失真壓縮以實現瘦身目的。圖片壓縮相關工具主要有TinyPNG、pngquant、ImageOptim、mozjpeg等,支援的圖片格式略有不同,例如最常見的TinyPNG支援PNG/JPEG圖片進行有失真壓縮,一張4MB的圖片,一般可以縮小15%左右的大小。
3、App包Size優化
Android APK由以下幾部分組成,分別為classes.dex、resources.arsc、res、assets、lib及其他資源(AandroidMainfest、project.properties、proguard.cfg和META-INF)。
3.1 classes.dex原始碼
---程式碼混淆。在build.gradle中開啟minifyEnable,進行Proguard混淆。
---刪除無用程式碼。使用Android Studio的Inspect Code和Code Cleanup進行靜態程式碼檢查,刪掉無用程式碼。
---第三方庫/jar包。刪除無用庫,合併功能重複的庫,選擇更小的庫。
---程式碼優化。
3.2 resources.arsc。resource.arsc存放的是編譯後的二進位制檔案,以id-name-value方式儲存map。
---使用Android Studio的Inspect Code刪掉不必要的資源ID.
---使用Google的android-arscblamer工具檢查刪除不必要的資源對映,如部分空引用。
3.3res。該資料夾是包Size優化大戶,存放諸如音視訊、圖片等多媒體資源。
3.3.1刪除無用資源。
---在build.gradle中開啟shrinkResource,不打包未使用的資源。
---在build.gradle中通過resConfigs配置業務所需的語言資源,去除無用語言資源。
---藉助Android Studio分析Unused Resources,去掉無用res,有多種方式。
(1)使用Analyze。專案右鍵-->Analyze-->Run Inspection by Name-->輸入Unused Resources。
(2)使用Refactor。專案右鍵-->Refactor-->Remove Unused Resource.
(3)使用Inspect Code。Analyze-->Inspect Code。
3.3.2適當使用圖片壓縮。
---使用圖9-16中圖片壓縮相關工具對圖片進行有失真壓縮。
---不考慮透明度業務下可以用JPG圖片代替PNG圖片,例如背景頁、啟動頁等。
---嘗試使用WebP格式代替PNG格式,但注意必須是Android 4.0以上系統。若要相容Android4.0以下系統,需要引入額外的相容庫,可能得不償失,且目前Android Studio並不支援WebP佈局檔案的預覽。
---對大大圖片資源進行壓縮處理,儘可能只儲存一份圖片資源(建議放xhdpi資料夾)
---關於圖片格式的選擇,Google官方建議為:使用VectorDrawable;純色類icon用SVG;兩種顏色以上icon用WebP,達不到效果再考慮PNG;圖片無alpha通道考慮JPG.
3.3.3 適當使用音視訊壓縮。採用有損格式(Ogg、MP3、AAC、WMA、Opus等)音訊檔案代替無損格式(WAV、PCM、ALS、TAC、APE等)音訊檔案。推薦使用Ogg,淘寶就大量使用了Ogg格式。
3.3.4 資源混淆。整合AndResGuard等工具對資源進行優化處理。
3.3.5程式碼優化。使用Drawable XML、Color、.9.PNG代替PNG圖片,例如漸變背景、純色背景等;使用tintcolor(Android 5.0+)實現按鈕反選效果代替正反兩張圖片;使用toolbar,減少menu檔案;統一應用風格,減少shape數量等。
3.4assets檔案
---利用FontZip等工具對字型進行提取優化,刪除無用字型。
---減少icon-font使用,使用svg代替icon-font。
---考慮對資原始檔進行壓縮儲存,程式碼中進行解壓縮獲取,例如H5頁面。
3.5 lib庫檔案。
---在build.gradle中使用abiFilters按需配置CPU架構(如armeabi-v7a、x86、armeabi、x86-64等),移除不需要相容的so檔案。
---使用更小的庫或合併現有庫(如C++執行時庫統一使用stlport_shared).