APP使用 XX加固助手 加固之后,在安卓 7.x.x 系统中会崩溃:错误信息为 java.lang.AssertionError: illegal type variable reference。
java.lang.AssertionError: illegal type variable reference。
未加固之前并没有出现这个问题。
网络搜索发现,大部分都说是开启混淆之后没配置好导致的,所以,根据网络搜索结果先检查 module 的 build.gradle 和 proguard-rules.pro 中的配置。
minifyEnabled
proguard-rules.pro
-keepattributes EnclosingMethod
如果添加了上述内容之后依旧不生效,可添加下面的内容:
-keepattributes Exceptions,InnerClasses,Signature,Deprecated, SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
如果方案一中该配置的都处理了,但是在使用第三方加固时报错了,那说明第三方加固中配置了混淆参数,所以,此时我们只能修改我们代码中的内容。
通过LOG或者BUGGLY查看具体的错误位置。如下图:
输入图片说明
在上图中,我们可以定位到问题所在,是我们内部AFragment中的第159行和另一个BFragment中的132行。最终问题是指向 AFragment中的159行,那么,这里干了啥呢?
//GsonUtil.stringToList(str)是我们自己封装的一个工具类List<String> settingList = GsonUtil.stringToList(userSetting);
stringToList(str)的具体逻辑为:
public static <T> ArrayList<T> stringToList(String gsonString) { ArrayList<T> list = null; //gson即Gson对象 if (gson != null) { list = gson.fromJson(gsonString, new TypeToken<ArrayList<T>>() { }.getType()); } return list; }
然后重复测试发现如下规律:
根据上述规律猜测大致的问题原因如下:
在 B 中我们分析了问题原因应该是没有获取到数据类型,那么我们就需要想法子让 getType()拿到具体的数据类型。
List<String> settingList = new ArrayList<>();list = new Gson().fromJson(userSetting, new TypeToken<ArrayList<String>>() { }.getType());
上述代码中,在构造 TypeToken 对象时,我们指定了 ArrayList 接收参数的类型为 String,而不再是T。重新加固并安装运行 —— 不再报错!!
/** * 转成list */public static <T> ArrayList<T> stringToList(String gsonString, Class<T> cls) { ArrayList<T> list = new ArrayList<>(); if (gson != null) { JsonArray array = new JsonParser().parse(gsonString).getAsJsonArray(); for (final JsonElement elem : array) { list.add(gson.fromJson(elem, cls)); } } return list;}
在上述代码中,我们不再直接转换为List,而是使用GSON解析每一个对象,并且传入 .class —— 有了 .class 也就可以确定类型。重新加固并安装运行——不再报错!
对于为啥加固之后只有7.x.x 的系统报错,这个一直没有想明白,如果你知道,请务必留言告知,谢谢!
本文到此结束,谢谢观看! 如有不足,敬请指正!
先说下环境: 项目是老项目 jdk用的是1.8 然后用新版的Android Studio 3.1 雪狐版 IDE推荐使用jdk 11 用新版的AS跑老项目出现的问题 一、java.lang.AssertionError: annotationType(): unrecognized Attribut ...