java Proguard破坏了我的清洁。Gson和泛型
我有一个从持久性加载信息的函数,我只是用一种非常简单的方式告诉类型。这个类叫做SharedPreferencesHelper.kt
,所以它是一个真正的生活问题解决者:
fun <T> loadList(context: Context, fileName: String, key: String, defValue: ArrayList<T>) : ArrayList<T> {
val gson = MyGsonDependency.getInstance()
val json = getWithFileName(context, fileName).getString(key, gson.toJson(defValue))
return gson.fromJson(json, object : TypeToken<ArrayList<T>>() {}.type)
}
例如,要加载ArrayList<String>
,我只需执行以下操作:
SharedPreferencesHelper.loadList<String>(
context,
FILE_NAME,
KEY,
ArrayList())
我发现的问题是,当我运行Proguard并混淆我的代码时,每当我调用object : TypeToken<ArrayList<T>>() {}.type
时,我都会得到一个异常:
Caused by: java.lang.AssertionError: illegal type variable reference
at libcore.reflect.TypeVariableImpl.resolve(TypeVariableImpl.java:111)
at libcore.reflect.TypeVariableImpl.getGenericDeclaration(TypeVariableImpl.java:125)
at libcore.reflect.TypeVariableImpl.hashCode(TypeVariableImpl.java:47)
at java.util.Arrays.hashCode(Arrays.java:4074)
at com.google.gson.internal.$Gson$Types$ParameterizedTypeImpl.hashCode(Unknown Source:2)
at com.google.gson.reflect.TypeToken.<init>(Unknown Source:23)
我找到的唯一解决方案是was here,但它意味着提供type
作为参数
我认为这是一个潜在的问题,原因有二:
- 这不是警告,也不是坏习惯(是吗?),这是一个非常好的函数,在加载之后序列化的JSONArray时可以节省大量样板代码。当Proguard处于顶层时,同一项目的开发人员可能没有意识到这是一个问题李>
- 测试一段代码是否有效的唯一方法是运行Proguard,换句话说,平均等待3分钟进行构建。在单元和UI测试中有一个大的测试覆盖率也有很大帮助,但有些团队没有这种可能性李>
我的问题是,有没有其他方法来解决这个问题
共 (0) 个答案