APP瘦身大法--AndResGuard的使用

什麼是AndResGuard

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

爲何要使用AndResGuard

  在以往的開發中,咱們一般只混淆了代碼,資源文件卻暴露在他人面前,res文件夾下全部文件名的可讀性過強,如圖:github

image

咱們能夠看到res文件夾下的目錄結構,好比咱們想查看該app的佈局文件,很輕鬆就可以找到layout文件夾:web

image

  layout文件夾下,文件名的可讀性也很高,咱們能夠看到有activity_add_friend.xml,能夠知道是添加銀行卡頁面的佈局。json

  微信的開源庫AndResGuard正好解決這種問題,對資源進行混淆,保護res資源文件的可讀性,同時,能夠減小APP的大小。通過AndResGuard處理後:api

res文件夾名稱變爲r,該文件夾下的目錄結構變成:bash

image

  此時,咱們根本沒法知道哪一個文件夾是存放佈局文件的,哪些文件夾是存放圖片的,即便找到存放xml文件的文件夾,咱們也難以知道這些xml是幹嗎用的,如圖:微信

image

  文件的名稱毫無可讀性,此時,想要找到添加銀行卡界面的佈局文件,就再也不是件容易的事了。app

接下來,咱們對比下使用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加入白名單,更多的白名單能夠查看:

AndResGuard白名單

  因爲咱們並不是是在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代碼地址:

github.com/chaychan/An…

  對於AndResGuard中的配置有不清楚的地方,能夠查看官方文檔:

AndResGuard中文文檔

相關文章
相關標籤/搜索