今天说说安卓混淆那点事:
在很多文章混淆都是开启minifyEnable之类的,其实这都是对class文件的混淆;当你反编译微信apk时你发现资源文件都是a b c...打开里面也找不到微信的图片信息和布局文件信息,其实微信对资源文件也做混淆压缩处理。
1:class文件混淆
在你的app的build里面配置
android {
compileSdkVersion 28
defaultConfig {
applicationId "cn.wqgallery.myproguard"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
//签名配置
signingConfigs {
//开发版
debug {
storeFile file("D:\\studio key\\studio key\\GXY.keystore")//自己的签名保存路径
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
//发布版
release {
keyAlias 'androiddebugkey'
keyPassword 'android'
storeFile file('D:/studio key/studio key/GXY.keystore')//自己的签名保存路径
storePassword 'android'
}
}
//编译配置
buildTypes {
//发布版
release {
minifyEnabled true //混淆
buildConfigField "boolean", "LOG_DEBUG", "false" //不显示log
zipAlignEnabled true //Zipalign优化
shrinkResources true // 移除无用的resource文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
//开发版
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//关于signingConfigs签名的配置可以看看这篇文章https://blog.csdn.net/bzlj2912009596/article/details/78188570
配置好了我们就可以配置自定义规则了打开proguard-rules.pro文件,下面是一些常用的混淆语法
#自定义混淆配置
#配置UserBean类名不被混淆+变量和方法混淆 语法 -keep class 全类名
#-keep class cn.wqgallery.myproguard.UserBean
#配置UserBean类名+类里面变量+方法都不被混淆 语法 -keep class 全类名{*;}
#-keep class cn.wqgallery.myproguard.UserBean{*;}
#配置UserBean类指定的成员变量不被混淆+类名混淆 语法 -keep class 全类名
#-keepclassmembers class cn.wqgallery.myproguard.UserBean{*;}
#类名不混淆+ 变量方法混淆
#-keepclasseswithmembers class cn.wqgallery.myproguard.UserBean{*;}
#配置类里面的native 方法不被混淆
-keepclasseswithmembers class cn.wqgallery.myproguard.UserBean{
native <methods>;
}
//根据你的实际项目代码看那些代码不能混淆(一般自定义view,需要被反射的类,枚举等等只要改变了名字导致不能使用的都不能混淆)
//现在以发布版本为例,切换AS到release的build模式
//如果你切换到这个模式报错,可以按这篇文章配置下https://blog.csdn.net/bzlj2912009596/article/details/78188570
//选择build》Generate singed APK打包签名Apk
//这样打包成的apk就是混淆过的apk了。
来两张图对比下混淆前和混淆后效果
//没有混淆的
//混淆了图片
UserBean类混淆后变成了a
>>------------------------------------------------------------------------------------------------
2:现在介绍如何对资源文件的混淆
我们使用微信的开源框架andresguard
//GitHub地址:https://github.com/shwenzhang/AndResGuard/blob/master/README.zh-cn.md
//使用步骤
1:在工程的的build里面配置依赖
dependencies {
classpath 'com.android.tools.build:gradle:3.2.0'
//微信资源压缩混淆配置
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.17'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
2:在app的目录下新建个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_*"
//项目中自己使用反射 获取资源id的资源
"R.drawable.bd"
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.10'
}
}
3:在APP的build下配置下面代码
apply plugin: 'com.android.application'//系统的
//引用微信压缩资源库,白名单配置
apply from: 'and-res-guard.gradle'
4:同步后点击最右边的gradle ,选择tasks》andresguard》resguardRelease(tasks下面是些执行脚本,点击就执行这些脚本,andresguard下有三种类型脚本我们今天是要发布版,点击resguardRelease执行脚本)
//下面运行日志提示下面就是成功
//在APP》build》outputs》apk》release》AndResGuard_app-release》temp》选择app-release_7zip_aligned_signed.apk
这样你反编译资源文件就是混淆了
//最近建议再使用360或者乐固进行加固处理
注意 项目中使用反射获取的资源 需要添加到 白名单 (and-res-guard.gradle),
//这个是的一个demo地址:https://github.com/zhudaihao/MyProguard