【发布时间】:2021-03-12 14:15:46
【问题描述】:
不知何故,从一个应用程序发布到另一个应用程序的内部 org.json 库损坏了。它不能再将键的内容作为字符串读取。这是一个在启用 minify/R8/proguard 时可以正常工作的代码示例。
try {
parseJson("{\"rewards\":[{\"amount\":1,\"name\":\"Add Audio\"}]}");
} catch (Exception e) {
Log.w("TEST", "Error parsing rewarded currencies JSON header!!!", e);
}
private void parseJson(@NonNull String rewardedCurrencies) throws JSONException {
final Map<String, String> rewardsMap = jsonStringToMap(rewardedCurrencies);
for (Map.Entry<String, String> entry : rewardsMap.entrySet()) {
Log.e("TEST", entry.getKey() + ":" + entry.getValue());
}
}
public Map<String, String> jsonStringToMap(String jsonParams) throws JSONException {
Map<String, String> jsonMap = new HashMap<String, String>();
if (TextUtils.isEmpty(jsonParams)) return jsonMap;
JSONObject jsonObject = (JSONObject) new JSONTokener(jsonParams).nextValue();
Iterator<String> keys = jsonObject.keys();
Log.e("TEST", "jsonStringToMap() -> jsonObject: "+jsonObject.toString());
while (keys.hasNext()) {
String key = (String) keys.next();
Log.e("TEST", "jsonStringToMap() -> key: "+key);
jsonMap.put(key, jsonObject.getString(key));
}
return jsonMap;
}
失败的日志输出:
jsonStringToMap() -> jsonObject: {"rewards":[{"amount":1,"name":"Add Audio"}]}
jsonStringToMap() -> key: rewards
Error parsing rewarded currencies JSON header!!!
j.b.b: JSONObject["rewards"] not a string.
at j.b.d.getString(SourceFile:4)
那么自上次发布有效的应用程序以来,该项目发生了哪些变化?
targetSdkVersion 28 -> 29
sourceCompatibility JavaVersion.VERSION_1_7 -> JavaVersion.VERSION_1_8
'com.android.tools.build:gradle:4.0.0' -> 'com.android.tools.build:gradle:4.1.1'
distributionUrl -> gradle-6.1.1-all.zip -> gradle-6.5-all.zip
解决方法是在 proguard 脚本中应用一个新行。
-keep class org.json.** { *; }
现在我很担心。为什么我需要将此应用于proguard?是否有其他内部库可能破坏?我似乎无法弄清楚这是什么原因造成的,以及这是否是一个潜在的大问题?
【问题讨论】:
-
你能告诉我们堆栈跟踪并告诉我们发生在哪一行吗?
-
我也无法找出程序的预期输出。你能解释一下这个函数的作用吗?也许这将指向根本问题
-
@JensV 感谢您的提醒!忘记添加日志了。
-
堆栈跟踪中缺少异常名称
-
突然想到:你能看看你的依赖关系吗?可能有一个提供
org.json的库,您正在使用它而不是标准库,然后被保护掉......
标签: android android-studio proguard minify android-r8