Android R8 обфускация с flex Json дублирование ключа - PullRequest
0 голосов
/ 13 марта 2020

Обфусцируя приложение android с помощью R8 и minifyEnabled true в build.gradle, он добавляет дубликат ключа, как показано ниже в одном из ответов веб-службы.

Ответ: {"key1":"value1", ......., "key1":"value1"} он добавляет «ключ1» несколько раз и flex Json выдает исключение и вылетает приложение

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, также flex Json используется одной из библиотек, включенных в проект.

1 Ответ

0 голосов
/ 16 марта 2020

В общем, вы должны убедиться, что все поля, которые используются для генерации JSON путем отражения, охватываются правилом хранения. В противном случае имя в JSON может измениться от сборки к сборке. Также R8 использует свойство, которое среды выполнения JVM и Android позволяют полям разных типов иметь одно и то же имя, вы можете оказаться в ситуации, описанной здесь.

Один вариант может заключаться в аннотировании всех классов, которые сериализовать и использовать правило хранения следующим образом:

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

или, если все эти классы находятся в отдельном пакете:

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