Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Как устроен Android WebView?

Как устроен Android WebView?

Доклад на тему того как работает Android WebView под капотом, как организован процесс рендеринга и его потенциальные проблемы.

Evgeny

June 02, 2023
Tweet

Other Decks in Programming

Transcript

  1. Android WebView и Chromuim.
    Подводные камни рендеринга
    1.03.2023
    Мамруков Евгений, Android разработчик LS Growth

    View Slide

  2. § Проблема. Crash МБ на экране ТЦ
    § Определение причины и поиск решения
    § Android WebView и Chromium
    § Chromium. Обработка рендеринга
    § Решение проблемы. GeckoView и Safe Browsing
    § Итоги
    План
    2

    View Slide

  3. Проблема. Экран ТЦ
    3

    View Slide

  4. Проблема. Crash МБ на экране ТЦ
    4

    View Slide

  5. Определение причины и поиск решения
    5

    View Slide

  6. Поиск решения. Обработка завершения процесса рендеринга
    6

    View Slide

  7. § Вызов onRenderProcessGone() не выполнялся при крэше WebView
    § Поведение не соответствует вызову
    § Приложение падает с ANR
    § Аналогичное поведение при открытии url в браузере Chome
    Поиск решения. Обработка завершения процесса рендеринга
    7

    View Slide

  8. Android WebView и Chromium. Общая схема
    8
    Host Application
    android.webkit.Webview
    WebViewProvider
    Android Framework
    AwContents
    ContentViewCore
    Rendering Engine
    Chromium Content Layer

    View Slide

  9. § RenderView представляет собой Window (render thread, parent hwnd)
    § Управляет объектом WebView (ShowModalHTMLDialog(),
    RunJavaScriptAlert(), RunJavaScriptPrompt(), RunFileChooser())
    § Управляет деревом элементов
    § Включает в себя межпроцессные обработчики сообщений (OnUndo(),
    OnRedo(), OnCut(), OnCopy(), OnPaste(), OnFind(), OnZoom() и т. д.)
    Обработка рендеринга. RenderView
    9

    View Slide

  10. § RenderViewHost отвечает за создание и
    взаимодействие с RenderView
    § Предоставляет высокоуровневый API
    (Загрузка страниц, определение гранц
    экрана и т. д.)
    § Взаимодействует с RenderView через
    межпроцессные сообщения
    Обработка рендеринга. RenderViewHost
    10
    RenderViewHost
    RenderView
    IPC Messages
    API

    View Slide

  11. § Вызывается ~GpuProcessHost()
    § Выполняется проверка на
    завершение процесса
    § Выполняется проверка статуса
    завершения процесса
    Завершение рендеринга. GpuProcessHost
    11

    View Slide

  12. § Выполняется проверка Termination
    Status
    § Формируется соответствующее
    сообщение о завершении
    Завершение рендеринга. Termination Status
    12

    View Slide

  13. § Выполняется проверка Termination
    Status
    § Формируется соответствующее
    сообщение о завершении
    Завершение рендеринга. Termination Status
    13

    View Slide

  14. § Termination status определяется не
    напрямую, а косвенно через strong
    process
    Завершение рендеринга. Termination Status
    14

    View Slide

  15. § Обрабатывает сообщение
    onRenderProcessGone
    § Отправляется соответствующий
    сингал в Android Web View
    Завершение рендеринга. Web View Terminator
    15

    View Slide

  16. Завершение рендеринга. Crash процесса
    16
    § Крэш процесса рендеринга
    приводит к крэшу приложения.
    Внештатная ошибка не
    обрабатывается, пишется только
    лог об ошибке
    § Корректное завершение процесса
    рендеринга системой
    сопровождается отправкой
    сигнала, которое отслеживается в
    Android Web View

    View Slide

  17. Завершение рендеринга. Crash процесса
    17
    § Крэш процесса рендеринга
    приводит к крэшу приложения.
    Внештатная ошибка не
    обрабатывается, пишется только
    лог об ошибке
    § Корректное завершение процесса
    рендеринга системой
    сопровождается отправкой
    сигнала, которое отслеживается в
    Android Web View

    View Slide

  18. Решение проблемы. GeckoView
    18

    View Slide

  19. Решение проблемы. Safe Browsing
    19
    § Рендеринг WebView
    выполняется в
    отдельном процессе
    § Механизм
    поддерживается
    начиная с Android 8.0

    View Slide

  20. § Mozilla Gecko View как решение проблемы
    § Рендеринг Android Web View в отдельном процессе исключает крэш
    исходного приложения
    § На версиях Android Web View > 74 виджет 2Gis работает корректно
    Итоги
    20

    View Slide

  21. Спасибо за внимание!

    View Slide