先说代码混淆的作用:避免别人根据.apk或.aar、.jar文件反编译出我们的源代码。

网上有很多关于Android代码混淆的文章,写的很多是大同小异,而最后影响我们代码成功与否的往往正是那些细节点。

开启混淆:

在 module的build.gradle文件中,buildTypes下,minifyEnabled代表是否开启混淆,true表开启。
Android代码混淆
如上图所示,表示release版本的不开启混淆,debug版本的开启混淆。
proguardFiles指的是混淆的配置文件,后面的proguard-android.txt是系统配置好的,里面有常见的混淆规则;
后面的proguard-rules.pro,原始状态是为空,里面都是被注释掉的语句,如果不加修改,这个.pro文件是指全部混淆,
我们可以在这个.pro里面写自己的混淆规则,让某些地方不被混淆。

代码混淆的通用部分:

 这部分是默认写好的,也是最常见的混淆规则

Android代码混淆

 上图所示就是proguard-android.txt文件中的部分内容,这个里面不用修改(我认为的,如有错误,欢迎指正)

 这个.txt文件在project下的build文件夹的intermediates的proguard-files文件夹中。

代码混淆自定义部分:

 这一部分内容就写在前面提到的proguard-rules.pro文件中。

 我是想把自己写的一个库代码混淆,网上很多说的都是整个APP项目的混淆,所以他们说到的继承类、自定义组件等内容,并没有涉及,而我需要的,他们也没有提到。

 开始:

 保持某个自定义类不被混淆: -keep class MyClass(要有完整的包名)
Android代码混淆

 保持自定义类中的某个方法不被混淆: -keep class MyClass(要有完整的包名){ public void myMethod();
 Android代码混淆
 如上图中所示,如果涉及到java中的非基本数据类型,则需要给出完整引用路径,包括自定义类,也是一样。

 保持自定义类中的构造方法不被混淆:这个网上有很多都有说到,public <init>(java.lang.String);

              Android代码混淆

 如果函数的返回类型为容器类或是数组:

      Android代码混淆

 如上图中的最后两句的样式

 如果是保留类中成员变量(一般是常量)不被混淆:

        Android代码混淆

 如果是想把类中返回型的函数,常见的是get***(...)方法,(注:***,...,代表省略,符合这个形式的都可以),可以用这种方法:

   Android代码混淆
里面的*为固定形式,我用这种格式的原因是:
遇到一个需要保留的函数,一直提示错误,它就是一个get型方法,所以就用了这种粗线条的解决方式。

 如果是自定义类中有enum类型,需要格外注意,在proguard-android.txt文件中有一句对enum的处理语句:

           Android代码混淆

 网上常见的关于enum的保留方式其实也是这个,我们不用再在.pro文件中写,但是类里面有成员是enum类型的话,
单靠这一句还不行,enum在java中认为是一个类,所以类里面的enum要进行内部类保留处理。加上下面两句:
Android代码混淆
对于接口的保留,只需要把保留类的方式中的class换成interface即可。

后记:今天完成了关于代码混淆的工作,收获比较大,如果有朋友遇到Android代码混淆的情况,欢迎随时联系,大家一起探讨,共同进步。

相关文章: