В этом руководстве описаны преимущества библиотеки 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 Store с той же периодичностью, что и Chrome. Он содержит самые актуальные функции и предоставляет базовый код реализации для всех API WebView.
API фреймворка (
android.webkit) : это API, которые привязаны к конкретной версии ОС Android. Например, приложение на Android 10 может получить доступ только к тем API, которые были доступны на момент выпуска этой версии. Таким образом, оно не может использовать новые функции, добавленные в APK WebView в более поздних обновлениях. Например, чтобы получить доступ к не отвечающему рендереру с помощьюWebView#getWebViewRenderProcess(), этот метод можно вызвать только на Android 10 и выше.Библиотека Jetpack Webkit (
androidx.webkit) : это небольшая библиотека, входящая в состав вашего приложения. Она выступает в качестве моста, вызывающего API из APK-файла WebView, а не API, определенные на платформе Android, которая имеет фиксированную версию ОС. Таким образом, даже если приложение установлено на устройстве с более старой версией ОС, например Android 10, оно может использовать новейшие функции WebView. Например,WebViewCompat.getWebViewRenderProcess()работает аналогично API фреймворка, за исключением того, что его можно вызывать на всех версиях ОС до Android 10.
Если API доступен как в фреймворке, так и в Jetpack Webkit, мы рекомендуем выбрать версию Jetpack Webkit. Это поможет обеспечить согласованную работу и совместимость на максимально широком спектре устройств.
Взаимодействие Jetpack Webkit и APK
API в Jetpack Webkit реализованы в двух частях:
Статическая библиотека Jetpack Webkit : статическая библиотека Jetpack Webkit содержит меньшую часть кода, отвечающего за реализацию API.
WebView APK : APK-файл WebView содержит большую часть кода.
Ваше приложение обращается к API Jetpack Webkit, который затем вызывает APK-файл WebView.
Хотя вы можете контролировать версию Jetpack Webkit в своем приложении, вы не можете контролировать обновления APK-файла WebView на устройствах пользователей. Как правило, у большинства пользователей установлены актуальные версии APK-файла WebView, но ваше приложение все равно должно быть осторожным и не вызывать API, которые не поддерживаются данной версией APK-файла WebView.
Jetpack Webkit также избавляет от необходимости вручную проверять версии WebView. Чтобы определить, доступна ли функция, проверьте её константу. Например, WebViewFeature.WEB_AUTHENTICATION .
Как они взаимодействуют
Jetpack Webkit устраняет разрыв между статическим API фреймворка и часто обновляемым APK-файлом WebView. При использовании API Jetpack Webkit с шаблоном определения функций библиотека проверяет, поддерживается ли данная функция установленным на устройстве пользователя APK-файлом WebView. Это дает преимущество в том, что не нужно проверять версию ОС Android (фреймворка).
Если APK-файл WebView достаточно новой версии, библиотека активирует эту функцию. В противном случае она сообщает о недоступности функции, предотвращая сбой вашего приложения и позволяя вам корректно обработать ситуацию.
Сравните API Jetpack Webkit и фреймворка.
В этом разделе сравниваются методы реализации с использованием библиотеки 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)
}
Java
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.15.0" }
Котлин
dependencies { implementation("androidx.webkit:webkit:1.15.0") }
Jetpack Webkit содержит тонкие оболочки, поэтому его влияние на размер вашего приложения минимально.
Шаг 2: Примените шаблон обнаружения признаков.
Чтобы предотвратить сбои при вызове недоступных API, используйте проверки функциональности. Мы рекомендуем окружать каждый вызов API проверкой функциональности и, возможно, рассмотреть логику резервного копирования на случай недоступности API.
Для использования современного API WebView мы рекомендуем следующий подход:
Котлин
import android.webkit.WebView
import androidx.webkit.WebSettingsCompat
import androidx.webkit.WebViewFeature
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.
}
Java
import android.webkit.WebView;
import androidx.webkit.WebSettingsCompat;
import androidx.webkit.WebViewFeature;
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.getSettings(), WebSettingsCompat.FORCE_DARK_ON);
} else {
// Optionally, provide a fallback for older WebView versions.
}
Этот подход помогает обеспечить надежность приложения. Поскольку проверка наличия функции выполняется первой, приложение не аварийно завершит работу, если функция недоступна. Накладные расходы на производительность проверки WebViewFeature#isFeatureSupported() незначительны.