android APK瘦身處理

最近項(xiàng)目功能已經(jīng)開發(fā)完成,看到自己辛苦開發(fā)出來的app,apk盡然驚人的達(dá)到了60MB,再回頭想想自己做的app有哪些功能,心里沒點(diǎn)數(shù)嘛,最后經(jīng)過自己的一番折騰,把a(bǔ)pk大小減小到了29MB。


image.png

下面看下這篇文章大致內(nèi)容


image.png

一、分析APK文件

將自己編譯好的apk直接拖拽至Android 直接打開(apk實(shí)際上是壓縮文件,也可以將后綴改為zip,直接解壓)

apk內(nèi)部文件結(jié)構(gòu)

  • lib/:包含特定于處理器軟件層的編譯代碼。該目錄包含了每種平臺的子目錄,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。
  • res/:包含未編譯到的資源 resources.arsc,主要有圖片資源文件。
  • assets/:包含應(yīng)用可以使用AssetManager對象檢索的應(yīng)用資源。
    META-INF/:包含CERT.SF和 CERT.RSA簽名文件以及MANIFEST.MF 清單文件。
  • resources.arsc:包含已編譯的資源。該文件包含res/values/ 文件夾所有配置中的XML內(nèi)容。打包工具提取此XML內(nèi)容,將其編譯為二進(jìn)制格式,并將內(nèi)容歸檔。此內(nèi)容包括語言字符串和樣式,以及直接包含在resources.arsc文件中的內(nèi)容路徑 ,例如布局文件和圖像。
  • classes.dex:包含以Dalvik / ART虛擬機(jī)可理解的DEX文件格式編譯的類。
  • AndroidManifest.xml:包含核心Android清單文件。該文件列出應(yīng)用程序的名稱,版本,訪問權(quán)限和引用的庫文件。該文件使用Android的二進(jìn)制XML格式。

*這里發(fā)現(xiàn)導(dǎo)致apk文件大的文件主要是lib、res、classes.dex、assets、resources.arsc這5個文件,接下來我們逐個擊破。

二、瘦身處理

2.1 lib目錄處理

lib目錄

一個lib庫占了整個apk 52%的大小,打開lib目錄發(fā)現(xiàn)存在三種CPU架構(gòu)的lib庫,arm64-v8a、armeabi、armeabi-v7a。
問題1:我們真的需要這三種架構(gòu)的lib庫嗎?
解答1:大多數(shù)情況下我們可以只用兩種armeabi-v7a/ arm64-v8a (因?yàn)槭忻嫔?9%的手機(jī)的CPU架構(gòu)都是這兩種中的一種,2020年開始后面出的手機(jī)CPU幾乎都是arm64-v8a架構(gòu)的)。
解決方案: 在 app目錄下build.gradle 下修改 ndk配置,并且刪除armeabi目錄

      ndk {
            abiFilters "armeabi-v7a", "arm64-v8a" 
        }

問題2:libP2PController.so、libAMapSDK_MAP_v8_1_0.so這兩個包這么大,還有優(yōu)化空間嗎?
解答2:經(jīng)過仔細(xì)分析,libP2PController是項(xiàng)目引入IM功能加入的lib庫,而這個lib庫主要是語音、視屏通過需要用到的庫,剛好目前需求沒有語音視屏功能,所以大膽刪除庫,并在loadLibrary的時候做好tryCatch保證程序不報錯即可;
libAMapSDK_MAP_v8_1_0庫相信大家都很熟悉,大家在集成高德地圖的時候,只需要定位功能,則集成定位sdk根據(jù)需求來,不需要集成全量SDK,不然就會增加apk大小。

做完lib庫優(yōu)化后,apk大小縮小了20M,主要是刪除了armeabi(10MB)文件夾和libP2PController arm64、armeabi-v7a兩個so包約(10MB),現(xiàn)在apk是40MB。

2.2 res目錄處理

展開res目錄發(fā)現(xiàn)如下截圖

image.png

發(fā)現(xiàn)問題:

    1. 大部分是png圖,大家都是png是帶透明度的大文件圖片,相比jpg要大很多;
    1. 有個別圖片尺寸特別大,這些圖片大多是大尺寸的背景圖;

解決辦法

    1. 所有圖片可以用webp格式代替,操作如下截圖(Android Studio選中圖片單擊右鍵,選擇Convert To WebP即可);


      image.png
  • 2.大圖盡量用jpg圖片代替,并且讓UI不要設(shè)計(jì)顏色復(fù)雜度過高的圖片,比如下圖;


    image.png
  • 3.能用shape文件絕不用UI設(shè)計(jì)的圖片文件;

  • 4.一些需要拉伸的不規(guī)則圖片盡量使用.9圖;

2.3 assets文件處理

打開如下圖:結(jié)果發(fā)現(xiàn),都是第三庫攜帶的一些資源文件,這個則無需處理


image.png
2.4 resources.arsc文件處理

這個文件打不開,但知道這個文件里面是包含res/values/ 文件夾所有配置中的XML內(nèi)容,包括colors.xml,ids.xml, string.xml, styles.xml等等資源文件;
心想,這文件咋優(yōu)化呢,只需要去掉不需要使用的資源文件,包括id即可;

2.4.1去除無用資源 gradle配置
buildTypes {
        release {
            //去除無用資源
            shrinkResources true
           /開啟混淆
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
2.4.2使用lint工具掃描資源

使用Lint去除無用的資源文件,操作步驟是Analyze -> Run Inspection by Name -> 輸入框輸入 Unused resources 就可以掃描工程找到未使用的資源了


image.png

image.png

左邊掃描出來的資源文件,全選后點(diǎn)擊右邊的 Remove All Unused Resources 按鈕
image.png

2.5 classes.dex文件處理

眾所周知,dex文件是源碼編譯后的運(yùn)行字節(jié)碼文件,反編譯工具dex2Jar得到j(luò)ava源碼就是反編譯dex文件的。
那么源碼是通過以下幾點(diǎn)來優(yōu)化的:

  • 1.刪除無用的import(項(xiàng)目單機(jī)右鍵,點(diǎn)擊 Optimize Imports即可)
    image.png
  • 2.刪除無用的成員變量
  • 3.刪除無用的方法
  • 4.刪除無用的類文件
  • 5.刪除重復(fù)代碼(有些程序員喜歡copy,不善于封裝所帶來的冗余代碼)
  • 6.重命名長變量名為短而美的變量
  • 7.刪除不必要的空行
    以上6點(diǎn)可以通過 inspaction過濾unused resources,和通過阿里的Java Coding Guidelines工具掃碼出來并逐一處理即可
  • 8.代碼混淆處理(常規(guī)混淆配置即可)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容