歡迎關注專欄:裡面定期分享Android架構技術知識點及解析,還會不斷更新的BATJ面試專題,歡迎大家前來探討交流,如有好的文章也歡迎投稿。
公司項目在不斷的改版迭代中,代碼在不斷的累加,終於apk包不負重負了,已經到了八十多M了。可能要換種方式表達,到目前為止沒有正真的往外推過,一直在內部執行7天討論需求,5天代碼實現的階段。你在寫上個版本的內容,好了,下個版本的更新內容已經定稿了。基於這種快速開發的現狀,我們app優化前已經有87.1M了,包大了,運營說這樣轉化不高,只能好好搞一下咯。優化過後包大小為23.1M(優化了73%,不要說我標題黨)。好了好了,我要闡述我的apk超級無敵魔鬼瘦身之心得了。
目錄如下圖:
文章主要內容從理論出發,再做實際操作。分為下面幾個方面:1.結構分析2.具體實操3.總結
文章主要內容從理論出發,再做實際操作。分為下面幾個方面:
首先上傳一張瘦身前通過Analyze app分析出來的圖片(打開方式:Android Studio下 ——> Build——> Analyze app):
1. lib/:包含特定於處理器軟體層的編譯代碼。該目錄包含了每種平台的子目錄,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多數情況下我們可以只用一種armeabi-v7a,後面會講到原因。
6. classes.dex:包含以Dalvik / ART虛擬機可理解的DEX文件格式編譯的類。
通過分析圖可以知道,目前app主要是so文件佔比比較大,佔了31.7M,佔了整個應用是38.2%。其次是assets目錄,整個目錄佔了32M,第三就是資源文件res目錄了。所以接下來我們處理步驟就是按這個順序來處理。(簡單說下圖中的Raw File Size(磁碟解壓後的大小)和DownLoad Size(從應用商店下載的大小),如果想了解更多關於Analyaer分析的知識,可以參考這篇文章使用APK Analyzer分析你的APK),分析了包結構組成之後,我們可以開始瘦身操作了。
1. 修改lib配置:
ndk { //設置支持的so庫架構 abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi" }
最後我的修改代碼如下:
ndk { //設置支持的so庫架構 abiFilters "armeabi-v7a" }
接下來說明這麼做的依據:
而許多基於 x86 的設備也可運行 armeabi-v7a 和 armeabi NDK 二進位文件。對於這些設備,主要 ABI 將是 x86,輔助 ABI 是 armeabi-v7a。
好了,我們再打一次包試試。
確實有點震驚,一下子包小了這麼多,從87.1M到51.9M,容我好好算算少了多少M.趕快讓測試幫忙測一下。基於之前的理論知識,心裡還是有點底。果然,測試效果和之前是一樣的。心裡的石頭先落下羅。
2. 重新編譯so文件,用更小的庫代替
這裡說下,因為項目中有使用到ffmpeg庫,之前導入的第三方的放在assets文件夾下,重寫編寫後的so庫文件放在lib文件夾下,所以lib文件夾反而大了。從51.9M到35.6M,效果還是蠻不錯的。
對了,別問我為什麼assets文件夾下為什麼還有12.6M資源,因為很多.mp3都是第三方的人臉識別必備配置文件,我也很無奈。
1. 手動lint檢查,手動刪除無用資源
2. 使用tinypng等圖片壓縮工具對圖片進行壓縮。
打開網址,將大圖片導入到tinypng,替換之前的圖片資源。
3. 大部分圖片使用Webp格式代替。
可以給UI提要求,讓他們將圖片資源設置為Webp格式,這樣的話圖片資源會小很多。如果想了解更多關於webp,請點擊這裡webp,當然,如果對圖片顏色通道要求不高,可以考慮轉jpg,最好用webp,因為效果更佳。
4. 盡量不要在項目中使用幀動畫
一個幀動畫幾十張圖片,再怎麼壓縮都還是占很大內存比重的。所以建議是讓UI去搞,這裡可以參考使用lottie-android,如果項目中動畫效果多的話效果更加明顯。當然這就要辛苦我們UI設計師大大了。
5. 使用gradle開啟shrinkResources
移除無用資源文件,下面是我的配置:
buildTypes { release { // 不顯示Log buildConfigField "boolean", "LOG_DEBUG", "false" //混淆 minifyEnabled true // 移除無用的resource文件 shrinkResources true proguardFiles getDefaultProguardFile(proguard-android.txt), proguard-rules.pro signingConfig signingConfigs.release } }
通過上述步驟操作,apk效果如下:
classes.dex中包含了所有的java代碼,當你打包時,gradle會將所有模板力的.class文件轉換成classes.dex文件,當然,如果方法數超過64K,將要新增其他文件進行存儲。可以通過multidexing分多個文件,比如我這裡的chasses2.dex。換句話說,就是減少代碼量。我們可以通過以下方法來實現:
關於classes.dex文件大小分析可以參考這篇譯文使用 APK Analyzer 分析你的 APK
好了,說道這裡基本上就結束了,apk包從87.1M減小到了23.1M(優化了73%,不要說我標題黨)已經差不多了,關於第四部其他部分的優化我是沒有進行再操作的。因為公司運營覺得二三十M的包比較真實,太小了就太假了。所以我暫時就不進行優化了。如果再上面提到的部分通過所有將所有非啟動頁面首頁之外的所有資源,so庫放服務端,理論上apk包大小能在10M以內這樣子。當然我們有做到就不多加評價了。最後,如果對插件化開發感興趣的話可以參考下這篇文章Android全面插件化方案-RePlugin踩坑。最後,如果你在Android上有什麼疑問,可以添加我合作的一個QQ群在裡面和我一塊交流,裡面還有許多技術大佬。
如果你看到了這裡,覺得文章寫得不錯就給個讚唄?如果你覺得那裡值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。
最後針對Android程序員,我這邊給大家整理了一些資料,包括不限於高級UI、性能優化、移動架構師、NDK、混合式開發(ReactNative+Weex)微信小程序、Flutter等全方面的Android進階實踐技術;希望能幫助到大家,也節省大家在網上搜索資料的時間來學習,也可以分享動態給身邊好友一起學習!
Android架構進階必備學習資源免費領取(架構視頻+面試專題文檔+學習筆記)?shimo.im
推薦閱讀:
TAG:Android | Android開發 | Apk |