android 混淆

前沿

很久没用过混淆功能了,因为之前的包都使用第三方加固了,而且项目开发好几年了,突然要混淆也很麻烦。换了家公司后,感觉还是得混淆代码才行,不然直接暴露源码也太不行了。

启动混淆功能

isMinifyEnabled = true
#添加
proguardFiles(
	getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
)

getDefaultProguardFile(“proguard-android-optimize.txt”) 是系统默认的配置,而 proguard-rules.pro 才是我们自身的混淆配置

混淆

第三方库混淆

第三方一般都会自带混淆文件,或者是会提供混淆内容,如:

-keep class com.iflytek.**{
   *;}
-keepattributes Signature

-dontwarn dalvik.**
-dontwarn com.tencent.smtt.**

-keep class com.tencent.smtt.** {
   
    *;
}

-keep class com.tencent.tbs.** {
   
    *;
}

App 自身混淆

最需要注意的是我们的数据模型的混淆。
本来以为直接 -keep class com.xx.xx.model.** { *; } 就万事大吉了,结果发现还是不行。

-keep @kotlinx.serialization.Serializable class com.xx.android.netlib.model.** {
    *; }

各种 gson ,泛型类,枚举类,Parcelable ,Serializable ,serialization等相关的都需要 keep住。
特别是如果遇到了需要通过 Gson.toJson POST 数据到服务器的,注意字段名别被混淆了,需要一个个字段注解上:

@SerializedName("id")
val id: Int? = null

不然上传的就是 a: 23 / b: 32 这样的了。

最后,发现还是死活不行。最后看到有人说要禁止全混淆模式,
在 gradle.properties 中:

android.enableR8.fullMode=false

此时,一万匹草尼玛奔腾而过。

android.enableR8.fullMode=false 是 Android Gradle 插件中的一个配置项,作用是 关闭 R8 的完整模式。完整模式会严格应用代码优化规则和检查,关闭它可以在某些情况下避免兼容性或构建问题。

具体作用
当设置为 false 时:

禁用 R8 的一些激进优化:

关闭某些潜在可能影响运行时行为的优化。
比如,不会删除那些可能看似未使用但实际被反射调用的代码。
保留更宽松的代码压缩策略:

避免因为未正确配置 ProGuard/R8 规则而导致代码、类、或资源被误删除。
对兼容性更友好,尤其是对于依赖于动态加载(如反射或动态代理)的代码。
减少一些潜在的构建时间开销:

构建过程更快,特别是在调试模式下。
更安全的过渡到 R8:

如果项目从 ProGuard 迁移到 R8,设置 android.enableR8.fullMode=false 可以让开发者逐步调整 R8 配置文件。

注意事项
此配置在 Android Gradle Plugin 4.0 之后已经被废弃: 如果你使用的 Android Gradle Plugin 版本是 4.0 及以上,android.enableR8.fullMode 的设置将被忽略,R8 会默认启用完整模式。

library 库混淆

library库中的代码不想混淆:isMinifyEnabled = false。

一般我们只需要在以下情况才需要对 Library 做混淆:

  1. 要发布为 SDK 提供给别人(比如对外发布到 MavenCentral / JCenter)。
  2. 要保护商业逻辑算法不被反编译看穿。
  3. 库本身非常大,想通过提前混淆控制包大小。

但是,library 库中使用的第三方库代码也是不需要配置混淆的,而我们的 App 一般却是需要混淆的。
这个时候 consumer-rules.pro 就派上用场了,之前一直知道突然有了这么个文件,但是没有具体了解过它的作用。
这是 Android 官方支持的机制:

android {
   
    defaultConfig {
   
        consumerProguardFiles("consumer-rules.pro")
    }
}

在里面写
上你 library 所依赖的第三方 SDK 所需要的混淆规则,例如:

# 比如使用 Gson
-keep class com.google.gson.** { *; }
-keepattributes Signature
-keepattributes *Annotation*

# 比如使用 Retrofit
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions

# 使用了 ButterKnife
-keep class butterknife.** { *; }

# 你自己的 ViewBinding、DataBinding、协程等规则
-keep class **.databinding.*Binding { *; }
-keepclassmembers class * extends androidx.databinding.ViewDataBinding {
    public static <fields>;
}

✅ 优点
主 app 中 不用重复写。

只要依赖了你的 library,consumer-rules.pro 会在 app 的 R8 编译阶段自动合并进去。

对使用者完全透明,维护成本集中在 library。

完整混淆配置

网络库:

-dontoptimize

-keepattributes Signature

-printmapping mapping.txt

-verbose

# Keep generic signature of Call, Response (R8 full mode strips signatures from non-kept items).
 -keep,allowobfuscation,allowshrinking interface retrofit2.Call
 -keep,allowobfuscation,allowshrinking class retrofit2.Response

 # With R8 full mode generic signatures are stripped for classes that are not
 # kept. Suspend functions are wrapped in continuations where the type argument
 # is used.
 -keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation

# App 的 model
-keepattributes Signature
# 保留带有 @Serializable 注解的类
-keep @kotlinx.serialization.Serializable class com.xx.android.netlib.model.** {
    *; }

# 保留带有 @Parcelize 注解的类
-keep @kotlinx.parcelize.Parcelize class com.xx.android.netlib.model
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文韬_武略

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值