前言
在Android中,apk文件其实也只是一个压缩文件而已,对它进行改后缀再解压缩,就会得到dex等文件,如图:
通过反编译,我们可以查看到对应的代码,但如果经过代码混淆的话,即使被别人反编译了apk,也只是一堆的abc的命名,可资源不同,直接解压缩apk就可以获得相应的资源文件了,毫无安全性可言,就相当未经过混淆处理的app,被人反编译了代码,直接拿着源代码改改然后重新打包就变成了别人的东西了,在这里介绍一种资源文件名混淆的方法,是由微信开源的。
配置
首先先在根目录下的build.gradle文件中配置依赖,
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
//加入这一句
classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.13'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
然后在app模块下的build.gradle文件里面配置,
apply plugin: 'com.android.application'
apply plugin: 'AndResGuard'
android {
...
}
dependencies {
...
}
andResGuard {
// mappingFile = file("./resource_mapping.txt")
mappingFile = null
use7zip = true
useSign = true
// it will keep the origin path of your resources when it's true
keepRoot = false
whiteList = [
// 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"
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
]
sevenzip {
artifact = 'com.tencent.mm:SevenZip:1.2.13'
//path = "/usr/local/bin/7za"
}
/**
* Optional: if finalApkBackupPath is null, AndResGuard will overwrite final apk
* to the path which assemble[Task] write to
**/
// finalApkBackupPath = "${project.rootDir}/final.apk"
/**
* Optional: Specifies the name of the message digest algorithm to user when digesting the entries of JAR file
* Only works in V1signing, default value is "SHA-1"
**/
// digestalg = "SHA-256"
}
使用
配置后先Sync一下。
在Android Studio右侧栏的Gradle中,:app下会出现andresguard的一个目录,直接执行resguardRelease,如图:
直接执行命令就可以打包了,里面包括了你自己的代码混淆,签名,还加上了资源文件名的混淆,最终会生成一个目录(位于app/build/outputs/apk/{flavorName}/release/AndResGuard_…),里面就有想要的apk文件,
其中后缀是signed的apk就是已签名的。