对程序进行混淆,打包发布版apk,再用真机对该发布版apk进行测试,发现所有有网络请求的页面都无法显示出数据,查看log,发现如下异常:
网上查了查"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,运行正常,问题解决啦!
==============================================================================
问题:集成了Share SDK以后,混淆出现问题。
解决:针对上面提示的错误,代码中没有加class ,正确的为:-keep class cn.sharesdk.** {*;}
如果用到新浪授权,加上:
-keep class com.sina.**{*;}