Android 设备上的 Web

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

Android 平台已存在超过十年,从早期便一直为 Web 提供出色的支持。它随 WebView 一起提供,后者是一个组件,可让开发者在自己的 Android 应用中使用网页。除此之外,Android 还允许开发者将自己的浏览器引擎引入平台,从而促进竞争和创新。

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

Android 版 WebView

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

但是,当用于创建应用内浏览器或在 Android 应用中包含 PWA 时,WebView 会缺乏 Web 平台的安全性、特性和功能。

应用内浏览器挑战

随着时间的推移,越来越多的开发者构建了将第三方内容整合到其 Android 应用中的浏览器体验,目的是为用户导航到第三方网站时打造更顺畅的体验。后来人们把这种体验称为应用内浏览器

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

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

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

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

多进程架构和网站隔离

浏览器在渲染和执行不受信任的内容时可以确保安全。为确保用户在浏览可能不可信甚至恶意的内容时的安全,新型浏览器会采用多进程架构网站隔离等技术。

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

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

对于呈现自己拥有和信任的内容的应用而言,缺少多进程架构和网站隔离不会带来问题,但运行不受信任的第三方内容(如应用内浏览器)的应用可能会出现问题,并会导致用户面临 MeltdownSpectre 等漏洞,而这些漏洞可能会被用于窃取 Cookie、银行详细信息、个人信息等。

安全界面指示标志

为用户提供良好的安全指标也很重要,浏览器在这方面付出了很多努力,并且一直在不断改进。但是,WebView 缺少可用于检查网站连接是否安全的 API,无法通过此类 API 让应用开发者能够构建可信的安全指标。例如,如果没有此类 API,可能会导致地址栏中显示的网址与向用户显示的页面不匹配,即使通过安全的 HTTPS 连接也是如此。

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

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

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

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

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

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

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

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

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

Trusted Web Activity 是在 Chrome 72 中引入的,可让开发者在 Android 应用中使用其 PWA。其协议与 Custom Tabs 协议类似,但引入了 API,让开发者能够(通过 Digital Asset Links)验证自己是否能够控制 Android 应用和打开的网址,并在两者均为 true 时移除网址栏。

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

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

当前解决方案的局限性

开发者的反馈表明,他们需要自定义标签页的平台兼容性,并结合 WebView 的灵活性,以便实现各种功能,例如访问 DOM 或将 JavaScript 注入其应用内浏览器中。

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

Google 的 Web 版团队正在研究替代方案,并尝试各种解决方案来应对这些使用情形。敬请关注详细信息!

摘要

当应用需要在其 Android 应用中使用 HTML、CSS 和 JavaScript,但不使用现代 Web 上提供的更高级的特性和功能(例如推送通知、网络蓝牙等)时,WebView 会非常有用。不建议打开专为现代网络平台设计的内容,因为其显示方式可能与开发者的预期不同。不建议通过 WebView 创建应用内浏览器。另一方面,显示第一方 Web 内容则是 WebView 的真正亮点。

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

若要打开专为 Web 平台(也称为“应用内浏览器”)设计的第三方内容,建议您使用自定义标签页。