什么是混淆?
- 代码混淆:花指令,是将计算机程序的代码,转换成一种功能上等价,但是难以阅读和理解的形式的行为。
- 代码混淆影响的元素有:类名、变量名、方法名、包名、其他等。
- 混淆的目的:为了加大反编译的成本,但是并不能彻底防止反编译。
如何开启混淆
- 通常我们需要找到项目路径下app目录下的build.gradle文件。
- 找到minifyEnabled这个配置,然后设置为true即可。
buildTypes {
release {
minifyEnabled true -- 开启混淆
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'~~~
##### Proguard是什么?
- Proguard是一个集文件压缩,优化,混淆和校验等功能的工具。
- 它检测并删除无用的类、变量、方法和属性。
- 它优化字节码并删除无用的指令。
- 它通过将类名、变量名和方法名重命名为无意义的名称实现混淆效果。
- 最后它还校验处理后的代码。
##### 混淆的常见配置 -- keep
- Keep用来保留Java的元素不进行混淆,keep有很多变种:
> -keep
-keepclassmembers
-keepclasseswithmembers
- 保留某个包下面的类以及子包
> -keep public class com.droidyue.com.widget.**
- 保留所有类中使用otto的public方法
> Otto
-keepclassmembers class ** {
@com.squareup.otto.Subscribe public *;
@com.squareup.otto.Produce public *;
}
- 保留Contants类的BOOK_NAME属性
> -keepclassmembers class com.example.admin.proguardsample.Constants {
public static java.lang.String BOOK_NAME;
}
##### 混淆的常见配置 -- dontwarn
- dontwarn是一个和keep形影不离,尤其是处理引入的library时。
- 引入的library可能存在一些无法找到的引用和其他问题,在build时可能会发出警告,如果我们不进行处理,通常会导致build中止。因此为了保证build继续,我们需要使用dontwarn处理这些我们无法解决的library的警告。
##### 关闭Twitter sdk的警告
> -dontwarn com.twitter.sdk.**
# 哪些不应该混淆
- 反射中使用的元素
- GSON的序列化与反序列化
- 枚举
- 四大组件不建议混淆
- 注解不能混淆
- jni调用的java方法
- java的native方法
- js调用java的方法
- 第三方库不建议混淆
- 反射相关的一些情况
网友评论