AndroidFire icon indicating copy to clipboard operation
AndroidFire copied to clipboard

混淆打包后,转换异常

Open yuejinsheng opened this issue 8 years ago • 6 comments

mModel = TUtil.getT(this, 1); 这个方法就转换异常, mPresenter = TUtil.getT(this, 0);可以得到,我就奇怪了

yuejinsheng avatar Jul 12 '17 07:07 yuejinsheng

请问这个问题解决了么 我现在也是打包混淆之后 类型转换异常

liangning121 avatar Aug 22 '17 07:08 liangning121

混淆没有配好,

yuejinsheng avatar Aug 22 '17 07:08 yuejinsheng

请问哪句混淆配置可以解决啊 我把作者本人的混淆配置都加进去了还是报错

liangning121 avatar Aug 22 '17 07:08 liangning121

这个问题解决没,我也碰到了同样的问题,打包安装后 转换错误

 java.lang.ClassCastException: java.lang.Object cannot be cast to com.jaydenxiao.common.base.c

GuoZhaoHui628 avatar Oct 11 '17 03:10 GuoZhaoHui628

@yuejinsheng @liangning121 你好!你们的这个问题解决没,是怎么回事,我研究两三天了。。。。还是没搞清楚为什么会出现这种情况,这打包出来的apk反编译我也对比看了下,

 Caused by: java.lang.ClassCastException: java.lang.Object cannot be cast to kstar.mycommon.base.b

这是报错的地方,反编译出来找到这代码如下 qq 20171026110614 根据报错的地方找到代码位置是下面 mModel= TUtil.getT(this,1);

        mPresenter = TUtil.getT(this, 0);
        mModel= TUtil.getT(this,1);

为什么要报错不是上面那行,这代码感觉差不多的额,特别这两个文件BasePresenter BaseModel都已经被混淆了,唯一的区别就是一个是抽象类一个是接口 qq 20171026111117 我看了其他中有关混淆的issue,他们说将TUti可以解决这个问,但是其实这个类的类名已经被混淆了,只是里面的代码没有而已,如下图 qq 20171026111432 这个有点不懂怎样将这个类的内容混淆,只知道怎样keep保持里面的内容不被混淆,网上也没查到。 最主要的问题,这个项目clone下的代码,打包编译出来的apk也是报这个错 好吧 大佬们,这到底什么情况,有知道的麻烦说一声,我真的要被这个玩疯了

GuoZhaoHui628 avatar Oct 26 '17 03:10 GuoZhaoHui628

这个问题终于解决了。并不是他们说的将TUtil混淆。本来开启混淆后会无差别的混淆其他代码,只是因为我们对一些保护了才留下来一些没被混淆的代码,所以我就奇怪怎么还能主动混淆其中一个文件,再说如果是这个文件的问题,那么在前面那行代码

 mPresenter = TUtil.getT(this, 0);

就该报错了,怎么提示是下面的问题。再说作者在混淆文件下面配置了反射相关的方法是不被混淆的,这个工具类下面的所有代码都不被混淆。

#---------------------------------4.反射相关的类和方法-----------------------
##对commonutils报下的代码不警告
-dontwarn kstar.mycommon.commonutils.**

-keep class kstar.mycommon.commonutils.** { *; }

#----------------------------------------------------------------------------

所以报错应该是强转两个对象之间的问题。根据这个思路 我将两个对象的代码都保护起来,果然没问题了。我自己的代码如下,可能每个人代码类的结构不一样,反正思路是一样的BaseModel的子类要保护,不能混淆,混淆强转就有问题

#BaseModel类所在的位置
-keep class kstar.mycommon.base.** { *; }
#BaseModel子类,我们业务类所在的位置
-keep class com.kstar.device.ui.login.model.** { *; }

GuoZhaoHui628 avatar Oct 27 '17 02:10 GuoZhaoHui628