You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启用Android Studio代码混淆后触发IllegalAccessError,求解决方案

启用ProGuard后EventBus触发IllegalAccessError问题解决

问题现象

启用代码混淆(minifyEnabled=true)后编译运行抛出java.lang.IllegalAccessError,关闭混淆则正常运行,错误指向EventBus初始化环节。

报错日志

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.android.systemui, PID: 10439
java.lang.IllegalAccessError: tried to access field android.os.Looper.sThreadLocal from class org.greenrobot.eventbus.android.AndroidDependenciesDetector
    at org.greenrobot.eventbus.android.AndroidDependenciesDetector.isAndroidSDKAvailable(AndroidDependenciesDetector.java:12)
    at org.greenrobot.eventbus.android.AndroidComponents.<clinit>(AndroidComponents.java:11)
    at org.greenrobot.eventbus.Logger$Default.get(Logger.java:65)
    at org.greenrobot.eventbus.EventBusBuilder.getLogger(EventBusBuilder.java:157)
    at org.greenrobot.eventbus.EventBus.<init>(EventBus.java:114)
    at org.greenrobot.eventbus.EventBus.<init>(EventBus.java:110)
    at org.greenrobot.eventbus.EventBus.getDefault(EventBus.java:88)
    at com.android.systemui.MainActivity.registerEventBus(MainActivity.java:81)
    at com.android.systemui.MainActivity.onCreate(MainActivity.java:70)
    at android.app.Activity.performCreate(Activity.java:5281)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1101)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
    at android.app.ActivityThread.access$800(ActivityThread.java:135)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:788)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:604)
    at dalvik.system.NativeStart.main(Native Method)

相关代码

MainActivity中EventBus注册逻辑:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    registerEventBus();
    binding = ActivityMainBinding.inflate(getLayoutInflater());
    setContentView(binding.getRoot());
    init();
    Intent intent = new Intent(this, SystemService.class);
    startService(intent);

}

private void registerEventBus() {
    if (!EventBus.getDefault().isRegistered(this)) {
        EventBus.getDefault().register(this);
    }
}

@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onMessageEvent(UpdateMessage message){
    EventBus.getDefault().removeStickyEvent(message);
    updateTime();
}

当前配置

build.gradle配置

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

proguard-rules.pro配置

-keepattributes *Annotation*
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
-keep class android.**{*;}

解决方案

问题根源是ProGuard混淆优化时,EventBus内部的AndroidDependenciesDetector类尝试访问Android系统类Looper的私有字段sThreadLocal,但混淆后该字段的访问权限被限制。需补充以下混淆规则:

方案1:保留EventBus核心类

更新proguard-rules.pro,添加:

# 保留EventBus核心类及安卓相关组件
-keep class org.greenrobot.eventbus.** { *; }
-keep class org.greenrobot.eventbus.android.** { *; }

方案2:精准权限放行(推荐)

若不想保留全部EventBus类,可添加更精准的规则:

# 允许EventBus访问Looper的私有静态字段
-keepclassmembers class android.os.Looper {
    private static android.os.ThreadLocal sThreadLocal;
}

# 保留EventBus的安卓依赖检测相关类
-keep class org.greenrobot.eventbus.android.AndroidDependenciesDetector { *; }
-keep class org.greenrobot.eventbus.android.AndroidComponents { *; }

额外排查点

如果使用proguard-android-optimize.txt仍有问题,可尝试替换为proguard-android.txt(关闭部分激进优化),或临时添加-dontoptimize(不建议全局关闭优化,仅用于排查)。

验证方法

重新编译混淆后的版本,启动App检查是否再出现该异常,同时验证EventBus的订阅、发布功能是否正常。

内容的提问来源于stack exchange,提问作者Ouanu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:01:04