【问题标题】:Android R8 obfuscation with flexJson duplicate key issueAndroid R8 混淆与 flexJson 重复密钥问题
【发布时间】:2020-03-13 13:06:42
【问题描述】:

在 build.gradle 中使用 R8 和 minifyEnabled true 混淆 android 应用程序时,它会在 web 服务响应之一中添加如下所示的重复键。

响应:{"key1":"value1", ......., "key1":"value1"} 多次添加“key1”,flexJson 抛出异常并导致应用崩溃

Caused by: flexjson.JSONException: Duplicate key "key1"
    at flexjson.JSONTokener.putOnce(JSONTokener.java:498)
    at flexjson.JSONTokener.parseObject(JSONTokener.java:471)
    at flexjson.JSONTokener.nextValue(JSONTokener.java:357)
    at flexjson.JSONTokener.parseObject(JSONTokener.java:471)
    at flexjson.JSONTokener.nextValue(JSONTokener.java:357)
    at flexjson.JSONDeserializer.deserialize(JSONDeserializer.java:197)

没有混淆一切正常(minifyEnabled false)。 使用的 Gradle 插件版本:3.4.2,flexJson 也被项目中包含的库之一使用。

【问题讨论】:

标签: android proguard obfuscation android-r8


【解决方案1】:

一般来说,您应该确保所有用于通过反射生成 JSON 的字段都被保留规则覆盖。否则 JSON 中的名称可能会因构建而异。此外,R8 使用了 JVM 和 Android 运行时允许不同类型的字段具有相同名称的属性,您可能会遇到此处描述的情况。

一个选项可以是注释所有被序列化的类,并使用这样的保留规则:

-keep class @MyAnnotation ** {
  <fields>;
}

或者如果所有这些类都在一个单独的包中:

-keep class com.example.mypackage.serialized_classes.** {
  <fields>;
}

【讨论】:

    猜你喜欢
    • 2019-03-19
    • 2020-10-05
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    相关资源
    最近更新 更多