jaydenxiao2016 / AndroidFire

AndroidFire,一款新闻阅读 App框架,基于 Material Design + MVP + RxJava + Retrofit + Glide,基本涵盖了当前 Android 端开发最常用的主流框架,基于此框架可以快速开发一个app。
https://github.com/jaydenxiao2016/AndroidFire.git
2.64k stars 811 forks source link

混淆打包后,转换异常 #33

Open yuejinsheng opened 7 years ago

yuejinsheng commented 7 years ago

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

liangning121 commented 7 years ago

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

yuejinsheng commented 7 years ago

混淆没有配好,

liangning121 commented 7 years ago

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

GuoZhaoHui628 commented 7 years ago

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

 java.lang.ClassCastException: java.lang.Object cannot be cast to com.jaydenxiao.common.base.c
GuoZhaoHui628 commented 7 years ago

@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 commented 7 years ago

这个问题终于解决了。并不是他们说的将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.** { *; }