安卓开发博客Android开发经验谈Android开发

Android--ProGuard混淆

2017-12-11  本文已影响37人  芒果味的你呀

为什么要混淆?

增大反编译难度,类和类成员会被随机命名。

混淆的四个功能:

我们通常说的proguard包括四个功能,shrinker(压缩), optimizer(优化),obfuscator(混淆),preverifier(预校验)。

混淆的过程

配置文件

在工程应用目录的gradle文件,经常会看到以下配置。这表明对release版本进行混淆处理。(minifyEnabled true),在工程目录下会有一个proguard-rules.pro文件,我们就可以在其中加入混淆规则。

android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

keep配置-避免混淆

原则上,代码混淆后越乱越无规律越好,但有些地方我们是要避免混淆的,否则程序运行就会出错,所以我们要在需要的地方避免混淆。这里我们主要用到的配置为-keep,用这个保证一些需要的地方避免混淆。

用以上方法保持类后,你会发现类名虽然未混淆,但里面的具体方法和变量命名还是变了

例子
1.表示保持ScriptFragment内部类JavaScriptInterface中的所有public内容不被混淆
-keep class com.tencent.qq.fragment.ScriptFragment$JavaScriptInterface {
   public *;
}
2.表示One类下的所有public方法都不会被混淆
-keep class cn.hadcn.test.One {
    public <methods>;
}
3.加入参数,比如以下表示用JSONObject作为入参的构造函数不会被混淆
-keep class cn.hadcn.test.One {
   public <init>(org.json.JSONObject);
}

其他配置

-dontshrink 声明不压缩输入文件 (默认所有没有被引用到的类都会被删除,除了-keep相关配置指定的类。)
-dontoptimize 声明不优化输入文件。默认情况下,优化选项是开启的,并且所有的优化都是在字节码层进行的。
-dontobfuscate声明不混淆。默认情况下,混淆是开启的。除了keep配置中声明的类,其它的类或者类的成员混淆后会改成简短随机的名字。
-optimizationpasses n指定执行几次优化,默认情况下,只执行一次优化。执行多次优化可以提高优化的效果,但是,如果执行过一次优化之后没有效果,就会停止优化,剩下的设置次数不再执行。这个选项只在optimizate阶段有效

混淆注意事项

有一些是不能混淆的

-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}
-keepclassmembers enum * {  
    public static **[] values();  
    public static ** valueOf(java.lang.String);  
}

反编译看源代码

混淆后再次生成apk时,默认会在工程目录app/build/outputs/mapping/release下生成一个mapping.txt文件,这就是混淆规则,我们可以根据这个文件把混淆后的代码反推回源本的代码。

上一篇下一篇

猜你喜欢

热点阅读