混淆介绍
使用到:序列化、反序列化、JNI、反射,所以都需要添加混淆过滤代码
Proguard是一个Java类文件压缩器、优化器、混淆器、预校验器。压缩环节会检测以及移除没有用到的类、字段、方法以及属性。优化环节会分析以及优化方法的字节码。混淆环节会用无意义的短变量去重命名类、变量、方法。这些步骤让代码更精简,更高效,也更难被逆向(破解)。
混淆后默认会在工程目录app/build/outputs/mapping/release(debug)下生成一个mapping.txt文件,这就是混淆规则,我们可以根据这个文件把混淆后的代码反推回源本的代码,所以这个文件很重要,注意保护好。原则上,代码混淆后越乱越无规律越好,但有些地方我们是要避免混淆的,否则程序运行就会出错。
ProGuard常用操作
后面有备注Proguard官方文档,其他操作自行查看即可
Proguard官方文档
-
压缩(Shrinking):默认开启,用以减小应用体积,移除未被使用的类和成员,并且会在优化动作执行之后再次执行(因为优化后可能会再次暴露一些未被使用的类和成员)。
-dontshrink #关闭压缩
-
优化(Optimization):默认开启,在字节码级别执行优化,让应用运行的更快。
-dontoptimize #关闭优化
-optimizationpasses n #表示proguard对代码进行迭代优化的次数,Android一般为5
- 混淆(Obfuscation):默认开启,增大反编译难度,类和类成员会被随机命名,除非用keep保护。
-dontobfuscate #关闭混淆
- 一颗星表示只是保持该包下的类名,而子包下的类名还是会被混淆;
-keep class com.thc.test.*
- 两颗星表示把本包和所含子包下的类名都保持;
-keep class com.thc.test.**
(上面两种方式保持类后,会发现类名虽然未混淆,但里面的具体方法和变量命名还是变了)
- 既可以保持该包下的类名,又可以保持类里面的内容不被混淆;
-keep class com.thc.test.*{*;}
- 既可以保持该包及子包下的类名,又可以保持类里面的内容不被混淆;
-keep class com.thc.test.**{*;}
- 保持某个类名不被混淆(但是内部内容会被混淆)
-keep class com.xlpay.sqlite.cache.BaseImpl
- 保持某个类的 类名及内部的所有内容不会混淆
-keep class com.xlpay.sqlite.cache.BaseImpl{*;}
网友评论