使用 FullLifecycleObserver 时出现非法访问错误

Illegal access error while using FullLifecycleObserver

提问人:Madhur Lalit 提问时间:12/28/2021 更新时间:12/30/2021 访问量:601

问:

我一直在我的项目中使用 FullLifecycleObserver,但最近在将我的应用程序的 Android Gradle 插件更新到 7.0.2 后,我收到以下崩溃。

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.demo, PID: 463
    java.lang.IllegalAccessError: Interface androidx.lifecycle.FullLifecycleObserver implemented by class com.myapp.AndroidXLifecycle$Wrapper is inaccessible (declaration of 'com.myapp.AndroidXLifecycle$Wrapper' appears in /data/app/~~7rat7QSnMLMmpeTBuQ9x4Q==/com.example.demo-NJOtI6dh-fR3aEGN-YGrjg==/base.apk)

在进一步挖掘时,我发现 Flutter 开发人员也遇到了这个问题,并且在 Proguard 文件中声明更改将对他们有用,如下所示:

-keep class androidx.lifecycle.FullLifecycleObserver
 

但这也没有产生任何影响。

除了降级gradle插件版本之外,还有其他解决方案吗?

gradle android-gradle-plugin proguard androidx android-lifecycle

评论


答:

0赞 Madhur Lalit 12/30/2021 #1

发现错误和解决方案。

错误:Android Gradle 插件更新后,访问 FullLifecycleObserver 一直是一个问题,因为使用它不会给出任何编译时警告,但会导致在运行时解析其类路径时出现问题,从而导致此错误。我将其用于其生命周期回调(onResume,onPause,onStop等)来处理生命周期观察器

解决方案:使用 androidx.lifecycle.Lifecycle.Event(一个表示 Lifecycle 和 LifecycleEventObserver 不同状态的枚举),它提供 onStateChanged 回调,可以在该回调下处理 Lifecycle.Event,这是一个很好的替代方案。我用过这个,现在没有遇到这个错误。

示例代码如下:

public class MyLifecycle implements LifecycleEventObserver {

    @Override
    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull androidx.lifecycle.Lifecycle.Event event) {
        switch (event){
            case ON_CREATE:
                break;
            case ON_START:
                break;
            case ON_RESUME:
                break;
            case ON_PAUSE:
                break;
            case ON_STOP:
                break;
            case ON_DESTROY:
                break;
            case ON_ANY:
                break;
        }
    }
}