Android Pie (9.0) WebView в многопроцессорном режиме

85
8

Начиная Android Pie (API 28), Google не разрешает использовать один экземпляр WebView в двух разных процессах.

Документация: https://developer.android.com/reference/android/webkit/WebView.html#setDataDirectorySuffix(java.lang.String)

По мере необходимости я вызывал WebView.setDataDirectorySuffix("dir_name_no_separator") но, к сожалению, я получаю исключение. Я попытался вызвать этот метод во второй службе 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)

Я не мог найти причины для этого исключения. Я не называл этот метод дважды, и я не называл его в своем основном процессе. Есть идеи?

спросил(а) 2018-08-14T17:12:00+03:00 1 год, 10 месяцев назад
1
Решение
96

Решаемые.

В моем проекте размещаются объявления AdMob, и я вызываю метод MobileAds.initialize() внутри моего класса Application onCreate(). Инициализатор рекламы загружает WebView который теперь запрещено выполнять в новом процессе, прежде чем вызывать метод WebView.setDataDirectorySuffix("dir_name_no_separator").

Когда создается второй процесс, он также проходит через тот же поток создания приложения, то есть он вызывает тот же onCreate() внутри класса Application, который вызывает MobileAds.initialize() который пытается создать новый экземпляр WebView и тем WebView вызывает авария.

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

Как я это решил?

Я получаю имя процесса, используя метод ниже, и проверяю, является ли он моим основным процессом - вызовите метод MobileAds.initialize() и, если это мой второй процесс, вызовите метод WebView.setDataDirectorySuffix("dir_name_no_separator").

Получить имя процесса:

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

Класс приложения onCreate():

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

ответил(а) 2018-08-16T17:55:00+03:00 1 год, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема