APP資原始檔混淆加固
使用工具AndResGuard,AndResGuard
是一個幫助你縮小APK大小的工具,他的原理類似Java Proguard,但是隻針對資源。他會將原本冗長的資源路徑變短,例如將res/drawable/wechat
變為r/d/a
。
AndResGuard的配置
專案根目錄下build.gradle中,新增外掛的依賴:
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.14'
buildscript { ext.kotlin_version = '1.2.30' repositories { google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.14' } }
app模組中build.gradle中,新增相關配置
個人建議單獨出一個gradle檔案,在app目錄下,建立and_res_guard.gradle檔案,如圖:
and_res_guard.gradle檔案中的配置:
apply plugin: 'AndResGuard' andResGuard { // mappingFile = file("./resource_mapping.txt") mappingFile = null use7zip = true useSign = true // 開啟這個開關,會keep住所有資源的原始路徑,只混淆資源的名字 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_*", //個推 "R.drawable.push", "R.drawable.push_small", "R.layout.getui_notification", //極光 "R.drawable.jpush_notification_icon" ] sevenzip { artifact = 'com.tencent.mm:SevenZip:1.2.14' //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,如圖:
如果想打debug包,則執行resguardDebug指令;
如果想打release包,則執行resguardRelease指令。
操作後對比圖:
可以看到res資料夾變為r,且裡面的目錄名稱都已經是混淆過的,瘦身效果還是很明顯的。
對於AndResGuard中的配置有不清楚的地方,可以檢視官方文件: