web-dev-qa-db-fra.com

Android Pie (9.0) WebView en multi-processus

À partir de Android Pie (API 28), Google n'autorise pas l'utilisation d'une seule instance WebView dans 2 processus différents.

Documentation: https://developer.Android.com/reference/Android/webkit/WebView.html#setDataDirectorySuffix (Java.lang.String)

Comme requis, j'ai appelé WebView.setDataDirectorySuffix("dir_name_no_separator") mais malheureusement, j'obtiens une exception. J'ai essayé d'appeler cette méthode à l'intérieur du 2e processus Service onCreate ().

Java.lang.RuntimeException: Unable to create service com.myapp.service.MyService: Java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
        at Android.app.ActivityThread.handleCreateService(ActivityThread.Java:3544)
        at Android.app.ActivityThread.access$1300(ActivityThread.Java:199)
        at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1666)
        at Android.os.Handler.dispatchMessage(Handler.Java:106)
        at Android.os.Looper.loop(Looper.Java:193)
        at Android.app.ActivityThread.main(ActivityThread.Java:6669)
        at Java.lang.reflect.Method.invoke(Native Method)
        at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.Java:493)
        at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:858)
     Caused by: Java.lang.IllegalStateException: Can't set data directory suffix: WebView already initialized
        at Android.webkit.WebViewFactory.setDataDirectorySuffix(WebViewFactory.Java:136)
        at Android.webkit.WebView.setDataDirectorySuffix(WebView.Java:2165)
        at com.myapp.service.MyService.onCreate(MyService.Java:134)

Je n'ai trouvé aucune raison pour cette exception. Je n'ai pas appelé cette méthode deux fois ni je l'ai appelée dans mon processus principal. Des idées?

12
Lior Iluz

Résolu.

Mon projet héberge des publicités AdMob et j'appelle la méthode MobileAds.initialize() dans ma Application class onCreate(). L'initialiseur d'annonces charge un WebView qui est désormais interdit dans un nouveau processus avant d'appeler la méthode WebView.setDataDirectorySuffix("dir_name_no_separator").

Lorsque le deuxième processus est créé, il passe également par le même flux de création d'application, ce qui signifie qu'il appelle la même onCreate() à l'intérieur de la classe Application, qui appelle la MobileAds.initialize() qui essaie de créer une nouvelle instance de WebView et cela provoque le crash.

IllegalStateException: Can't set data directory suffix: WebView already initialized

Comment j'ai résolu cela?

J'obtiens le nom du processus en utilisant la méthode ci-dessous et vérifie s'il s'agit de mon processus principal - appelez la méthode MobileAds.initialize () et s'il s'agit de mon deuxième processus, appelez la méthode WebView.setDataDirectorySuffix("dir_name_no_separator").

Obtenir le nom du processus:

public static String getProcessName(Context context) {
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
        if (processInfo.pid == Android.os.Process.myPid()) {
            return processInfo.processName;
        }
    }

    return null;
}

Classe d'application onCreate ():

if (!Utils.getProcessName(this).equals("YOUR_SECOND_PROCESS_NAME")) {
    MobileAds.initialize(this);
} else {
    WebView.setDataDirectorySuffix("dir_name_no_separator")
}
11
Lior Iluz