在 Android 中使用 R8 和 Proguard 时如何保护数据模型类免受逆向工程的影响?

Posted

技术标签:

【中文标题】在 Android 中使用 R8 和 Proguard 时如何保护数据模型类免受逆向工程的影响?【英文标题】:How to secure data model classes from reverse engineering when using R8 and Proguard in Android? 【发布时间】:2020-04-03 15:47:16 【问题描述】:

现在,在对 android 应用程序 APK 文件进行逆向工程时,我可以看到纯文本中的数据模型类,因为我使用了 @keep 注释。如果没有注释,应用程序将崩溃,因为这些文件正在被 R8 删除。

如何确保数据模型文件在逆向工程中不可见?

【问题讨论】:

你能提供更多关于你使用什么样的数据模型类的信息吗?你使用像 GSON 这样的库吗?您在 Proguard 上是否也遇到过同样的崩溃,还是只是在迁移到 R8 后才出现? 数据模型类是 POJO。是的,我使用 GSON 将服务器响应(它们是 json 字符串)反序列化为 java 对象。不,我在使用 Proguard 时没有遇到崩溃。 您最终找到解决方案了吗? 【参考方案1】:

最近我遇到了同样的问题,我确定的问题是我有一套过时的 proguard 规则。请注意,2019 年 10 月 4 日,Gson 更新了他们的 proguard 规则以将 R8 考虑在内。希望您必须更新它们。

您可以在https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg找到它

# Gson uses generic type information stored in a class file when working with fields. Proguard
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature

# For using GSON @Expose annotation
-keepattributes *Annotation*

# Gson specific classes
-dontwarn sun.misc.**
#-keep class com.google.gson.stream.**  *; 

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.**  <fields>; 

# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,
# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
-keep class * implements com.google.gson.TypeAdapter
-keep class * implements com.google.gson.TypeAdapterFactory
-keep class * implements com.google.gson.JsonSerializer
-keep class * implements com.google.gson.JsonDeserializer

# Prevent R8 from leaving Data object members always null
-keepclassmembers,allowobfuscation class * 
  @com.google.gson.annotations.SerializedName <fields>;

还记得添加您的某些模型类:查看中心的规则,因为它只是一个示例,必须使用您自己的模型进行更改。

【讨论】:

【参考方案2】:

将下面的行添加到gradle.properties 文件中。

# Disables R8 for Android Library modules only.
android.enableR8.libraries = false
# Disables R8 for all modules.
android.enableR8 = false

【讨论】:

您能解释一下这是如何回答 OP 的问题的吗?

以上是关于在 Android 中使用 R8 和 Proguard 时如何保护数据模型类免受逆向工程的影响?的主要内容,如果未能解决你的问题,请参考以下文章

同时使用 ProGuard 和 R8

Android/Java 混淆:R8 与(ProGuard 或 DexGuard)?

Proguard和R8有什么区别?

R8 和 Proguard 规则

如何使用 Android R8 保留类构造函数参数名称

在 Android 上使用 R8 时,是不是需要卸载现有的 Proguard?