Garantizar carreras de aplicaciones para Android en un solo proceso

Yrlec:

Recientemente hemos empezado a correr en accidentes en nuestra aplicación para Android debido a la aplicación de estar abierto en múltiples procesos. Varios errores diferentes apuntan en esa dirección. Por ejemplo, este error:

com.google.firebase.database.DatabaseException: No se ha podido obtener un bloqueo exclusivo en línea a la persistencia de Firebase base de datos. Esto generalmente significa que está utilizando Firebase base de datos desde múltiples procesos en su aplicación. Tenga en cuenta que varios procesos se ejecutan aplicaciones de Android el código en su clase de aplicación en todos los procesos, lo que puede tener para evitar la inicialización FirebaseDatabase en su clase de aplicación. Si está utilizando intencionadamente Firebase base de datos desde múltiples procesos, sólo se puede activar en línea persistencia (es decir setPersistenceEnabled llamada (verdadero)) en una de ellas.

También estamos viendo errores similares de SQLite y H2. Este es un tema nuevo y no hemos explícitamente permitido que varios procesos se ejecutan. Nada en nuestra AndroidManifest.xml especifica una costumbre atributo android: proceso.

Sospecho que algunos biblioteca de terceros está causando esto. ¿Cómo se identifica la causa raíz de los múltiples procesos y cómo puedo evitarlo?

Otra de nuestras aplicaciones se conecta a esta aplicación a través de un ContentProvider. Al principio pensé que teniendo android:multiprocess="true"era el culpable, pero cambiándolo a "falso" no ayuda. Todavía sospecho que la otra aplicación es de alguna manera provocando la creación de un nuevo proceso. Esta es la forma de la ContentProvider se define:

  <provider
        android:name=".DegooContentProvider"
        android:authorities="${applicationId}.DegooContentProvider"
        android:exported="true"
        android:protectionLevel="signature"
        android:multiprocess="false">
    </provider>
Link182:

Se puede comprobar en su clase applicaition si hay proceso extranjera. Aquí hay un ejemplo:

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;
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=147088&siteId=1
Recomendado
Clasificación