ProGuard简介
因为Java代码是非常容易反编码的,况且Android开发的应用程序是用Java代码写的,为了很好的保护Java源代码,我们需要对编译好后的class文件进行混淆。
ProGuard是一个混淆代码的开源项目,它的主要作用是混淆代码,殊不知ProGuard还包括以下4个功能。
* 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute)。
* 优化(Optimize):对字节码进行优化,移除无用的指令。
* 混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名。
* 预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。
总而言之,根据官网的翻译:Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。
问题汇总
## Warning:library class android.test.AndroidTestCase extends or implements program class junit.framework.TestCase
-dontwarn org.mockito.**
-dontwarn sun.reflect.**
-dontwarn android.test.**
## deal for retrolambda
-dontwarn java.lang.invoke.*
## Warning:org.junit.internal.runners.statements.FailOnTimeout: can't find referenced class java.lang.management.ManagementFactory
-dontwarn java.lang.management.**
-keep class java.lang.management.** { *; }
#---------------------------------3.与js互相调用的类------------------------
## JavaScriptInterfaceBase 任何需要JS回调NATIVE接口的类请集成这个基类,混淆脚本不会对该类的子类进行混淆
-keep class * extends com.xx.JavaScriptInterfaceBase {
<fields>;
<methods>;
}
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
-keep class com.xx.ui.news.fragment.NewsDetailFragment { *; }
#-------------------------------------------------------------------------
#---------------------------------4.反射相关的类和方法-----------------------
-dontwarn com.xx.common.utils.**
-keep class com.xx.common.utils.** { *; }
-dontwarn com.xx.common.base.**
-keep class com.xx.common.base.** { *; }
-dontwarn com.xx.common.baserx.**
-keep class com.xx.common.baserx.** { *; }
-keep class com.xx.common.basebean.** { *; }
-keep class com.xx.cctv.base.** { *; }
## Caused by: java.lang.ClassCastException: java.lang.Object cannot be cast to kstar.mycommon.base.b
mPresenter = TUtil.getT(this, 0);
#---------------------------------4.反射相关的类和方法-----------------------
## 对commonutils报下的代码不警告
-dontwarn com.xx.commonutils.**
-keep class com.xx.commonutils.** { *; }
#----------------------------------------------------------------------------
报错是强转两个对象之间的问题。根据这个思路 我将两个对象的代码都保护起来,BaseModel的子类要保护,不能混淆.
## BaseModel类所在的位置
-keep class com.xx.base.** { *; }
## BaseModel子类,我们业务类所在的位置
-keep class com.xx.ui.login.model.** { *; }