混淆总结 - bei1999/work GitHub Wiki

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.** { *; }
⚠️ **GitHub.com Fallback** ⚠️