以前没有写blog的习惯,导致有些解决过的问题又出现的话依然要像面对新问题一样重新找原因修bug,所以决定从今天开始养成记录的好习惯。
最近公司外访的app经常出现莫名其妙的问题,经常一言不合就崩溃了。还好有腾讯优测(http://utest.qq.com/)。经过分析后(在AS中直接运行到手机中不会出现问题,打包后再安装就崩溃,查看日志又找到了一堆at com a.a.c.a.a(Unknown Source)之类的,判断应该是混淆导致的)。
百度关键字:
发现这事跟GSON脱不了干系。
打开一个攻略,发现和我的问题差不多,而且刚好我这个页面也引用了GSON,于是按照他所说的方法在混淆文件(proguard-android.txt)中添加了相应代码,果然解决了,非常感谢这位网友。以下是攻略原文:
Android混淆后运行程序出现异常:Missing type parameter
对程序进行混淆,打包发布版apk,再用真机对该发布版apk进行测试,发现所有有网络请求的页面都无法显示出数据,查看log,发现如下异常:
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+zfjJz7Lpwcuy6Q=="Missing type parameter"这个问题到底是什么原因引起的,可以看到这样的回答因为程序中用到了gson的new typeToken。那应该是在混淆的文件里对typetoken相关的类做了混淆,导致运行时程序不能识别。看上图的
at com a.a.c.a.a(Unknown Source)这个应该就是被混淆的不能识别的类。为了进一步证实,还是查看下混淆后生成的文件mapping.txt来找出混淆后的类com a.a.c.a.a对应的是程序中的哪个类,如下图:
可以确定是指向了com.google.gson.reflect.TypeToken
然后就在混淆文件里proguard-android.txt(我在Android Studio0.3.7上用的该txt对程序进行混淆,很多以往的项目都是在proguard.cfg里)加上这句话:
-keep class com.google.gson.** {*;} 表示对该类不执行proguard操作网上也可查到很多解决办法,例如下面两个
android混淆编译——问题汇总 和stackoverflow上的 proguard Missing type parameter
在 proguard.cfg中添加
-dontobfuscate -dontoptimize # Gson uses generic type information stored in a class file when working with fields. Proguard # removes such information by default, so configure it to keep all of it. -keepattributes Signature # Gson specific classes -keep class sun.misc.Unsafe { *; } #-keep class com.google.gson.stream.** { *; } # Application classes that will be serialized/deserialized over Gson -keep class com.google.gson.examples.android.model.** { *; }但是这样配置后,打包发布版的apk后运行还是出现同样的错误,问题并没有解决。
纠结过后,想想问题既然出在混淆了不该混淆的类上,而且是在进行获取网络数据时报错的,又已经排除了TypeToken类被混淆导致的问题(已经写了-keep class com.google.gson.** {*;}还出现Missing Type patamerer的问题),那应该是程序在执行到TypeToken之前就遇到了被混淆的类,查看程序中获取网络数据并进行json格式转换操作的相关代码,发现:
在获取接口数据的模块中引用了org.json下的类,但proguard-android.txt中没有对这部分类做保留操作。
在proguard-android.txt中加入:
-keep classorg.json.** {*;} 再打包发布版的apk,运行正常,问题解决啦!