Android性能優化之APK瘦身詳解(瘦身73%)

2021-02-14 秦子帥

前言

公司項目在不斷的改版迭代中,代碼在不斷的累加,終於apk包不負重負了,已經到了八十多M了。可能要換種方式表達,到目前為止沒有正真的往外推過,一直在內部執行7天討論需求,5天代碼實現的階段。你在寫上個版本的內容,好了,下個版本的更新內容已經定稿了。基於這種快速開發的現狀,我們app優化前已經有87.1M了,包大了,運營說這樣轉化不高,只能好好搞一下咯。優化過後包大小為23.1M(優化了73%,不要說我標題黨)。好了好了,我要闡述我的apk超級無敵魔鬼瘦身之心得了。


文章主要內容從理論出發,再做實際操作。分為下面幾個方面:1. 結構分析, 2.具體實操 3. 總結 4. 參考資料

1. 結構分析

首先上傳一張瘦身前通過Analyze app分析出來的圖片(打開方式:Android Studio下 ——> Build——> Analyze app):

APK包結構如下:

1. lib/:包含特定於處理器軟體層的編譯代碼。該目錄包含了每種平臺的子目錄,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多數情況下我們可以只用一種armeabi-v7a,後面會講到原因。

2. assets/:包含應用可以使用AssetManager對象檢索的應用資源。

3. res/:包含未編譯到的資源 resources.arsc,主要有圖片資源文件。

4. META-INF/:包含CERT.SF和 CERT.RSA籤名文件以及MANIFEST.MF 清單文件。

5. resources.arsc:包含已編譯的資源。該文件包含res/values/ 文件夾所有配置中的XML內容。打包工具提取此XML內容,將其編譯為二進位格式,並將內容歸檔。此內容包括語言字符串和樣式,以及直接包含在resources.arsc文件中的內容路徑 ,例如布局文件和圖像。

6. classes.dex:包含以Dalvik / ART虛擬機可理解的DEX文件格式編譯的類。

7. AndroidManifest.xml:包含核心Android清單文件。該文件列出應用程式的名稱,版本,訪問權限和引用的庫文件。該文件使用Android的二進位XML格式。

通過分析圖可以知道,目前app主要是so文件佔比比較大,佔了31.7M,佔了整個應用是38.2%。其次是assets目錄,整個目錄佔了32M,第三就是資源文件res目錄了。所以接下來我們處理步驟就是按這個順序來處理。(簡單說下圖中的Raw File Size(磁碟解壓後的大小)和DownLoad Size(從應用商店下載的大小),如果想了解更多關於Analyaer分析的知識,可以參考這篇文章使用APK Analyzer分析你的APK),分析了包結構組成之後,我們可以開始瘦身操作了。

二.具體實操1. 對lib目錄下的文件進行瘦身處理(1). 修改lib配置:

參考資料
so文件的優化:通常我們在使用NDK開發的時候,我們經常會有如下這麼一段代碼:

ndk {
           //設置支持的so庫架構
           abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"
       }

最後我的修改代碼如下:

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麼?

好了,我們再打一次包試試。

確實有點震驚,一下子包小了這麼多,從87.1M到51.9M,容我好好算算少了多少M.趕快讓測試幫忙測一下。基於之前的理論知識,心裡還是有點底。果然,測試效果和之前是一樣的。心裡的石頭先落下羅。

(2). 重新編譯so文件,用更小的庫代替

相信很多開發者都有這種苦惱,很多第三方我們導入進來只用到其中很小一部分功能,大部分功能都是我們用不上的。這時候我們找到原始碼,將我們需要的那部分代碼提取出來,重新編譯成新的so文件,再導入到我們項目中。當然,如果之前沒有編譯過so文件,這部分建議做最後的優化去處理。不然你會遇到很多問題。上一波處理後的效果圖:

這裡說下,因為項目中有使用到ffmpeg庫,之前導入的第三方的放在assets文件夾下,重寫編寫後的so庫文件放在lib文件夾下,所以lib文件夾反而大了。從51.9M到35.6M,效果還是蠻不錯的。

對了,別問我為什麼assets文件夾下為什麼還有12.6M資源,因為很多.mp3都是第三方的人臉識別必備配置文件,我也很無奈。

2. 優化res,assets文件大小(1). 手動lint檢查,手動刪除無用資源

在Android Studio中打開「Analyze」 然後選擇"Inspect Code…",範圍選擇整個項目,然後點擊"OK"。配置如下:

(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效果如下:

又優化了將近5M,別問我為什麼還有7.5M,裡面大量的gif和webp格式的動圖,都是UI丟給我的,一個2.7M.後面再慢慢和他細究這個問題。後面要做的兩部分,一部分是將資源文件下的所有gif圖放後臺下載處理,第二個是和UI討論下如何減小webp 動圖的大小(我看其他平臺只有100K的樣子,給我的就2.7M?)。

3. 減少chasses.dex大小

classes.dex中包含了所有的java代碼,當你打包時,gradle會將所有模板力的.class文件轉換成classes.dex文件,當然,如果方法數超過64K,將要新增其他文件進行存儲。可以通過multidexing分多個文件,比如我這裡的chasses2.dex。換句話說,就是減少代碼量。我們可以通過以下方法來實現:

1.儘量減少第三方庫的引用,這個在上面我們已經做過優化了。

2. 避免使用枚舉,這裡特別去網上查了一下,具體可以參考下這篇文章Android 中的 Enum 到底佔多少內存?該如何用?,得出的結論是,可能幾十個枚舉的內存佔有量才相當一張圖片這樣子,優化效果也不會特別明顯。當然,如果你是個追求極致的人,我不反對你用靜態常量替代枚舉。

3. 如果你的dex文件太大,檢查是否引入了重複功能的第三方庫(圖片加載庫,glide,picasso,fresco,image_loader,如果不是你一個人單獨開發完成的很容易出現這種情況),儘量做到一個功能點一個庫解決。

關於classes.dex文件大小分析可以參考這篇譯文使用 APK Analyzer 分析你的 APK

4. 其他1. 刪除無用的語7zip代替2. 刪除翻譯資源,只保留中英文3. 嘗試將andorid support庫徹底踢出你的項目。4. 嘗試使用動態加載so庫文件,插件化開發。5. 將大資源文件放到服務端,啟動後自動下載使用。三. 總結

好了,說道這裡基本上就結束了,apk包從87.1M減小到了23.1M(優化了73%,不要說我標題黨)已經差不多了,關於第四部其他部分的優化我是沒有進行再操作的。因為公司運營覺得二三十M的包比較真實,太小了就太假了。所以我暫時就不進行優化了。如果再上面提到的部分通過所有將所有非啟動頁面首頁之外的所有資源,so庫放服務端,理論上apk包大小能在10M以內這樣子。當然我們有做到就不多加評價了。最後,如果對插件化開發感興趣的話可以參考下這篇文章Android全面插件化方案-RePlugin踩坑。最後,如果你在Android上有什麼疑問,可以添加我的同名微信公眾號aserbao和我一塊交流。

文章本來是周三的差不多的,到今天才發,還是有點小偷懶了。最後祝大家五一快樂,出門玩的開心。如果你看到了這裡,覺得文章寫得不錯就給個讚唄?如果你覺得那裡值得改進的,請給我留言。一定會認真查詢,修正不足。謝謝。

— 【 THE END 】—

推薦我的微信號



加微信送Android,Java,Python資料,交流學習

我的視頻號,已經錄製了幾十期,有工具推薦,有教育知識、副業賺錢但都是原創用心輸出。

相關焦點

  • Android APK 瘦身實踐
    開始魔鬼瘦身1. tinypng有損壓縮android打包本身會對png進行無損壓縮,不信大家可以看看apk中的圖片的大小實際上比你代碼工程裡的圖片要小(針對沒進行過無損壓縮的那些png圖)。如果這方面能減小的話,apk瘦身的效果必然又會上一個檔次。這種情況下的apk的減小是不可估量的。5. 覆蓋aar裡的一些默認的大圖一些aar庫裡面包含根本就沒有用的圖。最典型的是support-v4兼容庫中包含一些「可能」用到的圖片,實際上在你的app中不會用到。
  • 那些 Android 程式設計師必會的視圖優化策略
    2.3.1.2 移除控制項中不需要的背景下面先來看個例子,根布局LinearLayout設置了一個背景,然後它的子控制項3個TextView中有兩個設置了同樣的背景,布局如下所示:<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              android
  • 神操作 之 「玲瓏寶塔」優化 Apk 包大小
    對於圖片優化,主要分為以下幾點:套圖的優化 -SVG套圖的優化 - Thit 著色器的應用webp 的使用2.1 套圖的優化 - SVG什麼是套圖呢?好比應用中的某個 Icon,一般來講,UI 都會為我們提供 n 套圖,以便於我們適配不同解析度記性,大概的目錄如下:
  • Android籤名機制之---籤名驗證過程詳解
    一、前言今天是元旦,也是Single Dog的嚎叫之日,只能寫博客來祛除寂寞了,今天我們繼續來看一下
  • 播放內核的「瘦身」,你只需要這樣做!
    4)去除解復用線程和二級緩存線程內核獲取數據一直是邏輯最臃腫的地方,優化前有5個線程來實現這部分功能。優化後保留3個即可,解復用線程和二級緩存線程可以去除。4)omx同步調用改成異步,減少解碼cpu耗時android平臺上,硬解omx模塊默認用的是同步調用模式。android9.0以下native層只提供了這種模式,會循環的進行queue/dequeue操作,cpu消耗較大。
  • 穩妥瘦身 科學強體
    □潘煥友    今年以來,諸城經濟開發區深入貫徹落實上級黨委、政府關於開發區體制機制改革創新工作的決策部署,盯緊開發區改革創新、實現高質量發展的目標任務,強力推動各項改革任務落地實施,堅持以改革促發展,實現「穩妥瘦身、科學強體」。
  • 微信 v8.0.0 for Android 官方正式版
    - 浮窗管理器界面,現在以縮略卡片的形式展現- 最多可以同時收納五篇公眾號文章到懸浮界面- 新版本的浮窗只能通過微信的聊天主頁面打開- 朋友圈分享卡片的優化,發廣告將合併為一條- 新增好友時現在需要設置權限,之前是默認的- 紅包裡面可藏一個視頻、群收款頁面微調等- 視頻號點讚可以隱藏,新增私密贊- 朋友圈好友狀態封面展示- 加好友數量上限提至
  • 《瘦身男女》第八周:黃麗華瘦身成果「驚豔」
    而到了第八周,也就是9月19日晚22:10分播出的《瘦身男女》中,選手和教練們終於迎來了訓練以來的第一次大放鬆,選手集體前往呀諾達雨林文化旅遊區,在這個美山美水的地方,他們有的立馬將周末的稱重拋之腦外,有的則一邊完成節目組安排的競技比賽,一邊自主進行鍛鍊……海南呀諾達之行結束之後,本周僅僅減重1斤的黃麗華慘遭淘汰,提前終止了她的「瘦身男女」之路!
  • 瘦身貼真的能瘦身嗎
    愛美的女性朋友忍受不了身上多餘的一點脂肪,減肥貼的流行讓很多不愛運動的女性備受喜愛,那麼,瘦身貼真的能瘦身嗎? 當下苗條纖細的身材曲線是每個人的追求,而減肥也幾乎是所有女性的永恆話題。愛美的女性朋友忍受不了身上多餘的一點脂肪,減肥貼的流行讓很多不愛運動的女性備受喜愛,那麼,瘦身貼真的能瘦身嗎?
  • Google官方 詳解 Android 性能優化【史詩巨著之內存篇】
    明雲(張明雲),知乎專欄上寫了一系列的性能優化,都相當實用,open dev也會定期送上乾貨,不定期匯總推薦當下優秀文章)今天來看下楊超凡授權本公眾號的Google官方的性能優化一些優化建議:點擊閱讀原文,可查看楊超凡的原文:http://blog.csdn.net/chivalrousman/article/details/51553114,話不多說,看下正文。
  • 怎麼瘦身減肥快 如何減肥瘦身最行之有效
    核心提示:其實生活中很多人都在非常努力地減肥瘦身,但是最後不知道是因為方法不得當還是因為自己缺乏堅持下去的信心,從而導致減肥的效果並不明顯。其實減肥瘦身並不是一件容易的事情,但是只要掌握了方法,效果自然也不需要擔心的。
  • 科學瘦身減肥法有哪些 ?這樣瘦身最靠譜
    很多人為了減肥瘦身會選擇各種各樣不同的方法,其中像節食不吃飯、吃減肥藥、抽脂、吃中藥、拔罐......一系列的減肥方法都有不少的人在嘗試,但是一定要注意很多方法不僅影響減肥的效果,同時也有可能會傷害身體健康,因此一定要科學選擇。那科學瘦身減肥法有哪些?怎麼減肥瘦身最靠譜?下面我們一起來詳細了解一下!
  • Android性能優化-過渡繪製解決方案
    需要進行優化。1. 去除Activity自帶的默認背景顏色: 查看Android源碼裡的Theme主題,如下:我們只要在自己的AppTheme裡面去除該背景色即可:<style name="AppTheme" parent="android:Theme.Light.NoTitleBar">    <
  • 瘦身產品哪個最好 怎麼減肥瘦身安全有效
    關於減肥,其實有非常多的方法,其中很多人可能會依賴瘦身產品來幫助減肥瘦身。 當今社會越來越多的人被肥胖的問題所困擾著,體型不佳、健康問題頻發,越來越引起人們對肥胖問題的關注,而減肥自然也成為了勢在必行。關於減肥,其實有非常多的方法,其中很多人可能會依賴瘦身產品來幫助減肥瘦身。那瘦身產品哪個最好?怎麼減肥瘦身安全有效?
  • 這幾式瑜伽瘦身動作十分經典,堅持練習,塑造優雅性感的小蠻腰
    【文章導讀】這幾式瑜伽瘦身動作十分經典,堅持練習,塑造優雅性感的小蠻腰!    沒有人能否認我們的努力,如果你對自己的身材不滿意,那就從現在開始行動起來,堅持這幾式經典的瑜伽瘦身動作,燃燒腰腹部的頑固脂肪,減去腰間堆積的贅肉,越是堅持練習,你的腰身就會越纖細,最終塑造出纖細性感的小蠻腰,還等什麼趕快開始練習吧
  • Android View 動畫
    ><layoutAnimation xmlns:android="http://schemas.android.com/apk/res/android"    android:animation="@anim/anim_file"    android:animationOrder="normal"    android:delay="0.5">
  • 瘦身霜真的管用嗎 瘦身霜可能會出現哪些副作用
    其中,各種纖體霜、瘦身霜、瘦腿霜、減肥精油最為誘人。只需要塗塗抹抹,就可以想瘦哪裡瘦哪裡,恢復完美身材。 隨著天氣一天天變熱,各種減肥廣告又開始鋪天蓋地的宣傳。其中,各種纖體霜、瘦身霜、瘦腿霜、減肥精油最為誘人。只需要塗塗抹抹,就可以想瘦哪裡瘦哪裡,恢復完美身材。那瘦身霜真的管用嗎?瘦身霜可能會出現哪些副作用?
  • 從Google Play直接下載APK文件
    習慣從谷歌GooglePlay上下載安卓軟體或遊戲的安卓用戶都知道,無論在電腦端或者手機端的GooglePlay都無法下載得到軟體的apk格式源文件。這樣使得不少安卓用戶不得不轉移到其他第三方的安卓應用市場,通常第三方安卓軟體市場的軟體質量無法保證,惡意扣費盜竊隱私的事情不是頭一天發生的。
  • Android-Automotive之源碼編譯過中APK是如何打包和籤名的
    這個特別說明一下JAVA和SIGNAPK_JAR的值:JAVA的值為prebuilts/jdk/jdk9/linux-x86/bin/java,SIGNAPK_JAR為out/host/linux-x86/framework/signapk.jar,這個變量是需要我們實際關注的,apk具體籤名的邏輯都是在這裡面,要想進行客制化,重點在此。
  • 瘦身午餐怎麼安排 瘦身的午餐食譜有哪些
    那 瘦身午餐怎麼安排?瘦身的午餐食譜有哪些?下面我們一起來詳細了解一下! 瘦身午餐怎麼安排?(1)雜糧飯雜糧的組織均含有較多的膳食纖維素,能夠促進腸蠕動,讓大便通暢,幫助體內毒素排出體外,對減肥非常有利,常吃不發胖還能幫你快速瘦身。因此說到瘦身午餐怎麼安排這個問題,看來用雜糧飯代替精米飯,是很不錯的一個選擇。