Упростите реализацию WebView с помощью Jetpack Webkit

В этом руководстве описываются преимущества библиотеки Jetpack Webkit, объясняется, как она работает и как вы можете реализовать ее в своих проектах.

Обзор

WebView — неотъемлемая часть разработки для Android, но иногда их сложно контролировать из-за несоответствия функций в разных версиях ОС Android. Каждая версия ОС Android предоставляет фиксированный набор API WebView. Поскольку Android выпускается медленнее, чем WebView, API Android могут не охватывать все доступные функции WebView. Это приводит к более медленному внедрению функций и увеличению затрат на тестирование.

Jetpack Webkit решает эти проблемы, выступая в качестве уровня совместимости и используя актуальный APK-файл WebView на устройстве пользователя. Он также содержит новые современные API, доступные исключительно в этой библиотеке.

Зачем использовать Jetpack Webkit?

Помимо обеспечения совместимости между версиями, Jetpack Webkit также предлагает новые и современные API, которые могут упростить разработку и улучшить функциональность вашего приложения:

  • Обеспечивает современную аутентификацию : WebView может без проблем поддерживать современные стандарты веб-аутентификации, такие как WebAuthn , обеспечивая вход с помощью паролей. Библиотека androidx.webkit предоставляет полный контроль над этой интеграцией с помощью метода WebSettingsCompat.setWebAuthenticationSupport() , который можно использовать для настройки уровня поддержки, необходимого вашему приложению.

  • Повышение производительности : настройте производительность WebView для вариантов использования вашего приложения с помощью таких API, как prefetchUrlAsync , prerenderUrlAsync и setBackForwardCacheEnabled .

  • Повышает стабильность : восстанавливает зависшие или не отвечающие процессы рендеринга без сбоев. Подробнее см. WebViewRenderProcess#terminate() .

  • Обеспечивает детальный контроль над данными просмотра : чтобы удалить данные просмотра, сохраненные WebView для определенных источников, используйте класс WebStorageCompat .

Понять компоненты

Для эффективного использования Jetpack Webkit необходимо понимать взаимосвязь между следующими компонентами:

  • Android System WebView : это движок рендеринга на базе Chromium, который Google регулярно обновляет через Google Play с той же частотой, что и Chrome. Он содержит самые актуальные функции и предоставляет базовый код реализации для всех API WebView.

  • API фреймворка ( android.webkit ) : это API, привязанные к определённой версии ОС Android. Например, приложение на Android 10 может получить доступ только к тем API, которые были доступны на момент выпуска этой версии. Поэтому оно не может использовать новые функции, добавленные в WebView APK в более поздних обновлениях. Например, чтобы получить доступ к зависшему рендереру с помощью WebView#getWebViewRenderProcess() , этот вызов возможен только в Android 10 и более поздних версиях.

  • Библиотека Jetpack Webkit ( androidx.webkit ) : это небольшая библиотека, встроенная в ваше приложение. Эта библиотека служит связующим звеном между вызовами APK-файла WebView и API, определёнными в платформе Android, версия ОС которой фиксирована. Таким образом, даже если приложение установлено на устройстве с более старой версией ОС, например, Android 10, оно сможет использовать новейшие функции WebView. Например, WebViewCompat.getWebViewRenderProcess() работает аналогично API Framework, за исключением того, что его можно вызывать во всех версиях ОС до Android 10.

Если API доступен как в фреймворке, так и в Jetpack Webkit, мы рекомендуем выбрать версию Jetpack Webkit. Это обеспечит единообразие поведения и совместимость с широким спектром устройств.

Взаимодействие Jetpack Webkit и APK

API в Jetpack Webkit реализованы в двух частях:

  • Статический Jetpack Webkit : Статическая библиотека Jetpack Webkit содержит меньшую часть кода, отвечающего за реализацию API.

  • WebView APK : WebView APK содержит большую часть кода.

Ваше приложение вызывает API Jetpack Webkit, который затем вызывает WebView APK.

Хотя вы контролируете версию Jetpack Webkit в своём приложении, вы не можете контролировать обновления WebView APK на устройствах пользователей. Как правило, у большинства пользователей установлены актуальные версии WebView APK, но ваше приложение всё равно должно быть осторожным и не вызывать API, которые данная версия WebView APK не поддерживает.

Jetpack Webkit также избавляет от необходимости вручную проверять версии WebView. Чтобы определить доступность функции, проверьте её константу. Например, WebViewFeature.WEB_AUTHENTICATION .

Как они работают вместе

Jetpack Webkit заполняет пробел между статическим API Framework и часто обновляемым APK WebView. При использовании API Jetpack Webkit с шаблоном обнаружения функций библиотека проверяет, поддерживается ли функция установленным на устройстве пользователя APK WebView. Это позволяет избежать необходимости проверять версию ОС Android (фреймворка).

Если версия APK WebView достаточно актуальна, библиотека активирует функцию. В противном случае она сообщает о её недоступности, предотвращая сбой приложения и позволяя вам корректно разрешить ситуацию.

Сравните API Jetpack Webkit и Framework

В этом разделе сравниваются методы реализации с использованием библиотеки Jetpack Webkit и без нее:

Включить современную аутентификацию (WebAuthn)

Без Jetpack Webkit

Невозможно через API фреймворка.

С Jetpack Webkit

Использует WebViewFeature.WEB_AUTHENTICATION для проверки совместимости.

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_AUTHENTICATION)) {
  WebSettingsCompat.setWebAuthenticationSupport(
      webView.settings,
      WebSettingsCompat.WEB_AUTHENTICATION_SUPPORT_FOR_APP
  )
}

Удалить данные для источника (хранилище, привязанное к сайту)

Без Jetpack WebKit

Отсутствует прямой API для удаления данных о конкретном источнике. Часто требуется удаление всех данных.

С Jetpack WebKit

Использует совместимые API для точного удаления данных. Вы можете использовать любой из следующих вариантов:

WebStorageCompat.getInstance().deleteBrowsingData()

Или

WebStorageCompat.getInstance().deleteBrowsingDataForSite()

Получить версию WebView

Без Jetpack WebKit

Использует стандартный класс фреймворка.

val webViewPackage = WebView.getCurrentWebViewPackage()

С Jetpack WebKit

Использует уровень совместимости для более безопасного извлечения.

val webViewPackage = WebViewCompat.getCurrentWebViewPackage()

Обработка неотвечающего рендерера (клиента рендерера)

Без Jetpack WebKit

Использует стандартный метод фреймворка.

webView.setWebViewRenderProcessClient(myClient)

С Jetpack WebKit

Использует WebViewCompat и проверку функций для настройки клиента.

if (WebViewFeature.isFeatureSupported(WebViewFeature.WEB_VIEW_RENDERER_CLIENT_BASIC_USAGE)) {
  WebViewCompat.setWebViewRenderProcessClient(webView, myClient)
}

Более подробную информацию см. в справочной документации androidx.webkit .

Интегрируйте Jetpack Webkit в свой код

Использование Jetpack Webkit расширяет возможности стандартного класса WebView, но не заменяет исходный класс WebView полностью.

Вы можете продолжать использовать класс android.webkit.WebView . Вы можете добавить его в свои XML-макеты и получить ссылку на экземпляр в коде. Для доступа к стандартным функциям фреймворка вы по-прежнему можете вызывать методы непосредственно у экземпляра WebView или его объекта настроек.

Для доступа к современным функциям используются статические вспомогательные методы Jetpack Webkit, такие как WebViewCompat и WebSettingsCompat . Этим методам передаётся существующий экземпляр WebView.

Котлин

import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature

// You still get your WebView instance the standard way.
val webView: WebView = findViewById(R.id.my_webview)

// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
}

Ява

import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;

// You still get your WebView instance the standard way.
WebView webView = findViewById(R.id.my_webview);

// To enable a modern feature, you pass that instance to a Jetpack Webkit helper.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON);
}

Реализовать Jetpack Webkit

Для внедрения Jetpack Webkit используйте следующую процедуру.

Шаг 1: Добавьте зависимость

В файле build.gradle.kts или build.gradle вашего модуля включите следующую зависимость для добавления Jetpack Webkit:

классный

dependencies {
    implementation "androidx.webkit:webkit:1.14.0"
}

Котлин

dependencies {
    implementation("androidx.webkit:webkit:1.14.0")
}

Jetpack Webkit содержит тонкие оболочки, поэтому влияние на размер вашего приложения минимально.

Шаг 2: Примите шаблон обнаружения признаков

Чтобы предотвратить сбои при вызове недоступных API, используйте проверки функций. Мы рекомендуем снабдить каждый вызов API проверкой функций и, по возможности, предусмотреть резервную логику на случай недоступности API.

Мы рекомендуем следующую схему использования современного API WebView:

import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature

// In your Kotlin code where you configure your WebView
val webView: WebView = findViewById(R.id.my_webview)

// Before you use a modern API, first check if it is supported.
if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK)) {
    // If the check passes, it is safe to call the API.
    WebSettingsCompat.setForceDark(webView.settings, WebSettingsCompat.FORCE_DARK_ON)
} else {
    // Optionally, provide a fallback for older WebView versions.
}

Этот шаблон помогает обеспечить надёжность приложения. Поскольку проверка функции выполняется первой, приложение не аварийно завершает работу, если функция недоступна. Накладные расходы на проверку WebViewFeature#isFeatureSupported() незначительны.