Android混淆后运行程序出现异常:Missing type parameter

对程序进行混淆,打包发布版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.**{*;}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值