https://blog.csdn.net/u011732740/article/details/51545722
-
混淆后App Crash日志定位问题
混淆代码错误信息.png
2.1、常用命令
命令 作用
-keep 防止该类所有内容被移除或重命名
-keepnames 防止类和成员被重命名
-keepclassmembers 防止成员被移除或者被重命名
-keepclasseswithmembers 防止拥有该成员的类和成员被移除或者被重命名
-keepclasseswithmembernames 防止拥有该成员的类和成员被重命名
2.2. 常用规则
类:需要使用完全限定名;
*:通配符,任意字符串,不包含包名分隔符(.);
**:通配符,任意字符串,包含包名分隔符(.);
extends:继承某类的类;
implement:实现某接口的类;
$:内部类;
<init>:所有构造方法;
<fields>:所有成员变量;
<methods>:所有方法;
…:任意参数;
修饰符:public private protected
2.3. 例子
含义 指令语句
不混淆某个类 -keep public class packageName.className{ ; }
不混淆某个包的所有类 -keep class packageName.*{ *; }
不混淆某个类的子类 -keep public class * extends packageName.className{ *; }
不混淆某个接口的子类 -keep public class * implements packageName.className{ *; }
不混淆某个类的构造方法
-keepclassmembers class packageName.className{
public <init>(org.json.JSONObject);
}
不混淆某个类的某个方法 -keepclassmembers class packageName.className{ public void methodName(…); }
不混淆某个类的内部类 -keep class packageName.className$*{ *; }
混淆的步骤
上文中介绍了代码的混淆,其实Android的混淆中还包括了资源压缩,整个过程包括:压缩、优化、混淆、以及预校验,其中第四步在Android中可不要,默认是去掉了的,另外三个都是默认开启的。
压缩:会移除未被使用的类和成员变量,会在优化后再次被执行;
优化:在字节码级别执行优化,让应用运行的更快;
混淆:增大反编译难度,类和类成员会被随机命名,除非用keep保护。
Shrinking Options 压缩选项
shrink,测试后发现会将一些无效代码给移除,即没有被显示调用的代码
-dontshrink
shrink操作默认启用,每个optimization步骤后,都会执行一步shrink。
该选项 表示 不启用 shrink。
测试后发现是全局性的,且即便使用了-keep 开启shrink,也无效
-printusage [filename]
打印被移除的代码,在标准输出
-whyareyoukeeping class_specification
打印 在shrink过程中 为什么有些代码被 keep
Optimization Options 优化选项
基于控制流、数据流分析后,删除、合并一些代码
-dontoptimize
optimization,默认启用
该选项表示 不启用
当不使用该选项时,下面的才有效
-optimizations optimization_filter
根据optimization_filter指定要优化的文件
-optimizationpasses n
优化数量 n
-assumenosideeffects class_specification
如果一个方法有返回值,在调用的时候没使用到它的返回值,那么可能被忽略。
-allowaccessmodification
优化时允许访问并修改类和类的成员的 访问修饰符,可能作用域会变大。
-mergeinterfacesaggressively
竭力合并接口,即使它们的实现类未实现合并后接口的所有方法。
