我将 Android Studio 更新为 Flamingo、Gradle 和库。 之后,如果通过 Android Studio 从模拟器中安装该应用程序,则该应用程序运行良好,但如果使用捆绑包从 Play 商店安装该应用程序,则该应用程序会失败。我认为如果从 .apk 文件安装它就可以工作。
我得到了例外:
java.lang.IllegalArgumentException: class o4.b isn't parameterized
让我在这里写下我的解决方案,以防对其他人有帮助。
几个小时后,发现异常发生在这段代码中:
Type type = new TypeToken<ArrayList<String>>() {}.getType();
我需要使用 Gson.fromJson() 函数的代码。
TypeToken 是使用以下方式导入的:
import com.google.common.reflect.TypeToken;
我不得不改为:
import com.google.gson.reflect.TypeToken;
然后我遇到了另一个错误:
RuntimeException:缺少类型参数
我解决了这个答案:https://stackoverflow.com/a/72520577/1363087
在 proguard-rules.pro 文件中我添加了以下内容:
-keep class com.google.gson.reflect.TypeToken
-keep class * extends com.google.gson.reflect.TypeToken
-keep public class * implements java.lang.reflect.Type
这一切让我损失了大量的时间。我希望我没有更新 Android Studio 或依赖项。
就我而言,我必须保留模型类和 TypeToken,如果我删除任何一个,它就不起作用。
用于保留模型类
# Application classes that will be serialized/deserialized over Gson
-keep class com.example.data.models.** { *; }
用于保留TypeToken
# This is also needed for R8 in compat mode since multiple
# optimizations will remove the generic signature such as class
# merging and argument removal.
# https://r8.googlesource.com/r8/+/refs/heads/main/compatibility-faq.md#troubleshooting-gson-gson
-keep class com.google.gson.reflect.TypeToken { *; }
-keep class * extends com.google.gson.reflect.TypeToken