1. 程式人生 > >APP瘦身大法--AndResGuard的使用

APP瘦身大法--AndResGuard的使用

什麼是AndResGuard

  AndResGuard是一個縮小APK大小的工具,它的原理類似Java Proguard,但是隻針對資源。它會將原本冗長的資源路徑變短,例如將res/drawable/wechat變為r/d/a。

為什麼要使用AndResGuard

  在以往的開發中,我們通常只混淆了程式碼,資原始檔卻暴露在他人面前,res資料夾下所有檔名的可讀性過強,如圖:

image

我們可以看到res資料夾下的目錄結構,比如我們想檢視該app的佈局檔案,很輕鬆就能夠找到layout資料夾:

image

  layout資料夾下,檔名的可讀性也很高,我們可以看到有activity_add_friend.xml,可以知道是新增銀行卡頁面的佈局。

  微信的開源庫AndResGuard正好解決這種問題,對資源進行混淆,保護res資原始檔的可讀性,同時,可以減少APP的大小。經過AndResGuard處理後:

res資料夾名稱變為r,該資料夾下的目錄結構變成:

image

  此時,我們根本無法知道哪個資料夾是存放佈局檔案的,哪些資料夾是存放圖片的,即使找到存放xml檔案的資料夾,我們也難以知道這些xml是幹嘛用的,如圖:

image

  檔案的名稱毫無可讀性,此時,想要找到新增銀行卡介面的佈局檔案,就不再是件容易的事了。

接下來,我們對比下使用AndResGuard前後apk的大小:

image

可以看到,apk的大小從31.8M減少到29.6M,少了2.2M,很不錯的瘦身大法。

AndResGuard的配置

專案根目錄下build.gradle中,新增外掛的依賴:

 dependencies {
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.10'
    }

app模組中build.gradle中,新增相關配置

  個人建議單獨出一個gradle檔案,在app目錄下,建立and_res_guard.gradle檔案,如圖:

image

and_res_guard.gradle檔案中的配置:

apply plugin: 'AndResGuard'

andResGuard {
    mappingFile = null
use7zip = true useSign = true keepRoot = false compressFilePattern = [ "*.png", "*.jpg", "*.jpeg", "*.gif", "resources.arsc" ] whiteList = [ // your icon "R.drawable.icon", // for fabric "R.string.com.crashlytics.*", // for umeng update "R.string.tb_*", "R.layout.tb_*", "R.drawable.tb_*", "R.drawable.u1*", "R.drawable.u2*", "R.color.tb_*", // umeng share for sina "R.drawable.sina*", // for google-services.json "R.string.google_app_id", "R.string.gcm_defaultSenderId", "R.string.default_web_client_id", "R.string.ga_trackingId", "R.string.firebase_database_url", "R.string.google_api_key", "R.string.google_crash_reporting_api_key", //友盟 "R.string.umeng*", "R.string.UM*", "R.layout.umeng*", "R.drawable.umeng*", "R.id.umeng*", "R.anim.umeng*", "R.color.umeng*", "R.style.*UM*", "R.style.umeng*", //融雲 "R.drawable.u*", "R.drawable.rc_*", "R.string.rc_*", "R.layout.rc_*", "R.color.rc_*", "R.id.rc_*", "R.style.rc_*", "R.dimen.rc_*", "R.array.rc_*" ] sevenzip { artifact = 'com.tencent.mm:SevenZip:1.2.10' //path = "/usr/local/bin/7za" } }

  其中whiteList(白名單)中指定不需要進行混淆的資源路徑規則,主要是一些第三方SDK,因為有些SDK的程式碼中引用到對應的資原始檔,如果對其進行混淆,會導致找不到對應資原始檔,出現crash,所以不能對其資原始檔進行混淆。由於公司的專案中使用到了友盟和融雲,所以將這兩個SDK加入白名單,更多的白名單可以檢視:

  由於我們並非是在app模組下的build.gradle中新增AndResGuard的配置,而是單獨出and_res_guard.gradle,所以需要在app模組下的build.gradle檔案中引用,在app模組下的build.gradle檔案開頭新增以下程式碼引用:

apply from: 'and_res_guard.gradle'

AndResGuard的使用

整合完AndResGuard後,在app的gradle的tasks中,多了一個叫做andresguard的task,如圖:

image

如果想打debug包,則執行resguardDebug指令;

如果想打preview包,則執行resguardPreview指令;

如果想打release包,則執行resguardRelease指令。

  演示下打release包,我們雙擊執行resguardRelease指令,執行完畢後,我們可以在app目錄下的/build/output/apk/release/AndResGuard_{apk_name}/ 資料夾中找到混淆後的Apk:

image

其中app-release_aligned_signed.apk為進行混淆並簽名過的apk,雙擊檢視該apk:

image

image

可以看到res資料夾變為r,且裡面的目錄名稱都已經是混淆過的。

  到這裡為止AndResGuard的使用就已經介紹完畢,如果有不清楚的地方,可以參考我寫的demo,demo程式碼地址:

  對於AndResGuard中的配置有不清楚的地方,可以檢視官方文件: