一:代码混淆
方式1:再app的build,gradle中配置 minifyEnabled等于true, proguardFiles 指定混淆规则文件proguard-rules.pro
优点:ProGuard直接支持,无需关注混淆规则和混淆后的名称
缺点:对于想要自定义混淆后名称的方式不适用
方式二:使用混淆字典
app目录下先创建dic.txt文件,配置混淆的字符,然后在proguard-rules.pro文件里配置如下即可
-obfuscationdictionary dic.txt # 指定字段、方法名的混淆字典
-classobfuscationdictionary dic.txt # 指定类名混淆字典
-packageobfuscationdictionary dic.txt # 指定包名混淆字典
优点:可自定义混淆后名称,实现两款应用不同的混淆规则
缺点:需要配置混淆字典
相关文章:https://blog.si-yee.com/2019/04/12/Android%E6%B7%B7%E6%B7%86-Proguard-%E8%AF%A6%E8%A7%A3/
二:资源混淆
方式一:使用微信开源的AndResGuard
开源地址:https://github.com/shwenzhang/AndResGuard/blob/master/README.zh-cn.md
使用方式:
1 在project的gradle中添加依赖:
dependencies {
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.19'
}
2 在app的gradle中添加配置:
andResGuard {
// mappingFile = rootProject.file("app/resource_mapping.txt")
mappingFile = null
use7zip = false
useSign = true
// 打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字
keepRoot = true
// 设置这个值,会把arsc name列混淆成相同的名字,减少string常量池的大小
// fixedResName = "arg"
// 打开这个开关会合并所有哈希值相同的资源,但请不要过度依赖这个功能去除去冗余资源
mergeDuplicatedRes = 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",
"R.mipmap.icon_evalute_0",
"R.drawable.icon_friend_user_label_level_10",
"R.dimen.status_bar_height",
"R.layout.chat_item_girl_ask_qa_holder",
"R.id.*",
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.webp",
"*.gif",
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.19'
//path = "/usr/local/bin/7za"
}
/**
* 可选: 如果不设置则会默认覆盖assemble输出的apk
**/
// finalApkBackupPath = "${project.rootDir}/final.apk"
/**
* 可选: 指定v1签名时生成jar文件的摘要算法
* 默认值为“SHA-1”
**/
// digestalg = "SHA-256"
}
配置好之后在as右侧的gradle选项中会出现andresguard的task,选择需要打包的apk类型进行打包,最后会再app/build/outputs/apk/release/andResGuard 下生成一个已混淆的apk包。
关于whiteList白名单的说明:
所有使用getIdentifier访问的资源都需要加入白名单,如果布局中使用了androidx.constraintlayout.widget.Group,也需要将app:constraint_referenced_ids配置的id加入白名单
相关文章介绍:
https://blog.si-yee.com/2019/04/12/Android%E6%B7%B7%E6%B7%86-Proguard-%E8%AF%A6%E8%A7%A3/