资源混淆配合7zip压缩,减小apk大小,增加破解难度。
通过resource.arsc文件格式,混淆步骤为:
- 解析arsc文件,主要为全局与资源名字符串池
- 修改字符串池中的字符串,以无意义的a/b替换
- 修改apk中的res目录资源文件名
- 打包(7zip)、对齐、签名
微信资源混淆打包工具AndResGuard或者美团资源混淆打包工具。
7zip压缩参考:
http://blog.rcant.com/2017/03/19/others/android-andresguard/
AndResGuard使用
1.项目根目录下build.gradle中,添加插件的依赖
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.15'
2.在app目录下,创建and_res_guard.gradle文件(也可以直接将内容写入build.gradle文件)
apply plugin: 'AndResGuard'
andResGuard {
// mappingFile = file("./resource_mapping.txt")
mappingFile = null
use7zip = true
useSign = true
// 打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字
keepRoot = false
whiteList = [
// for your icon
"R.drawable.icon",
// for fabric
"R.string.com.crashlytics.*",
// for google-services
"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",
// 我在实际项目中遇到第三方使用getIdentifier访问的资源的问题,将指定的资源放入白名单后,虽然不闪退了,但还是会出现无法理解的错误。所以只好全部id都放入白名单
"R.id.*"
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.15'
//path = "/usr/local/bin/7za"
}
/**
* 可选: 如果不设置则会默认覆盖assemble输出的apk
**/
// finalApkBackupPath = "${project.rootDir}/final.apk"
/**
* 可选: 指定v1签名时生成jar文件的摘要算法
* 默认值为“SHA-1”
**/
// digestalg = "SHA-256"
}
3.在build.gradle文件中引用
apply from: 'and_res_guard.gradle'
集成完AndResGuard后,在app的gradle的tasks中,多了一个叫做andresguard的task
打debug包: 执行resguardDebug指令;
打preview包: 执行resguardPreview指令;
打release包 : 执行resguardRelease指令。
双击执行resguardRelease指令,执行完毕后,可以在app目录下的/build/output/apk/release/AndResGuard_{apk_name}/ 文件夹中找到混淆后的Apk即可。
APK优化(一)之SVG————–解决大量的套图问题
APK优化(二)之Tint着色器————-减少apk体积
APK优化(三)之资源打包配置—-resources.arsc
APK优化(四)之.so动态库打包配置
APK优化(五)之移除无用资源,物理删除
APK优化(六)之代码混淆
APK优化(七)之启用shrinkResources资源缩减 ,不需要物理上的删除
APK优化(八)之启用webp转换插件—–图片变小
APK优化(九)之资源res文件混淆和7ZIP压缩