Android 设备上的 Web

如何使用不同的组件在 Android 应用中呈现 Web 内容。

Android 平台已经存在了十多年,自早期以来,它就对 Web 提供了强大的支持。它随附了 WebView,该组件允许开发者在自己的 Android 应用中使用 Web。不仅如此,Android 还允许开发者将自己的浏览器引擎引入平台,从而促进竞争和创新。

开发者可以通过多种方式在 Android 应用中添加 Web 内容。WebView 经常用于呈现广告、作为与 Android 界面元素一起使用的布局组件,或用于打包 HTML 5 游戏。借助自定义标签页,开发者可以构建应用内浏览器,并提供无缝的第三方 Web 内容导航体验;借助 Trusted Web Activity,开发者可以在 Android 应用中使用其渐进式 Web 应用 (PWA),这些应用可从 Play 商店下载。

Android 版 WebView

WebView 让开发者可以在其 Android 应用中使用现代 HTML、CSS 和 JavaScript,并允许将内容随 APK 一起发布或托管在互联网上。它是 Android 中最灵活、最强大的组件之一,可用于在 Android 应用中包含 Web 内容的大多数应用场景。从为 AdMob 等广告服务提供支持,到构建和发布使用 WebGL 等现代 API 的完整 HTML5 游戏,不一而足。

不过,如果使用 WebView 创建应用内浏览器或在 Android 应用中添加 PWA,则无法获得 Web 平台的安全性、功能和能力。

应用内浏览器方面的挑战

随着时间的推移,越来越多的开发者在 Android 应用中构建了整合第三方内容的浏览器体验,旨在为用户在浏览第三方网站时打造更顺畅的体验。这些体验被称为应用内浏览器

WebView 广泛支持现代 Web 技术栈,并支持许多现代 Web API,例如 WebGL。但 WebView 主要是一个 Web 界面工具包。它并非旨在支持 Web 平台的所有功能,实际上也不支持。如果某个 API 已有操作系统级替代方案(例如 Web Bluetooth),或者需要实现浏览器界面(例如推送通知),则可能不受支持。随着 Web 平台不断发展,并添加更多以前仅适用于 Android 应用的功能,这一差距将变得更大。由于应用开发者无法控制在打开第三方内容时使用哪些功能,因此 WebView 不适合用作应用内浏览器或用于打开渐进式 Web 应用。即使 WebView 实现了对所有 Web 平台功能的支持,开发者仍需要编写代码并实现自己的界面,以实现权限或推送通知等功能,因此很难为用户提供一致的体验。

将 WebView 用作应用内浏览器的安全注意事项

WebView 允许嵌入器应用完全访问所呈现的内容,包括 Cookie 和 DOM。这些功能非常强大,需要用户高度信任。

由于 WebView 并非用于构建浏览器的框架,因此它不具备现代浏览器中提供的安全功能。

多进程架构和网站隔离

浏览器在设计上可确保在呈现和执行不受信任的内容时保持安全。为了确保用户在浏览可能不可信甚至恶意的内容时保持安全,现代浏览器采用了多进程架构和网站隔离等技术。

如果没有多进程架构,网页导致的崩溃可能会导致整个浏览器应用崩溃,或者漏洞可能会被利用来控制整个设备。网站隔离功能可增加一层安全保护,让不可信网站更难访问和窃取其他网站的信息。

在 Android 8.0 Oreo 之前,WebView 渲染程序与嵌入器应用使用相同的进程。在较新版本的操作系统上,如果设备性能足够强大,渲染程序会在不同的进程中运行。不过,所有页面和运行这些页面的 WebView 实例仍会共享一个进程,因此无法完全实现网站隔离。

对于呈现其拥有和信任的内容的应用,缺少多进程架构和网站隔离功能并不是问题,但对于运行不受信任的第三方内容的应用(例如应用内浏览器),这可能会成为一个问题,并使用户面临 Meltdown 和 Spectre 等漏洞,这些漏洞可用于窃取 Cookie、银行详细信息、个人信息等。

安全界面指示器

此外,向用户提供良好的安全指标也很重要,浏览器在这方面投入了大量精力,并且一直在不断改进。不过,WebView 缺少用于检查网站连接是否安全的 API,而该 API 可让应用开发者构建值得信赖的安全指示器。缺少此类 API 可能会导致地址栏中显示的网址与向用户显示的网页不匹配,即使通过安全的 HTTPS 连接也是如此。

开发者还可以选择在应用中嵌入浏览器引擎。除了导致应用大小增加之外,这种方法既复杂又耗时。

自定义标签页作为应用内浏览器的解决方案

自定义标签页是在 Chrome 45 中引入的,可让开发者将用户默认浏览器中的标签页用作其应用的一部分。自定义标签页最初由 Chrome 推出,因此被称为“Chrome 自定义标签页”。现在,它是一个 Android API,并且大多数热门浏览器(包括 Chrome、Firefox、Edge 和 Samsung Internet)都支持自定义标签页,因此更适合将其称为“自定义标签页”。

自定义标签页可帮助开发者将 Web 内容无缝集成到其应用体验中。此外,开发者还可以自定义显示 Web 内容的 activity,例如自定义工具栏颜色、操作按钮、过渡动画等。

它们还提供了一些以前在使用 WebView 或嵌入浏览器引擎时无法使用的功能。由于应用内浏览器由用户的浏览器提供支持,因此自定义标签页会与浏览器共享存储空间,这样用户就不必在每次通过安装式应用启动应用内浏览会话时重新登录其喜爱的网站。

与 WebView 不同,自定义标签页支持为其提供支持的浏览器所支持的所有 Web 平台功能和 API。

使用 Trusted Web Activity 打开渐进式 Web 应用

渐进式 Web 应用为 Web 带来了许多曾经仅适用于平台专用应用的行为和功能。随着类似应用的行为的引入,开发者在 Android 上重复使用这些体验的意愿有所增加,并且开发者开始寻求将 PWA 集成到其应用中的方法。

自定义标签页支持所有现代 Web 功能和 API,但由于它主要用于打开第三方内容,因此顶部有一个工具栏,用于告知用户他们正在访问哪个网址,以及指示网站是否安全的锁形图标。打开应用自己的体验时,工具栏会阻止应用感觉像是与操作系统集成。

Trusted Web Activity 是在 Chrome 72 中引入的,可让开发者在 Android 应用中使用其 PWA。其协议与自定义标签页协议类似,但引入了 API,可让开发者验证(通过 Digital Asset Links)他们是否同时控制 Android 应用和正在打开的网址,并在两者都为 true 时移除网址栏。

他们还引入了相关 API,用于在打开 PWA 时创建启动画面,或委托 Android 代码处理 Web 通知。更多功能(例如对 Play 结算服务的支持)即将推出。

由于在 Trusted Web Activity 中打开的网址应为 PWA,并且具有一组行为和性能特征,因此 Trusted Web Activity 为在其中打开的 PWA 引入了质量标准。

当前解决方案的局限性

开发者反馈表明,他们需要将自定义标签页的平台兼容性与 WebView 的灵活性相结合,以便在应用内浏览器中访问 DOM 或注入 JavaScript。

自定义标签页实际上是由用户浏览器呈现的标签页,具有自定义界面或根本没有界面。这意味着,浏览器需要满足用户对浏览器隐私和安全性的期望,从而导致其中一些功能无法实现。

Google 的 Web on Android 团队正在研究替代方案,并尝试通过各种解决方案来解决这些用例。敬请关注详细信息!

摘要

如果应用需要在其 Android 应用中使用 HTML、CSS 和 JavaScript,但不需要使用现代 Web 上提供的更高级功能(例如推送通知、Web 蓝牙等),则 WebView 非常有用。在打开专为现代 Web 平台设计的内容时,不建议使用此模式,因为内容可能无法按照开发者预期的方式显示。 不建议使用 WebView 创建应用内浏览器。另一方面,WebView 非常适合显示第一方 Web 内容。

如果开发者希望在 Android 应用中全屏呈现自己的渐进式 Web 应用,则应使用 Trusted Web Activity。它可以作为应用中的唯一 activity 使用,也可以与其他 Android activity 一起使用。

自定义标签页是打开专为 Web 平台设计的第三方内容(也称为应用内浏览器)的推荐方式。