第二个 Android 11 开发者预览版现已推出,快来测试并分享您的反馈吧

常见问题解答

本页针对开发免安装应用时可能遇到的最常见问题或错误提供解答及解决方法。要详细了解关于用户体验的指导原则,请参阅支持 Google Play 免安装体验的应用的用户体验最佳做法支持 Google Play 免安装体验的游戏的用户体验最佳做法

一般问题

  • 哪些设备支持 Google Play 免安装体验?

    大部分搭载 Android 5.0(API 级别 21)及更高版本的设备都支持 Google Play 免安装体验。

  • 开发者需要构建两种不同的 Android 应用吗?

    开发者只需维护一个具有单一源代码树的项目。他们可以配置项目来创建两个构建工件:

    • 安装版
    • 免安装版

    在安装版应用中添加免安装应用支持所需执行的操作,取决于该安装版应用目前的结构。

    注意:免安装应用的版本不得高于最新发布的安装版应用的版本。

  • 免安装应用可以使用哪些不同类型的 Android API 和功能?

    Google Play 免安装体验功能是对现有 Android 应用的补充。这意味着,它不会取代现有的 Android 应用。它会使用相同的 Android API、相同的项目以及相同的源代码,而且会限制某些不符合用户对免安装应用的预期的功能。例如,免安装应用无法使用后台服务,无法发送后台通知,也无法访问设备的唯一标识符。

  • 用户可以选择永久安装应用吗?

    开发者可以使用 showInstallPrompt() 方法允许用户从 Google Play 安装应用。

  • Google Play 免安装体验如何管理权限?

    Google Play 免安装体验使用 Android 6.0(API 级别 23)中引入的运行时权限模型。

  • 免安装应用可以使用哪些权限?

    请参阅有关如何使 app bundle 支持免安装体验的指南中的权限部分的列表。

  • 免安装应用应该面向哪个 SDK 版本?

    免安装应用的清单必须将 targetSdkVersion 设为不低于 26 的值。

  • 对于免安装应用处理网络流量的方式是否有任何限制?

    所有来自免安装应用内部的网络流量都必须使用 HTTPS。免安装应用不支持 HTTP

  • 开发者如何发布免安装应用?

    开发者通过 Google Play 管理中心发布免安装应用,与发布现有 Android 应用的方法类似。要了解详情,请参阅分发免安装应用

  • 免安装应用是否需要 Smart Lock?

    需要,要求用户登录的应用必须实现 Android 上的 Smart Lock(密码专用)

  • 我能否在没有安装版 Android 应用的情况下实现免安装应用?

    不能,您必须在 Google Play 上提供安装版 Android 应用。

  • 能否将 WebP 用于视图?

    可以,您应该使用 WebP 来格式化视图的图像。

  • 免安装应用会如何显示在 Google 网页搜索结果中?

    免安装应用在搜索结果中的显示方式与安装版应用相同。如果有免安装应用与网址关联,则应用会显示一个应用图标和一个带有“免安装”字样的标签。

  • 能否使用 Google Play 免安装体验来分发游戏?

    可以,游戏完全支持 Google Play 免安装体验。首先,您需要了解如何将现有的游戏转换为免安装应用

项目的结构、功能及架构

  • 免安装应用和安装版应用是否需要不同的 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 免安装体验政策页面

  • 能否在一个 Activity 内的 ViewPager 中包含多个 fragment?

    您可以在一个 Activity 中包含多个 fragment,并且可以定义与功能中的 Activity 相关的 fragment。Activity 必须是功能中的主入口点。请注意,fragment 不能与深层链接关联,也不能独立于 Activity 启动。

  • 应该为免安装应用设置单独的启动器图标吗?

    您不应该另建界面。免安装应用与安装版应用应使用同一个图标,因为两个应用必须提供相同的外观和风格。因此,您应为两个应用应使用相同的视觉元素。

  • 如何确定应用是在作为安装版应用还是免安装应用运行?

    您可以使用 isInstantApp() 方法。如果当前进程是免安装应用,此方法会返回 true

  • 如何在免安装应用中提示用户安装应用?

    您可以使用 showInstallPrompt() 方法。此方法会提示用户安装应用的常规 APK 版本。

  • 在 Google Play 中,不同的功能 APK 是否对应不同的商品详情?

    不是,免安装应用和安装版应用共用相同的软件包名称和商品详情。

  • 在免安装应用中,对于功能的命名是否有任何限制?

    功能模块的命名应遵循 Java 软件包的既定命名惯例。例如,不能在功能名称中使用连字符。要详细了解 Java 软件包命名惯例,请参阅 Java 文档

  • 如何将数据从免安装应用传输到安装版应用?

    对于搭载 Android 8.0(API 级别 26)或更高版本的设备,如果安装版应用已配置为使用 targetSandboxVersion 2,则免安装应用的数据会在 APK 安装开始时自动传输。

    对于未配置为使用 targetSandboxVersion 2 的安装版应用,或者搭载 Android 7.1(API 级别 25)或更低版本的设备,请考虑使用 Cookie API示例)或 Storage API示例)来传输数据。

  • 免安装应用是否支持 Multidex?

    免安装应用支持 Multidex。如果您的应用满足最大大小要求,但其中包含的方法超过了 dex 限制的 65,536 个,您仍可启用 Multidex,并将其发布为免安装应用。

Analytics、Google Play 和部署

  • 能否限制免安装应用仅在特定的国家/地区发布?

    免安装应用仅限在可获得安装版应用的国家/地区发布。开发者可从这些国家/地区中选择其免安装应用要面向的国家/地区。

  • 要通过 Google Play 在 Alpha 版轨道上测试免安装应用,是否需要发布安装版应用?

    要通过 Google Play 在内部测试轨道上测试免安装应用的部署,必须在 Google Play 管理中心发布安装版应用的草稿。要详细了解如何部署和测试免安装应用,请参阅分发免安装应用

应用大小

注意:对于 Google Play 免安装游戏,下载大小限制为 10MB。如果您是游戏开发者,请遵循本节中的指导,但需将每个“4MB”替换为“10MB”。

  • 4MB 的总下载大小限制意味着什么?

    应该尽可能缩减免安装应用(基础功能加上所包含的任何从属功能)的大小。您的应用越小,用户越容易下载。然而,当用户在设备上运行免安装应用后,就可以下载其他数据并将其存储在内部存储空间中。在设备的内部存储空间中存储数据没有 4MB 的硬性限制。

    要计算大小,请解压免安装应用 APK 并检查 APK 文件。您可以使用 APK 文件所占用的磁盘空间大小,也可以打开 APK 分析器查看 Raw File Size 值。

    对于包含多项功能的免安装应用,您必须计算基础功能 APK 加单个功能 APK 的大小之和。这两个 APK 的大小之和必须小于 4MB。

  • 密度 APK、ABI APK 或语言 APK 对 4MB 限制有何影响?

    功能的大小是功能 APK、基础功能 APK 以及与此功能相关的最大语言 APK、屏幕密度 APK 和 ABI APK 的大小之和。例如,如果某个功能有 3 个语言 APK、1 个屏幕密度 APK,没有 ABI APK,则最终的功能 APK 大小是功能 APK 大小、基础功能 APK 大小、最大语言 APK 大小和该屏幕密度 APK 大小之和。

  • 对于同一个免安装应用,用户是否在每次下载时都需要重新下载基础功能 APK 和从属功能 APK?

    当用户下载免安装应用时,他们会获得该应用的基础功能和从属功能。如果再请求其他的具体功能或功能 APK,则只会获得该功能的功能 APK。在这种情况下,不会重新下载基础功能。

    在垃圾回收过程中,系统可以根据需要清除免安装应用的缓存。如果用户重启手机,系统将会清除免安装应用的缓存。这意味着用户必须重新下载基础功能。

  • 何时进行 4MB 验证?

    当您将免安装应用上传到 Google Play 管理中心的正式版轨道时,就会进行这项验证。

  • 从其他应用中点击链接时,链接不会在免安装应用中打开,而是在应用内的浏览器中打开。是否有办法确保将用户转到免安装应用?

    由于应用链接是普通的网址,应用可以强制在应用内的浏览器中打开它们。请考虑使用 Firebase 动态链接来封装您的网址,以确保链接始终在您的免安装应用中打开。

  • 我的主应用清单包含我不支持或不属于我的其他网址或域名。这会带来什么后果?

    如果网址的域名所有权未经验证,免安装应用将无法发布。

  • 我的网址会打开错误的 Activity。我该怎么办?

    系统会直接根据 Activity 的 <intent-filter> 元素来选择 Activity。检查常见的错误,例如不同的 Activity 具有重叠的 "android:pathPrefix" 属性。例如,如果一个 Activity 定义了 android:pathPrefix="/recordList",而另一个 Activity 定义了 android:pathPrefix="/record",则行为可能无法确定。请使用明确的路径定义,例如 android:path="/recordList"android:pathPrefix="/record/"。这样,/recordList 就可以匹配所有记录的滚动列表,而 /record/123 则匹配特定的记录。

在设备上运行免安装应用

  • 用户是否可以选择退出 Google Play 免安装体验?

    可以。用户可以在首次启动免安装应用时选择退出,也可以通过从“设置”中关闭免安装应用来选择退出。

  • 两个免安装应用可以并行运行吗?

    可以,多个免安装应用可以并行运行,并且用户可以在它们之间进行切换。只有在前台运行的免安装应用才会在通知栏中显示图标。

  • 用户能否关闭免安装应用进程并从“最近”或设备的主屏幕重启它?

    用户可以从“最近”重启免安装应用,也可以点按先前启动免安装应用的网址来重启它。

    当免安装应用进入空闲状态时,它的进程即会终止。不过,应用的内部存储空间(如 SQLite 数据库)和共享偏好设置会保持活跃状态。如果设备受到严格限制,免安装应用可能会被关闭,其内部存储空间也会被删除。这种情况很少发生,但如果发生,您必须从免安装应用的服务器恢复免安装应用的状态。

  • 免安装应用能否启动用户设备上安装的其他应用?

    免安装应用可以通过触发隐式 intent 来启动安装的应用,但无法使用显式 intent 来启动大多数已安装的应用。安装的应用可通过显式 intent 与免安装应用进行交互。

  • 如果用户安装有旧版本的应用,那么在其点击具有新功能的免安装应用网址时,系统会打开哪个应用?

    安装的应用始终优先于免安装应用。

  • 用户如何接收新版本的免安装应用?Google 会自动在用户设备上更新免安装应用吗?

    系统会向新用户以及免安装应用缓存已过期的现有用户提供最新版的免安装应用。