代码混淆

什么是混淆?

  • 代码混淆:花指令,是将计算机程序的代码,转换成一种功能上等价,但是难以阅读和理解的形式的行为。
  • 代码混淆影响的元素有:类名、变量名、方法名、包名、其他等。
  • 混淆的目的:为了加大反编译的成本,但是并不能彻底防止反编译。

如何开启混淆

  • 通常我们需要找到项目路径下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的方法
- 第三方库不建议混淆
- 反射相关的一些情况

你可能感兴趣的:(代码混淆)