Android 混淆:proguard实践

前言

网上关于使用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这个项目来进行实践,源码下载请戳这里

开始混淆

  1. 将项目的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
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值