代码混淆

一.分类

Android 代码混淆有两种形式

1.ProGuard文件:一个通用的 Java 字节码优化工具。

2.R8:ProGuard 的继承者,专为 Android 设计,编译性能和编译产物更优秀。

 

启用与禁用 R8

# 显式启用 R8
android.enableR8 = true

# 只对 Android Library module 停用 R8 编译器
android.enableR8.libraries = false

# 对所有 module 停用 R8 编译器
android.enableR8 = false

 

 

 

 

 

 

二.代码混淆四大功能

ProGuard 与 R8 都提供了压缩(shrinker)、优化(optimizer)、混淆(obfuscator)、预校验(preverifier)四大功能。

 

1.压缩(也称为摇树优化,tree shaking):从 应用及依赖项 中移除 未使用 的类、方法和字段,有助于规避 64 方法数的瓶颈。

2.优化:通过代码 分析 移除更多未使用的代码,甚至重写代码。

3.混淆:使用无意义的简短名称 重命名 类/方法/字段,增加逆向难度。

4.预校验:对于面向 Java 6 或者 Java 7 JVM 的 class 文件,编译时可以把 预校验信息 添加到类文件中(StackMap 和 StackMapTable属性),从而加快类加载效率。预校验对于 Java 7 JVM 来说是必须的,但是对于 Android 平台 无效。

 

 

 

 

 

三.使用

 

1.Gradle

buildTypes {
    release {
        //启用代码压缩、优化和混淆(由R8或者ProGuard执行)
        minifyEnabled true
        
        //指定混淆保留规则文件
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }

}

 

注意:指定混淆保留规则文件有两种方式

// 方式一:
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

// 方式二:
proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
proguardFile 'proguard-rules.pro'

 

 

2.混淆文件位置

运行后,在下图中的目录中系统会自动生成混淆文件

 

注意:代码混淆时还可以添加压缩图片功能来减少APK的大小。

buildTypes {
    release {
        minifyEnabled true
        //启用资源压缩
        shrinkResources true

        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }


}

 

 

3.关键词

<1> dontwarn:忽略警告

//忽略support包下的所有警告
-dontwarn android.support.**

//忽略androidx包下的所有警告
-dontwarn androidx.**

 

<2> keep:保证不被混淆

//保证OKHttp不被混淆
-keep class okhttp3.**{*;}
-keep class okio.**{*;}

 

<3> keepclassmembers:保证类成员 ( 成员变量 , 成员方法 ) 不被混淆 。 类名还是会被混淆的。

-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

 

<4> -keepclasseswithmembernames:-keep 作用类似 , 都可以保留 类名 与 成员 不被混淆。

-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
}

-keepclasseswithmembernames 与 -keep 配置区别 : -keepclasseswithmembernames 中假如配置的 保留成员不存在 , 则该 混淆不生效。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值