Apk不得不看的瘦身大全

概述

我日常在項目開發中,剛開始的APK包可能不太大,可是隨着時間的變遷,項目的迭代,慢慢的就回發現打出來的APK包愈來愈大,包每大一點可能用戶下載的慾望就小一些,因此在日常的項目迭代過程當中,對APK瘦身的工做也要持續進行,這篇文章就會記錄一下從幾個方面對apk進行瘦身java

APK構成初探

咱們生成一個包,把包拖到Android studio中就能夠看到包的構成了android

apk的構成如上圖,下面具體看下各個部分都是什麼git

  • lib 主要存放針對各個cpu架構的so庫
  • classes.dex 是java文件編譯生成的字節碼文件
  • res 存放資源文件 (圖片,佈局等等)
  • META-INF 相關簽名信息
  • AndroidManifest.xml 配置文件
  • resources.arsc 是資源文件的映射表 資源id和具體資源的路徑信息 ,Strings信息直接存在裏面

apk的構成咱們已經有了初步的瞭解,接下來咱們就能夠對apk進行瘦身優化了github

優化方案

1.使用minifyEnabled混淆代碼

android {
buildTypes {
    release {
        minifyEnabled true
    }
}
}
複製代碼

在proguard-rules.pro編寫混淆規則web

2.使用shrinkResources 移除無用資源

android {
buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
    }
}
}
複製代碼

shrinkResources和minifyEnabled必須同時開啓纔有效api

特別注意:這裏須要強調一點的是開啓以後無用的資源或者圖片並無真正的移除掉,而是用了一個同名的佔位符號,咱們拿圖片舉例來看一下

(圖一)

(圖二)微信

如上面兩張圖所示,best.png圖片並無使用到,大小爲3.3K,屬於無用資源 ,在開啓 shrinkResources以後,發現best.png確實打包進apk中了,但大小變成了67B,具體內容是個小黑塊的佔位符架構

3.刪除項目中未使用到的資源文件

咱們經過Android studio提供的lint工具去排查沒有使用到的資源文件,而後讓無用的資源文件刪除掉 經過Analyze - Run Inspection By Name... 選項 ,而後輸入 unused resources來查找無用的資源文件工具

如上圖所示無用的資源文件就找到了就能夠對其進行刪除佈局

4.刪除項目中未使用到的代碼

咱們經過Android studio提供的lint工具去排查沒有使用到的代碼,而後讓無用的代碼刪除掉 經過Analyze - Run Inspection By Name... 選項 ,而後輸入 unused declaration來查找無用的代碼

如上圖所示無用的代碼就找到了就能夠對其進行刪除

特別注意:經過反射引用的方法或者類,lint是識別不了的,也會給檢查出來,因此在刪除的時候要特別注意,經過的反射引用的方法或者類千萬不能刪除

5.對圖片進行壓縮

能夠經過如下幾種方式就圖片進行壓縮

  • png圖片格式轉換成jpg 將一些大圖的格式轉成jpg格式,將會有效減少圖片的體積
  • 經過tinypng網站對圖片進行壓縮
  • 使用vector矢量圖
  • 將圖片轉換成webP格式的 (右鍵圖片-Conver To webP 進行轉換特別注意:webP格式要求最低的api是18 轉換以後圖片會小不少,以下圖所示)

6.使用shape代替圖片

不少點擊效果或者背景圖可能會使用到圖片,能夠換成shape進行代替實現,可以有效的減小apk大小

7.使用resConfigs進行語言配置

Android應用自己是支持國際化的,但國內的項目好多都是在國內使用,不須要國際化,這時候能夠對相關的String進行減法操做,使其只包含特定的語言(例如中文)

android {
defaultConfig {
    ...
    //語言資源,只支持中文
    resConfigs "zh-rCN"
}
}
複製代碼

如上圖所示經過resConfigs配置,打包進apk的語言就只有中文了

8.使用AndResGuard對資源進行混淆

使用微信大神張紹文的AndResGuard工具對項目的資源文件進行混淆,在壓縮apk大小的同時,提高了反破解難度

具體的源碼和使用方法以下 [github.com/shwenzhang/…]

9. so庫操做

咱們在引入第三方sdk時,有不少sdk都有對應的so庫,且給到的so庫分好多架構(armeabi,armeabi-v7a,x86等等)

Android系統目前支持如下七種不一樣的CPU架構:ARMv5,ARMv7 (從2010年起),x86 (從2011年起),MIPS (從2012年起),ARMv8,MIPS64和x86_64 (從2014年起)

全部的架構設備x8六、x866四、armeabi-v7a、arm64-v8a都支持armeabi架構的.so文件,因此咱們能夠根據本身的業務需求選擇使用armeabi或者armeabi-v7a進行支持

好比 微信,QQ ,網易雲音樂等不少大的應用就只保留了armeabi-v7a

android {
defaultConfig {
    ndk {
        abiFilters 'armeabi','armeabi-v7a'
    }
}
}
複製代碼

如上圖因此優化完成以後apk的lib包中就只有'armeabi','armeabi-v7a'兩種架構了

總結

項目瘦身是一項曠日持久的工做,也只有就apk的構成有所瞭解以後才能更好的對apk進行瘦身,經過上面的步驟以後你的apk必定會有不同的變化

相關文章
相關標籤/搜索