1. Android Studio 代码混淆(你真的会混淆吗)
4. java代码混淆
除了DIY虚拟机和静态编译,最好的保护方式就是代码混淆。因为只要是装载到标准JVM里的字节码,都能用HotSpotDebuger从内存中直接导出
java代码可以反编译,因此有时候要保护自己的知识产权还真得费点心思,一般来说有三个思路:
1、将class文件加密,这个是最安全的,但也费事儿,因为要重写classloader来解密class文件;
2、使用花指令,使得class文件不能反编译(利用反编译工具漏洞);安全性一般,还是有花指令破解器;
3、代码混淆,提高代码阅读成本;简单易操作,一般采用这种或者与其它方式结合;
ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,殊不知ProGuard还包括以下4个功能。
1. 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。
2. 优化(Optimize):对字节码进行优化,移除无用的指令。
3. 混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。
4. 预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。 (android一般不进行预检)
一般以下情况都会不混淆:
1.使用了自定义控件那么要保证它们不参与混淆
2.使用了枚举要保证枚举不被混淆
3.对第三方库中的类不进行混淆
4.运用了反射的类也不进行混淆
5.使用了 Gson 之类的工具要使 JavaBean 类即实体类不被混淆
6.在引用第三方库的时候,一般会标明库的混淆规则的,建议在使用的时候就把混淆规则添加上去,免得到最后才去找
7.有用到 WebView 的 JS 调用也需要保证写的接口方法不混淆,原因和第一条一样
8.Parcelable 的子类和 Creator 静态成员变量不混淆,否则会产生 Android.os.BadParcelableException 异常