Android WebView начал падать на Android 9 - PullRequest
10 голосов
/ 18 мая 2019

Привет, Эксперт Разработчики Android:

У нас есть приложение для Android, и наш основной рабочий процесс выглядит следующим образом

  1. Пользователь отправляет ссылку по электронной почте или текстовое сообщение
  2. Пользователь нажимает на ссылку, и страница открывается в браузере Chrome или Android по умолчанию и имеет кнопку с именем JOIN
  3. Пользователь нажимает эту кнопку JOIN , и наше приложениезапускается, и в веб-просмотре отображается страница с просьбой ввести имя, фамилию и телефон / адрес электронной почты, а затем пользователь нажимает кнопку с именем INITIATE
  4. Мы проверяем информацию - еслипользователь новый, мы создаем запись, она существует, мы обновляем ее и т. д., а затем показываем всплывающее окно, сообщающее, что его сеанс будет записан.
  5. Как только пользователь нажимает OK во всплывающем окне, а затем появляется элемент управления, веб-просмотр и пользователь попадают на собственную страницу Android.

Проблема Как только кнопка «ОК» будет нажата в веб-просмотре, где наша родная страница приложения будет запускаться в обычном режиме до нескольких недель назад, приложение вылетает, и мы возвращаемся к началу страницы веб-просмотра, прося нас ввести данные.

Обратите внимание на следующие предостережения:

  • Прежде всего это происходит только в случае Android 9. Мы протестировали это на Samsung Galaxy S8 и S9.И это происходит не каждый раз, но это происходит довольно регулярно, я бы даже сказал, 2 раза из 3.В лучшем случае это происходило 2 раза из 10, но это случалось.
  • Этот код успешно выполнялся последние 1 год или около того, и у нас никогда не было этой проблемы.Это начало происходить только в последние 3-4 недели.
  • У нас также есть приложение для iOS, в котором такая же проблема не наблюдается.

Вот фрагмент кода, который можетhelp - это то, как мы загружаем веб-просмотр.

webview = findViewById(R.id.webview);
    webview.setVisibility(View.VISIBLE);
    final ProgressDialog pd = ProgressDialog.show(ActivtyName.this, "", "Please wait", true);
    webview.setGeolocationEnabled(true);
    webview.setMixedContentAllowed(true);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setDomStorageEnabled(true);
    webview.getSettings().setLoadWithOverviewMode(true);

    webview.setWebChromeClient(new WebChromeClient()

======= Мы переопределяем множество методов, за которыми следует

webview.setWebViewClient(new WebViewClient()

======= Здесь мы переопределяем методы.

Есть идеи, что может происходить?Мы пытались просматривать журналы во время отладки через режим USB, но мы не видим ничего в журналах, кроме того, что показано на консоли Android, как показано ниже:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
pid: 0, tid: 0 >>> com.a****d.xyzapp <<<

backtrace:

#00  pc 0000000001b61620  /data/app/com.android.chrome-DpcaMBOCm2oa08upmw1Tug==/base.apk

Вот более подробный журнал по запросу:

2019-05-18 11:58:01.694 23217-23217/com.a**d.xyzapp.debug A/chromium: 

[FATAL:crashpad_client_linux.cc(404)] Render process (28925)'s crash wasn't handled by all associated  webviews, triggering application crash.
Fatal signal 5 (SIGTRAP), code 1 (TRAP_BRKPT), fault addr 0x7ab7b9d620 in tid 23217 (atientapp.debug), pid 23217 (atientapp.debug) (edited) 

Ответы [ 5 ]

1 голос
/ 29 мая 2019

Вы используете рекламную платформу mopub?если это так, у них есть эта ошибка, связанная с их sdk.
Обычно это связано с ошибкой на веб-странице, которую пытаются загрузить.
Существует также изменение в том, как работает webview с Android 8.0 выше.Теперь он основан на многопроцессорности, что также дает вам возможность обрабатывать ошибки такого рода (рендерер пропал, не хватает памяти и многие другие).
Вы должны реализовать это переопределение

public boolean onRenderProcessGone(WebView view, RenderProcessGoneDetail detail)

Подробнееоб этом здесь

Обновление: Если вы используете mopub или даже веб-браузер, Android 9.0 блокирует весь трафик не https.Рассмотрите возможность использования альтернативного способа, как в mopub реализовано здесь .

0 голосов
/ 30 мая 2019

В вашем случае процесс Render завершается сбоем и не уничтожается системой.

Так, как описано здесь , если вы переопределите

onRenderProcessGone(WebView view,
            RenderProcessGoneDetail detail)

выше, чем методdetail.didCrash() будет содержать true в вашем случае.В этом случае Renderer аварийно завершил работу из-за внутренней ошибки, например, из-за нарушения доступа к памяти.Само приложение аварийно завершает работу после обнаружения сбоя средства визуализации.

Чтобы обработать сбой и позволить вашему приложению продолжить выполнение, вы должны выполнить следующие шаги: -

  1. уничтожить текущий экземпляр WebView.
  2. Укажите свою бизнес-логику, как приложение может продолжать выполняться.
  3. Переопределить onRenderProcessGone и вернуть true.

Проблема Как только ОКНа веб-просмотре нажимается кнопка, в которой обычная страница приложения будет запускаться до тех пор, пока несколько недель назад не произойдет сбой приложения, и мы вернемся к началу страницы веб-просмотра с просьбой ввести данные.

Это связано с тем, что при сбое средства визуализации при загрузке определенной веб-страницы попытка загрузки этой же страницы может привести к тому, что новый объект WebView будет демонстрировать то же поведение при сбое рендеринга.

Проверка кода в эта ссылка для получения дополнительной информации.

Надеюсь, это поможет.

0 голосов
/ 30 мая 2019

Попробуйте использовать

        android:usesCleartextTraffic="true"

в теге приложения - в вашем AndroidManifest

0 голосов
/ 30 мая 2019

Надеюсь, это та же проблема, с которой я сталкивался ранее.В Android 9 происходит несколько изменений, касающихся безопасности.Таким образом, в основном по умолчанию он блокирует все URL-адреса и домены для использования в приложении, которые не защищены или не сертифицированы SSL.

Сетевой TLS включен по умолчанию Если ваше приложение предназначено для Android 9 или выше, isCleartextTrafficPermitted ()Метод возвращает false по умолчанию.Если вашему приложению необходимо включить открытый текст для определенных доменов, вы должны явно установить для cleartextTrafficPermitted значение true для этих доменов в конфигурации безопасности своего приложения.

Либо вам нужно сделать этот домен SSL сертифицированным и добавить этот кодв манифесте

<applicaton ....>
<uses-library
            android:name="org.apache.http.legacy"
            android:required="false" />
</application>

также добавьте приведенный ниже код в блок зависимостей файла вашего приложения build.gradle:

dependencies {
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
}

, и если вам сейчас неудобно защищать свой домен, то вытакже может исключить этот домен в конфигурации сети.Подробная процедура упоминается на этой странице

Конфигурация безопасности для Android

0 голосов
/ 29 мая 2019

Это похоже на проблему с памятью, которую я могу найти из нескольких тем.

Сделайте это в своем фрагменте / активности веб-просмотра. переопределите onLowMemory () и добавьте журнал.

@Override
public void onLowMemory() {
    Log.d("TAG_MEMORY", "Memory is Low");
    super.onLowMemory();
}

Теперь попробуйте воспроизвести сбой, и , если onLowMemory () вызывается , то это является основной причиной. Возможно, на некоторых страницах веб-просмотра слишком много памяти.

...