本页针对开发免安装应用时可能遇到的最常见问题或错误提供解答及解决方法。如需了解有关用户体验指导原则的详细信息,请参阅 UX best practices for apps on Google Play Instant 和 UX best practices for games on Google Play Instant。
一般问题
- 哪些设备支持使用 Google Play Instant?
大部分运行 Android 5.0 (API level 21) 及更高版本的设备都支持 Google Play Instant。
- 开发者是否需要构建两种不同的 Android 应用?
开发者只需使用一个源树维护一个项目。开发者可以配置项目以创建两个构建工件:
- 安装版
- 免安装应用版本
在安装版应用中添加免安装应用支持所涉及的工作,取决于该安装版应用目前的结构。
注:免安装应用版本必须与最新发布的安装版应用版本相同或更低。
- 免安装应用可以使用哪些不同类型的 Android API 和功能?
Google Play Instant 功能是对现有 Android 应用的补充。这意味着,它不会代替现有的 Android 应用。它使用相同的 Android API、相同的项目以及相同的源代码,而且会限制某些不符合用户对未安装应用的预期的功能。例如,免安装应用无法使用后台服务、发送后台通知或访问唯一设备标识符。
- 用户能否选择永久安装应用?
开发者可以使用
showInstallPrompt()
方法允许用户从 Google Play 安装应用。 -
Google Play Instant 如何管理权限?
Google Play Instant 使用 Android 6.0(API 级别 23)中引入的运行时权限模型。
- 免安装应用可以使用哪些权限?
请参阅免安装启动应用软件包指南权限部分的列表。
- 免安装应用应该面向哪个 SDK 版本?
免安装应用清单必须将
targetSdkVersion
设置为26
或更高。 - 免安装应用处理网络流量的方式是否有任何限制?
所有来自免安装应用内部的网络流量都必须使用
HTTPS
。免安装应用不支持HTTP
。 - 开发者如何发布免安装应用?
开发者通过 Google Play Console 发布其免安装应用,方法与发布现有 Android 应用相似。如需了解详细信息,请参阅分发免安装应用。
- 免安装应用是否需要 Smart Lock?
是的,要求用户登录的应用必须实现 Android 上的 Smart Lock(密码专用)。
- 我能否在无安装版 Android 应用的情况下实现免安装应用?
不能,您需要在 Google Play 上提供安装版 Android 应用。
- 是否可对视图使用 WebP?
可以,对于视图,您应使用 WebP 来格式化图像。
- 免安装应用在 Google 网页搜索中如何显示?
免安装应用在搜索结果中的显示方式与安装版应用相同。如果免安装应用与网址关联,则应用会显示应用图标及包含“免安装”文字的标签。
- 是否可以使用 Google Play Instant 来分发游戏?
可以,Google Play Instant 为游戏提供全面支持。若要开始分发游戏,请了解如何将现有游戏转换为免安装应用。
项目结构、功能及架构
- 免安装应用和安装版应用是否有独立的
build.gradle
文件?如果从同一个 Android Studio 项目构建安装版应用和免安装应用,则需要两个独立的
build.gradle
文件。- 请从使用
com.android.application
构建规则的模块中构建安装版应用。 - 请从使用
com.android.instantapp
构建规则的模块中构建免安装应用。
如需了解有关如何创建免安装应用的详细信息,请参阅有关如何将功能模块转换为免安装应用的指南。
- 请从使用
- 能否在免安装应用之外单独构建安装版应用?
建议的项目结构(如将应用转换为基础功能模块和将功能模块转换为免安装应用指南中所述)优先考虑将功能划分到多个库模块中,而安装版应用和免安装应用依赖于这些库模块。如果您遵循建议的项目结构,则可在安装版应用之外单独构建每项功能。
- 免安装应用是否支持 NDK?
是的。运行 Android 5.0(API 级别 21)及更高版本的设备支持 NDK。
- 如何在免安装应用的 Activity 之间导航?
通过启动其他功能专用的网址,即可在不同 Activity 之间导航。您需要通过网址来处理 Activity。如需了解有关通过网址来处理 Activity 以及实现应用链接的详细信息,请参阅提供免安装应用的网址访问权。
- 能否根据需要在主应用中使用一个路由 Activity 来处理深层链接和调用其他 Activity?
免安装应用还需要功能模块化。中央路由 Activity 会给模块化带来限制。使用 Android 应用链接,不但能使 Android 框架执行路由,还能实现更大程度的模块化。
- 一项功能中能否有多个 Activity?
一项功能中可以有多个 Activity。不过,您必须注意,免安装应用下载有 4MB 的大小限制。另外,每项功能都需要有一个 Activity 作为入口点。
- 不同功能之间是否可以共享资源?
可以,基础功能中的资源可供所有功能使用。从属功能中包含的资源仅可供该特定功能使用。
就基于文件的资源而言,其在从属功能与基础功能中的名称不得相同。例如,如果基础功能在
res/layout/feature_layout.xml
中定义布局,而从属功能使用同名文件定义另一布局,则免安装应用可能会加载从属功能的布局,而实际上需要的是基础功能的布局。此外,功能模块清单所引用的所有资源都必须出现在基础功能模块中。
- 如果应用中有两项功能,那么它们是否共享内存?
是的,这两项功能在同一进程中运行并共享应用上下文。只要这些功能属于同一个免安装应用,则功能的行为方式就会与单个应用的不同组件相似。您可通过相似方式访问存储和资源等组件。
不过,与安装版 APK 相比,免安装应用存在一些限制。如需了解详细信息,请参阅 Google Play Instant 政策页面。
- 一个 Activity 中的 view-pager 内是否可以有多个片段?
可以,一个 Activity 中可以有多个片段,而且您可以定义与功能中 Activity 相关的片段。Activity 必须是功能中的主入口点。请记住,片段不能与深层链接关联,并且不能脱离 Activity 单独启动。
- 免安装应用是否应该设置单独的启动器图标?
否,您不应另建界面。免安装应用与安装版应用应使用同一个图标,两个应用务必提供相同的外观和风格。因此,两个应用应使用相同的视觉元素。
- 如何确定应用是作为安装版应用还是免安装应用运行?
请使用
isInstantApp()
方法。如果当前进程是免安装应用,则此方法将返回true
。 - 如何从免安装应用中提示用户安装应用?
请使用
showInstallPrompt()
方法。该方法将向用户显示安装常规 APK 版应用的提示。 - 在 Google Play 中,不同的功能 APK 是否对应不同的详情?
否,免安装应用和安装版应用使用相同的软件包名称和详情。
- 在免安装应用中,对于功能的命名是否有任何限制?
功能模块命名遵循现有的 Java 软件包命名约定。例如,不能在功能名称中使用连字符。如需了解有关 Java 软件包命名约定的详细信息,请参阅 Java 文档。
- 如何将数据从免安装应用传送到安装版应用?
对于运行 Android 8.0(API 级别 26)或更高版本的设备,免安装应用的数据会在 APK 安装开始时自动传送,前提是安装版应用已配置为使用 targetSandboxVersion 2。
对于未配置为使用 targetSandboxVersion 2 的安装版应用,或者运行 Android 7.1(API 级别 25)或更低版本的设备,请考虑使用 Cookie API(示例)或 Storage API(示例)来传送数据。
- 免安装应用是否支持 Dalvik 可执行文件分包?
免安装应用支持 Dalvik 可执行文件分包。如果您的应用满足最大大小要求,但其中包含的方法数目超过 dex 限制(65,536 个方法),您仍可启用 Dalvik 可执行文件分包,并将其发布为免安装应用。
Analytics、Google Play 和部署
- 能否限制在特定的国家/地区发布免安装应用?
只限在提供安装版应用的国家/地区发布免安装应用。在这些国家/地区,开发者可以选择其免安装应用所面向的国家/地区。
- 是否需要发布安装版应用才能通过 Google Play 在 alpha 版频道上测试免安装应用?
要通过 Google Play 在内部测试频道上测试免安装应用的部署,则 Google Play Console 中必须要有安装版应用的草稿。如需了解有关部署和测试免安装应用的详细信息,请参阅分发免安装应用。
应用大小
注:Google Play Instant 上的游戏下载限制为 10 MB。如果您是游戏开发者,请遵循本节中的指导原则,但请将每个 4 MB 实例替换为 10 MB。
- 4MB 总下载大小限制意味着什么?
免安装应用的大小(基础功能加上包含的任何从属功能)应尽可能小。您的应用越小,用户就越容易下载。不过,免安装应用在用户的设备上运行后,您可以下载其他数据并将其存储在内部存储空间中。在设备的内部存储空间中存储数据不存在 4MB 的硬性限制。
要计算大小,请解压 Instant App APK 并检查 APK 文件。您可使用 APK 文件的磁盘大小,或者打开 APK Analyzer 并检查
Raw File Size
值。对于具有多项功能的免安装应用,必须计算基础功能 APK 和单个功能 APK 的总大小。这两个 APK 的总大小必须小于 4MB。
- 密度、ABI 或语言 APK 对 4MB 限制有何影响?
功能大小是与该功能相关联的功能 APK 大小、基础功能 APK 大小、最大语言、屏幕密度及 ABI APK 大小的总和。例如,如果某功能有 3 种语言和 1 种屏幕密度,而没有 ABI APK,则最终功能 APK 大小是通过将功能 APK 大小、基础功能 APK 大小、最大语言 APK 和该屏幕密度 APK 相加而得。
- 用户每次下载同一免安装应用时,是否需要重新下载基础功能 APK 和从属功能 APK?
当用户下载免安装应用时,会收到基础功能和从属功能。如果请求另一功能或功能 APK,则用户只会收到该特定功能的功能 APK。在这种情况下,不会重新下载基础功能。
在垃圾回收期间,系统可以根据需要清空免安装应用的缓存。如果用户重新启动手机,系统会清空免安装应用的缓存。这意味着用户必须重新下载基础功能。
- 4MB 验证何时进行?
这项验证在您将免安装应用上传到 Google Play Console 的生产频道时进行。
应用链接、深层链接和网址处理
- 从其他应用中点击时,我的链接未在免安装应用中打开,而是在应用内浏览器中打开。是否有办法确保用户转到免安装应用?
由于应用链接属于常规网址,应用可强制其在应用内浏览器中打开。请考虑使用 Firebase 动态链接来封装您的网址,确保链接始终在免安装应用中打开。
- 我的主应用清单包含我不支持或不属于我的其他网址或其他网址的网域。这会产生哪些后果?
如果网址的网域所有权未经验证,则无法发布免安装应用。
- 我的网址打开错误的 Activity。我该怎么办?
所选 Activity 直接基于 Activity 的
<intent-filter>
元素。请检查是否存在常见错误,如不同 Activity 的"android:pathPrefix"
属性彼此重叠。例如,如果一个 Activity 定义android:pathPrefix="/recordList"
,而另一 Activity 定义android:pathPrefix="/record"
,则行为可能未定义。请使用明确的路径定义,例如android:path="/recordList"
和android:pathPrefix="/record/"
。这样,/recordList
即可与包含所有记录的滚动列表匹配,而/record/123
可以与特定记录匹配。
在设备上运行免安装应用
- 用户是否可以退出 Google Play Instant?
可以。用户在首次启动免安装应用时可以选择退出。用户还可以通过从 Settings 中关闭免安装应用来退出。
- 是否可以并行运行两个免安装应用?
可以,多个免安装应用可以并行运行,并且用户可以在不同应用之间进行切换。只在通知栏提供处于前台的免安装应用图标。
- 用户能否从 Recents 或设备主屏幕终止及重启免安装应用进程?
用户可以从 Recents,或者通过点按先前启动免安装应用的网址,重启应用。
免安装应用进入空闲状态时,进程随即终止。不过,应用的内部存储空间(例如,SQLite 数据库)和共享首选项仍保持活跃状态。如果设备严重受限,免安装应用可能会遭驱逐,而且其内部存储空间会遭删除。在这种不常见的情况下,您必须从免安装应用的服务器中恢复应用状态。
- 免安装应用能否启动用户设备上安装的其他应用?
免安装应用可以通过触发隐式 intent 来启动安装的应用,但无法使用显式 intent 来启动大部分安装的应用。安装的应用可通过显式 intent 与免安装应用进行交互。
- 如果用户安装有旧版本的应用,那么在其点击具有新功能的免安装应用网址时,系统将打开哪个应用?
安装的应用始终优先于免安装应用。
- 用户如何接收新版本的免安装应用?Google 是否会在用户设备上自动更新免安装应用?
系统会向新用户以及免安装应用缓存已过期的现有用户提供最新版的免安装应用。