公司項目在不斷的改版迭代中,代碼在不斷的累加,終於apk包不負重負了,已經到了八十多M了。可能要換種方式表達,到目前爲止沒有正真的往外推過,一直在內部執行7天討論需求,5天代碼實現的階段。你在寫上個版本的內容,好了,下個版本的更新內容已經定稿了。基於這種快速開發的現狀,咱們app優化前已經有87.1M了,包大了,運營說這樣轉化不高,只能好好搞一下咯。優化事後包大小爲23.1M(優化了73%,不要說我標題黨)。好了好了,我要闡述個人apk超級無敵魔鬼瘦身之心得了。html
目錄以下: java
文章主要內容從理論出發,再作實際操做。分爲下面幾個方面:1. 結構分析, 2.具體實操 3. 總結 4. 參考資料android
首先上傳一張瘦身前經過Analyze app分析出來的圖片(打開方式:Android Studio下 ——> Build——> Analyze app):git
APK包結構以下:github
經過分析圖能夠知道,目前app主要是so文件佔比比較大,佔了31.7M,佔了整個應用是38.2%。其次是assets目錄,整個目錄佔了32M,第三就是資源文件res目錄了。因此接下來咱們處理步驟就是按這個順序來處理。(簡單說下圖中的Raw File Size(磁盤解壓後的大小)和DownLoad Size(從應用商店下載的大小),若是想了解更多關於Analyaer分析的知識,能夠參考這篇文章使用APK Analyzer分析你的APK),分析了包結構組成以後,咱們能夠開始瘦身操做了。web
參考資料 so文件的優化:一般咱們在使用NDK開發的時候,咱們常常會有以下這麼一段代碼:性能優化
ndk {
//設置支持的so庫架構
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"
}
複製代碼
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xNDtH3zt-1571353784450)(upload-images.jianshu.io/upload_imag…)]bash
最後個人修改代碼以下:微信
ndk {
//設置支持的so庫架構
abiFilters "armeabi-v7a"
}
複製代碼
接下來講明這麼作的依據: 看上面圖分析,armeabi-v7主要不支持ARMv5(1998年誕生)和ARMv6(2001年誕生).目前這兩款處理器的手機設備基本不在我公司的適配範圍(市場佔比太少)。 而許多基於 x86 的設備也可運行 armeabi-v7a 和 armeabi NDK 二進制文件。對於這些設備,主要 ABI 將是 x86,輔助 ABI 是 armeabi-v7a。 最後總結一點:若是適配版本高於4.1版本,能夠直接像我上面這樣寫,固然,若是armeabi-v7a不是設備主要ABI,那麼會在性能上形成必定的影響。 參考文章:安卓app打包的時候還須要兼容armeabi麼?架構
好了,咱們再打一次包試試。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Xv3lhgYo-1571353784451)(upload-images.jianshu.io/upload_imag…)] 確實有點震驚,一會兒包小了這麼多,從87.1M到51.9M,容我好好算算少了多少M.趕快讓測試幫忙測一下。基於以前的理論知識,內心仍是有點底。果真,測試效果和以前是同樣的。內心的石頭先落下羅。
相信不少開發者都有這種苦惱,不少第三方咱們導入進來只用到其中很小一部分功能,大部分功能都是咱們用不上的。這時候咱們找到源代碼,將咱們須要的那部分代碼提取出來,從新編譯成新的so文件,再導入到咱們項目中。固然,若是以前沒有編譯過so文件,這部分建議作最後的優化去處理。否則你會遇到不少問題。上一波處理後的效果圖:
這裏說下,由於項目中有使用到ffmpeg庫,以前導入的第三方的放在assets文件夾下,重寫編寫後的so庫文件放在lib文件夾下,因此lib文件夾反而大了。從51.9M到35.6M,效果仍是蠻不錯的。對了,別問我爲何assets文件夾下爲何還有12.6M資源,由於不少.mp3都是第三方的人臉識別必備配置文件,我也很無奈。
在Android Studio中打開「Analyze」 而後選擇"Inspect Code...",範圍選擇整個項目,而後點擊"OK"。配置以下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-aczX7vG1-1571353784454)(upload-images.jianshu.io/upload_imag…)]
打開網址,將大圖片導入到tinypng,替換以前的圖片資源。
能夠給UI提要求,讓他們將圖片資源設置爲Webp格式,這樣的話圖片資源會小不少。若是想了解更多關於webp,請點擊這裏webp,固然,若是對圖片顏色通道要求不高,能夠考慮轉jpg,最好用webp,由於效果更佳。
一個幀動畫幾十張圖片,再怎麼壓縮都仍是佔很大內存比重的。因此建議是讓UI去搞,這裏能夠參考使用lottie-android,若是項目中動畫效果多的話效果更加明顯。固然這就要辛苦咱們UI設計師大大了。
移除無用資源文件,下面是個人配置:
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效果以下:
又優化了將近5M,別問我爲何還有7.5M,裏面大量的gif和webp格式的動圖,都是UI丟給個人,一個2.7M.後面再慢慢和他細究這個問題。後面要作的兩部分,一部分是將資源文件下的全部gif圖放後臺下載處理,第二個是和UI討論下如何減少webp 動圖的大小(我看其餘平臺只有100K的樣子,給個人就2.7M?)。
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上有什麼疑問,能夠添加個人同名微信公衆號「aserbaocool」和我一塊交流。
文章原本是週三的差很少的,到今天才發,仍是有點小偷懶了。最後祝你們五一快樂,出門玩的開心。若是你看到了這裏,以爲文章寫得不錯就給個讚唄?若是你以爲那裏值得改進的,請給我留言。必定會認真查詢,修正不足。謝謝。文章主要參考文章以下,文章有少部分文字參考了下面文章中的語句。若是有侵犯到做者權益,請和我聯繫,查實後立刻刪除。