相关疑难解决方法(0)

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)
    }
Run Code Online (Sandbox Code Playgroud)

加载,例如,ArrayList<String>我只是这样做:

   SharedPreferencesHelper.loadList<String>(
            context,
            FILE_NAME,
            KEY,
            ArrayList())
Run Code Online (Sandbox Code Playgroud)

我发现的问题是,当我运行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)
Run Code Online (Sandbox Code Playgroud)

我找到的唯一解决方案是在这里,但这意味着要提供typeas参数。

我认为这是一个潜在的问题,原因有两个:

  • 这不是警告,也不是坏习惯(是吗?),它是一个非常好的函数,可以在加载随后序列化的JSONArray时节省很多样板代码。当Proguard处于顶部时,同一项目的开发人员可能不会意识到这是一个问题。
  • 测试一段代码是否正常的唯一方法是运行Proguard,换句话说,平均要等待3分钟才能进行构建。在单元和UI测试中进行大量测试也很有帮助,但是有些团队没有这种可能性。

我的问题是,还有其他解决方法吗?

java generics android proguard gson

5
推荐指数
0
解决办法
437
查看次数

标签 统计

android ×1

generics ×1

gson ×1

java ×1

proguard ×1