前言
网上关于使用proguard进行混淆的文章很多,但大部分是从讲解proguard知识点这个角度去写的,为什么要混淆,如何去混淆,混淆的注意点等重要的问题反而都没有写。
所以想通过这篇文章来记录我学习proguard的过程,一来是整理android混淆相关的知识点,二来是总结此次学习混淆的方法,提高学习能力。
proguard实践
学习任何技术之前应该要有一个明确的目标,本次学习混淆的目标就是会使用android studio自带的proguard对APP项目进行混淆,混淆后的APP要能正常运行。
本次学习尝试采用“三段式理论”,三段式即提出问题,分析问题,解决问题。
提出问题
APP为什么要进行混淆?
混淆的首要目的是保护APP项目的代码,使APP更难被破解;其次是优化APP,去除无用代码和资源,减小APP的大小。为什么使用proguard进行混淆?
因为proguard是一个很优秀的开源混淆代码项目,而且是google的android studio默认支持的混淆插件。怎么使用proguard进行混淆?
这个就是后续要重点要分享和实践的内容了,别着急,往后看如何验证核心代码是否混淆了?
我配置了proguard,用proguard打包生成了APK,那我怎么保证我想要混淆的代码已经混淆了呢。
其实反过来想就行了,就是通过反编译来验证,本篇将用jadx反编译工具来做。
分析问题
经过前面的分析,我们了解到主要的问题集中在如何混淆和混淆验证两个方面上。曾经有某个伟人说过“实践是检验真理的唯一标准”,不知道怎么混淆,那就用起来试试。
接下来我们将通过去混淆OkHttpDemo这个项目来进行实践,源码下载请戳这里
开始混淆
- 将项目的
build.gradle
中的minifyEnabled
置为true
。
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
applicationId "com.torch.easydev.okhttpdemo"
minSdkVersion 17
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
testCompile 'junit:junit:4.12'
compile 'com.squareup.okhttp3:okhttp:3.7.0'
compile 'com.google.code.gson:gson:2.8.0'
}
2.使用assembleRealease
打包APK,注意这里不能直接run,默认编译运行的APP为debug版本,是不会进行混淆的。
3. 打包过程会发现报错了,提示okio包下的某个类找不到,以下是编译的详细过程。
// 此Task为proguard混淆的命令
:app:transformClassesAndResourcesWithProguardForRelease
// proguard 版本
ProGuard, version 5.3.2
Reading input...
// 读取的jar,包括libs/以及build.gradle的dependencies里用到的
Reading program jar [/Users/torch/.android/build-cache/7880ba2afce31630824a0110efd86274bc49bc30/output/jars/classes.jar] (filtered)
Reading program jar [/Users/torch/.android/build-cache/e6f71d5707a837d00ed85447f14b707f76ae20f0/output/jars/classes.jar] (filtered)
Reading program jar [/Users/torch/.gradle/caches/modules-2/files-2.1/com.squareup.okhttp3/okhttp/3.7.0/6edbebdd8868708db718d15c09c4b28037fd487e/okhttp-3.7.0.jar] (filtered)
Reading program jar [/Users/torch/.gradle/caches/modules-2/files-2.1/com.google.code.gson/gson/2.8.0/c4ba5371a29ac9b2ad6129b1d39ea38750043eff/gson-2.8.0.jar] (filtered)
Reading program jar [/Users/torch/.android/build-cache/0d42c3690aeb29caef324c71b7fc2421c8de1e5b/output/jars/classes.jar] (filtered)
Reading program jar [/Users/torch/.android/build-cache/b9555cd093d474b08b7ea2c011a82c2d4c627b86/output/jars/classes.jar] (filtered)
Reading program jar [/Users/torch/.gradle/caches/modules-2/files-2.1/com.squareup.okio/okio/1.12.0/3742beff8024d0a0073d284b7c5e4cbf73d99b25/okio-1.12.0.jar] (filtered)
Reading program jar [/Users/torch/.android/build-cache/cb09c2323f3dd0b058deff4426ce2887c32c5698/output/jars/classes.jar] (filtered)
Reading program jar [/Users/torch/Library/Android/sdk/extras/android/m2repository/com/android/support/support-annotations/26.0.0-alpha1/support-annotations-26.0