Android OS 6.0 清空静态变量

Android OS 6.0 nulling static variables

我在 Google Play 中有一堆痕迹,似乎应用程序 class 的静态成员为空。

我找到的所有相关帖子都是关于存储数据的,但这些变量不是数据,它们是第 3 方 SDK 实例或其他与应用程序一起使用单例模式的关键对象。

Activity classes 中使用的数据存储在数据库中,那里没有使用静态引用。

这些痕迹根本没有报告给 Fabric,这很奇怪,因为它是在 Application onCreate 方法中初始化的。

跟踪表明当FirebaseMessagingService onMessageReceived方法被触发时静态变量为null,我需要将消息传递给第3方SDK但由于该实例为null应用程序崩溃.

只有 Android OS 6.0

才能看到痕迹

是否有任何解决方案可以解决这个 OS 版本如此积极地取消静态成员的问题?

谢谢。

这是我使用的示例最小代码:

申请class:

@Override
public void onCreate() {
    Engine.init();
}

引擎class:

private static Engine sInstance;

private 3rdParty m3rdParty;

private Engine() {
    m3rdParty = new 3rdParty();
}

public static void init() {
    if (sInstance == null) {
        sInstance = new Engine();
    }
}

public static onMessageReceived(RemoteMessage remoteMessage) {
    sInstance.m3rdParty.onMessageReceived(remoteMessage);
    // Above line crashes with NPE, sEngine or m3rdParty is never set to null in code
}

扩展的 FirebaseMessagingService:

public void onMessageReceived(RemoteMessage remoteMessage) {
    Engine.onMessageReceived(remoteMessage);
}

Are there any solutions on how to deal with this OS version being so aggressive nulling static members?

"OS" 不是 "nulling static members"。最有可能的是,您的进程已终止,无论是由于内存不足还是用户操作(例如,将您的任务从概览屏幕上滑出)。这是完全正常的。

我说"most likely",因为你的问题不包含minimal, complete, and verifiable example,堆栈跟踪和相关源代码,所以我不能排除其他可能性。例如,如果您的代码在某些条件下将 null 分配给那些 static 字段,那么在您不期望的情况下可能会满足这些条件。