混淆的目的?
为了不开源应用,实现功能等同却难以阅读理解,加大反编译的成本,却不能避免反编译。
具体做法:
在build.gredle中找到minifyEnabled这个配置,设置为true,然后在proguard-rules.pro文件中添加混淆的规则,网上有一些通用的设置,具体百度即可
注意:如果在应用中用到反射去获取的类对象是不能被混淆的,不然会导致反射失败
在应用中哪些不能被混淆?
- 使用了自定义控件那么要保证它们不参与混淆
- 使用了枚举要保证枚举不被混淆
- 对第三方库中的类不进行混淆
- 运用了反射的类也不进行混淆
- 使用了 Gson 之类的工具要使 JavaBean 类即实体类不被混淆
- 在引用第三方库的时候,一般会标明库的混淆规则的,建议在使用的时候就把混淆规则添加上去,免得到最后才去找
- 有用到 WebView 的 JS 调用也需要保证写的接口方法不混淆,原因和第一条一样
- Parcelable 的子类和 Creator 静态成员变量不混淆,否则会产生 Android.os.BadParcelableException 异常
- 使用的四大组件,自定义的Application* 实体类
- JNI中调用的类
- Layout布局使用的View构造函数(自定义控件)、android:onClick等。
附上一个讲得比较透彻的网址:https://www.jianshu.com/p/b5b2a5dfaaf4