Интеграция Android WebView в мобильные приложения

Иван Корнев·6 августа 2026·3 мин

Android WebView — это компонент для отображения веб-страниц внутри Android-приложения без использования внешнего браузера. Он интегрирует HTML, CSS и JavaScript прямо в нативный макет активности.

Оглавление

Что такое Android WebView и зачем он нужен

Начиная с Android 4.4, компонент основан на движке Chromium, что гарантирует высокую производительность и совместимость с современными веб-стандартами. Важно понимать, что это расширение класса View, а не полноценный браузер: у него нет адресной строки и панели навигации.

Основные сценарии использования:

  • Отображение динамического контента: пользовательские соглашения и документация, которые обновляются на сервере без выпуска новой версии приложения.
  • Гибридные приложения: использование оптимизированных веб-страниц вместо нативного интерфейса для работы с сетевыми данными.
  • Быстрая разработка: переиспользование существующего веб-кода вместо создания полностью нативного решения.

Пошаговая инструкция по использованию

Добавление в макет

Разместите элемент в XML-разметке активности:

<WebView
 android:id="@+id/webview"
 android:layout_width="match_parent"
 android:layout_height="match_parent" />

Или создайте программно в методе onCreate():

val myWebView = WebView(activityContext)
setContentView(myWebView)

Доступ к сети и загрузка данных

Обязательно укажите разрешение на работу с сетью в файле AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

Загрузка удаленной страницы:

val myWebView: WebView = findViewById(R.id.webview)
myWebView.loadUrl("https://example.com")

Поддерживается загрузка локальных файлов из папки assets:

myWebView.loadUrl("file:///android_asset/www/index.html")

Или передача HTML-строк в формате Base64:

val unencodedHtml = "<html><body>Hello World</body></html>"
val encodedHtml = Base64.encodeToString(unencodedHtml.toByteArray(), Base64.NO_PADDING)
myWebView.loadData(encodedHtml, "text/html", "base64")

Настройка JavaScript и навигации

По умолчанию JavaScript отключен. Включите его через настройки компонента:

val webSettings = myWebView.settings
webSettings.javaScriptEnabled = true

Чтобы ссылки открывались внутри компонента, а не вызывали внешний браузер, переопределите WebViewClient:

myWebView.webViewClient = object : WebViewClient() {
 override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
 if (Uri.parse(url).host == "www.example.com") {
 return false
 }
 Intent(Intent.ACTION_VIEW, Uri.parse(url)).apply {
 startActivity(this)
 }
 return true
 }
}

Обработка кнопки «Назад»

Для корректного перехода по истории компонента переопределите системную кнопку:

override fun onBackPressed() {
 if (myWebView.canGoBack()) {
 myWebView.goBack()
 } else {
 super.onBackPressed()
 }
}

Связь с нативным кодом

Используйте WebAppInterface для вызова функций Android из JavaScript:

class WebAppInterface(private val mContext: Context) {
 @JavascriptInterface
 fun showToast(toast: String) {
 Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show()
 }
}
webView.addJavascriptInterface(WebAppInterface(this), "Android")

Теперь из JavaScript можно вызывать функцию Android.showToast("Сообщение").

Безопасность и лучшие практики

Уязвимости компонента могут привести к XSS-атакам и фишингу. Соблюдайте строгие правила конфигурации:

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

  • Ограничьте доступ к файловой системе: webView.settings.allowFileAccess = false.
  • Запретите универсальный доступ из файловых URL: webView.settings.allowUniversalAccessFromFileURLs = false.
  • Используйте исключительно HTTPS-соединения.
  • Валидируйте URL-адреса перед загрузкой, разрешая только доверенные домены.
  • Включите Safe Browsing API (доступен с Android 8.1) для защиты от известных угроз.
  • Замените устаревший addJavascriptInterface на современный addWebMessageListener для более безопасной коммуникации.
  • Запретите открытие новых окон для предотвращения popup-атак: webView.settings.setSupportMultipleWindows(false).

Производительность и современные возможности

Современный компонент обеспечивает высокую скорость работы и богатый функционал:

  • Аппаратное ускорение GPU делает CSS-анимации плавными.
  • Service Workers обеспечивают полноценную офлайн-работу веб-приложений.
  • WebAssembly (Wasm) выполняет сложные вычисления на скорости, близкой к нативному коду.

Для мгновенного отклика на касания используйте CSS-свойство touch-action: manipulation. Для оптимизации прокрутки длинных страниц применяйте content-visibility: auto.

Альтернативы WebView

В некоторых сценариях безопаснее и эффективнее использовать другие подходы:

  • Trusted Web Activities (TWA) — отображают контент в полноценном браузере пользователя с нативной интеграцией.
  • Custom Tabs — открывают страницы в браузере, сохраняя элементы дизайна вашего приложения.

Эти методы повышают безопасность, так как JavaScript выполняется в изолированной среде браузера с регулярными обновлениями.

Частые ошибки

  • Забытое разрешение на интернет: без <uses-permission android:name="android.permission.INTERNET" /> в манифесте страницы не будут загружаться.
  • Открытие ссылок во внешнем браузере: по умолчанию любой клик по ссылке внутри компонента вызывает стандартный браузер устройства. Необходимо переопределять shouldOverrideUrlLoading.
  • Игнорирование истории навигации: без переопределения onBackPressed() кнопка «Назад» сразу закроет приложение, а не вернет пользователя на предыдущую страницу внутри компонента.
  • Включенный JavaScript без необходимости: повышает риск XSS-атак и снижает общую производительность.

FAQ

Можно ли загружать локальные HTML-файлы? Да, компонент поддерживает загрузку файлов из папки assets приложения с помощью протокола file:///android_asset/.

Поддерживается ли работа без интернета? Да, благодаря поддержке Service Workers компонент обеспечивает полноценную офлайн-работу веб-приложений.

Чем компонент отличается от полноценного браузера? Он является расширением класса View и не содержит адресной строки, панели навигации и других элементов управления, характерных для браузеров.