确保Android应用程序在单个进程中运行

Yrl*_*lec 8 java sqlite android multiprocessing firebase

由于应用程序在多个进程中打开,我们最近开始在我们的Android应用程序中遇到崩溃.几个不同的错误指向了这一点.比如这个错误:

com.google.firebase.database.DatabaseException:无法获得对Firebase数据库的脱机持久性的独占锁定.这通常意味着您正在使用应用中多个进程的Firebase数据库.请记住,多进程Android应用程序在所有进程中执行Application类中的代码,因此您可能需要避免在Application类中初始化FirebaseDatabase.如果您有意从多个进程使用Firebase数据库,则只能在其中一个进程中启用脱机持久性(即调用setPersistenceEnabled(true)).

我们也看到了SQLite和H2的类似错误.这是一个新问题,我们没有明确允许多个进程运行.我们的AndroidManifest.xml中没有任何内容指定自定义的android:process属性.

我怀疑某些第三方库造成了这种情况.如何确定多个流程的根本原因以及如何预防?

我们的另一个应用是通过ContentProvider连接到此应用.起初我认为它android:multiprocess="true"是罪魁祸首但将其改为"假"并没有帮助.我仍然怀疑其他应用程序以某种方式触发了新进程的创建.这是如何定义ContentProvider:

  <provider
        android:name=".DegooContentProvider"
        android:authorities="${applicationId}.DegooContentProvider"
        android:exported="true"
        android:protectionLevel="signature"
        android:multiprocess="false">
    </provider>
Run Code Online (Sandbox Code Playgroud)

Lin*_*182 2

您可以检查您的应用程序类是否有国外进程。这是一个例子:

public class MyApp extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        if (!isMainProcess()) {
            // Do not call thread unsafe logic. Just return
            return;
        }
        // Thread unsafe logic.
        ...
    }

    private boolean isMainProcess() {
        int pid = android.os.Process.myPid();
        ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
        for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
            String currentProcName = processInfo.processName;
            if (processInfo.pid == pid) {
                if (TextUtils.equals(currentProcName, BuildConfig.APPLICATION_ID)) {
                    return true;
                }
            }
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)