混淆泛型造成的应用逻辑问题getGenericType()

最近在一个支付sdk项目里发现一个问题,客户拿去集成后发现充值记录,消费记录查询不到,但是使用抓包软件发现,明明是获取到数据的,那么为什么显示不出来?而且没有任何报错呢?如果有异常信息的话,可能是很容易找到问题所在的,但是这次的居然没抛异常。。

我从获取数据的代码,一路追踪,发现是解析数据出了问题,服务端返回的是xml字符串,sdk需要把它解析为一条条记录,展示到界面上

上解析xml的部分代码:

混淆泛型造成的应用逻辑问题getGenericType()_第1张图片

而这个问题还有趣在于:我本地跑的demo没问题,可以正常查询记录,但是客户打包的就有问题。

做了对比之后发现,demo版本,图中log打印处是:

java.util.List

客户集成的版本,打印出来的type是interface java.util.List

想到有可能是混淆问题,但是看了混淆配置后发现,RechargeRecordResponseParamsDetail这个类是跳过混淆的,那么这就很奇怪了。。

继续跟踪,type是从getGenericType()方法返回的,那么就看看这个方法:

混淆泛型造成的应用逻辑问题getGenericType()_第2张图片

发现它主要是获取对象的详细类型,这时候注意到了它里面的一个if语句,于是想:客户那边不能正确解析,会不会就是因为走了这个if语句呢?

好在这个getType方法是公开的,我把代码里面的getGenericType()直接改成了getType(),运行发现:果然,神奇的一幕,没有任何报错,查询到的记录就是不显示。

百度搜索了getGenericType()这个方法之后,发现果然有前辈遇到和我同样的问题,附上链接:http://stackoverflow.com/questions/20072703/field-getgenerictype-returns-instance-of-java-lang-class-instead-of-type

看了后,发现果然是混淆的问题

添加如下的混淆配置,忽略泛型混淆就可以了

-keepattributes Signature
sdk和app都需要添加此配置,记录才可以正常查询了,问题解决。

这里再提醒一下,在使用instanceof关键字,用一些类似的判断句时

if (type instanceof ParameterizedType)

强烈建议在else分支抛出异常,或者打印出问题,不然后期出现问题,找的好麻烦



你可能感兴趣的:(android)