lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. Start survey

概览

Android 免安装应用使原生 Android 应用能够在启动网址时运行,无需安装应用。 当 Google Play 商店收到与 免安装应用匹配的网址请求时,它将必需的代码文件发送到发送该请求的 Android 设备。 然后,该设备将运行此应用。

注:Android 免安装应用仅在运行 Android 6.0(API 级别 23)或更高版本的 Android 设备上正常工作。

应用即功能

Android 免安装应用为开发者构建应用和用户使用应用提供了一种新颖而独特的方式。 在介绍 Android 免安装应用的核心概念之前,了解一些基本术语很有用处。

基本而言,应用至少有一项功能(即应用执行的操作):例如,查找地图上的位置、发送电子邮件或读取每日新闻。 许多应用都提供多种功能。 例如,除查找地图上的位置外,地图应用可能还允许用户查找附近的餐馆或通过电子邮件发送位置链接。

每一个此类操作(查找位置、查找附近的餐馆、分享位置链接)都是地图应用中的一项功能。

借助 Android 免安装应用,用户可以从 Google Play 商店下载某个应用的某项功能,而无需下载和安装整个应用。 当用户从免安装应用请求一项功能时,他们仅收到运行该特定功能所必需的代码,不多也不少。 在用户使用完此功能后,系统可以丢弃该功能的代码。

回到前面的地图应用示例,该地图免安装应用可将其每项功能对外显示为该应用中的某个分散实体。

用户可以只下载和使用位置查找器功能,也可以只下载和使用餐馆指南功能或分享功能。 在用户切换到另一个应用后,系统可以安全地移除此功能的代码。

免安装应用中的每项功能应至少有一个可充当该功能入口点Activity 类。 入口点 Activity 可托管此功能的 UI,并定义整个用户流。 当用户在其设备上启动此功能时,他们首先看到的是入口点 Activity。 一项功能可以有多个入口点 Activity,但它只需要一个。

功能模块和功能 APK

要提供按需功能下载,您需要将应用分解成较小的模块,并将它们打包成功能模块

在构建免安装应用项目时,构建输出是一个包含一个或多个功能 APK 的免安装应用 APK。 每项功能 APK 都是从项目中的功能模块构建的,可以由用户按需下载,并且可以作为免安装应用进行启动。

每个免安装应用都必须有且仅有一个基础功能 APK。 如果您的免安装应用只有一项功能,那么,您只需要基础功能 APK;其他功能 APK 是可选的。如果您的免安装应用具有多项功能,则基础功能 APK 通常包含其他功能所依赖的共享资源和代码文件。 像地图免安装应用一样,基础 APK 可能包含此地图应用的基础 styles.xml 文件或数据结构类,以用于位置和景点建模。 无论用户请求哪项功能,均会下载基础功能 APK。

除基础功能 APK 外,您还可以有其他功能 APK。 其他功能 APK 可以包含与某项功能对应的应用片段。 功能 APK 包含针对该功能的入口点 Activity,以及该功能所需的任何独特资源。

当用户从免安装应用请求一项功能时,他们将获得两个功能 APK:所请求的功能 APK 和基础功能 APK。 如果同一个用户从该免安装应用请求另一项功能,他们可能只会收到该功能 APK,因为他们已下载基础功能 APK。 当然,如果免安装应用只有一项功能,因而只有一个基础功能 APK,则用户只会收到基础功能 APK。

下图描绘了免安装应用 APK 和功能 APK 之间的关系。

从 Google Play 商店请求功能

要从 Google Play 商店下载免安装应用的一项功能,用户只需点击一个链接。 当 Google Play 商店收到针对某个免安装应用的请求时,它将解析网址以确定用户请求哪项功能。 在找到匹配的功能后,Google Play 商店将与该功能对应的功能 APK 发送到用户设备,然后,免安装应用运行时启动该功能。 如果 Google Play 商店无法找到匹配的功能,它将在设备上提醒免安装应用运行时。 然后,免安装应用运行时将向系统发送一个广播 Intent 以便处理该网址。

因此,免安装应用中的每个入口点 Activity 都必须可寻址:它需要与一个唯一的网址对应。 如果免安装应用中各个功能的网址共享一个网域,则每项功能都需要与该网域中的一个不同路径对应。

继续上述地图免安装应用示例,该应用具有三项独立的功能:位置查找器、附近餐馆和共享位置。 这些功能共享一个网域,“example.com”。 要为每项功能提供一个唯一的网址,免安装应用须在每项功能的网域下面指定一个不同的路径。

功能 网址
位置查找器 http://example.com/finder
附近餐馆 http://example.com/restaurants
共享位置 http://example.com/share

如前所述,一项功能可具有多个入口点 Activity。 例如,一项功能可能具有两个相互关联的 Activity,用户可在这两个 Activity 之间进行切换,其中每个 Activity 都有自己的网址。 功能清单需要为每个 Activity 指定一个路径,如果存在多个匹配,则为 Activity 指定一个优先级顺序。

例如,想象一下,地图免安装应用的位置查找器功能具有两个 Activity,一个搜索 Activity 和一个详情 Activity。 详情 Activity 的网址与搜索 Activity 的网址相似,区别在于详情 Activity 的网址后面还附加了一个数值 ID。

Activity 网址 网址路径 优先级
搜索 http://example.com/finder/ '/查找器/' 1
详情 http://example.com/finder/<ID> '/查找器/*' 100

如果 Google Play 商店收到针对网址“http://example.com/finder/1234”的请求,那么,它与搜索 Activity 和详情 Activity 都匹配。 Google Play 商店需要从这两个 Activity 中选出一个 Activity 作为该功能的起点。 由于此免安装应用规定详情 Activity 的优先级高于搜索 Activity,因此,Google Play 商店指示免安装应用运行时从详情 Activity 启动此功能。

后续步骤

要开始开发您自己的免安装应用,请查看入门指南