EventBus its super classes have no public methods with the @Subscribe annotation怎么解决?

本文探讨了开启R8压缩后EventBus订阅方法异常的原因,即反射导致代码识别困难。解决方法包括关闭压缩、混淆eventBus并提供相关配置。

引用文章:
文章1: link
文章2: link

可能原因1:

使用下面这个获取eventBus单例并在activity里注册后,忘记将方法注解Subscribe (添加@Subscribe,看下列示例)

EventBus.getDefault().register(this); 
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void onMessageEvent(ITutorEventBus bus)  {
    }

可能原因2:

在build.gradle里添加了一些配置导致的,启了R8压缩 minifyEnabled true

   buildTypes {
        debug {
            minifyEnabled true  
        }
    }

那为什么开启了R8压缩就会导致上面的异常呢,是因为EventBus的注解使用了反射。

反射 (Reflection) 会导致 R8 在跟踪代码时无法识别到代码的入口点。第三方库也可能用到反射,并且由于第三方库实际上是您的应用的一部分,您 (作为应用开发者) 将负责这些库以及您自己的代码中使用的反射。第三方库可能附带了它们自己的规则,但是切记,有些库不一定是为 Android 编写的,抑或是未考虑缩减问题,因此它们可能需要其他配置。

原因2的解决方案:

1.关闭压缩,设为false即可, minifyEnabled false.
2.将eventBus添加至混淆

-keepattributes *Annotation*
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
 
# And if you use AsyncExecutor:
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值