欢迎参加我们将于 6 月 3 日举行的 #Android11:Beta 版发布会

许可概览

Google Play 许可是一项基于网络的服务,可让应用查询可信 Google Play 许可服务器,以确定当前设备用户是否拥有应用许可。Google Play 许可服务器能够确定特定用户是否已获得指定应用的使用许可,许可服务就是以这一能力为基础。如果记录显示用户购买了应用,则 Google Play 会认为用户已获得许可。

当应用向 Google Play 客户端应用托管的服务发出请求时,请求流程即告开始。然后,Google Play 应用会向许可服务器发送请求并接收结果。Google Play 应用会将结果发送到您的应用,您的应用便可以根据需要允许或禁止用户继续使用。

注意:如果应用的某个版本处于封闭式或开放式测试轨道中,则所有获得授权下载并安装此版本的用户均被视为此应用的许可用户。如需了解详情,请参阅使用测试轨道获取有价值的用户早期反馈

图 1. 应用通过许可验证库以及处理与 Google Play 服务器通信的 Google Play 客户端启动许可检查。

注意:过去,您可以通过上传未发布的“草稿”版本来测试应用。此功能不再受支持;现在,您必须将其发布到封闭式或开放式测试轨道。如需了解详情,请参阅草稿应用不再受支持

要正确识别用户并确定许可状态,许可服务器需要有关应用和用户的信息,而应用和 Google Play 客户端会协同工作以汇编这些信息,由 Google Play 客户端将其传递给服务器。

为了帮助您向应用添加许可机制,Android SDK 提供了一组可下载的库源代码,您可以将其添加到您的应用项目:Google Market 许可软件包。在负责处理与 Google Play 许可服务的所有许可相关通信的应用中,您可以添加许可验证库 (LVL)。通过将 LVL 添加到应用中,应用只需通过调用方法并实现接收状态响应的回调即可确定当前用户的许可状态。

应用不直接查询许可服务器,而是通过远程 IPC 调用 Google Play 客户端来发起许可请求。在许可请求中:

  • 应用会提供:其软件包名称、稍后用于验证来自服务器的任何响应的 Nonce 以及可异步返回响应的回调。
  • Google Play 客户端会收集有关用户和设备的必要信息,例如设备的主 Google 帐号用户名、IMSI 和其他信息。然后,它会代表应用向服务器发送许可检查请求。
  • Google Play 服务器会使用所有可用信息来评估请求,尝试以足够的可信度确定用户身份。然后,服务器会根据应用的购买记录检查用户身份,并返回许可响应,然后 Google Play 客户端会通过 IPC 回调将许可响应返回给应用。

您可以选择应用检查其许可的时间和频率,并且您可以完全控制其处理响应、验证带签名的响应数据以及强制执行访问控制的方式。

请注意,在许可检查期间,您的应用不管理任何网络连接,也不使用 Android 平台中任何与许可相关的 API。

许可响应安全无虞

为确保每个许可查询的完整性,服务器会使用仅在 Google Play 服务器和您之间共享的 RSA 密钥对来签署许可响应数据。

许可服务会为每个应用生成一个许可密钥对,并在 Play 管理中心内应用的服务和 API 页面中提供公钥。您必须从 Play 管理中心复制公钥并将其嵌入到应用源代码中。服务器会在内部保留私钥,并使用它来签署您通过此帐号发布的应用的许可响应。

当应用收到带签名的响应时,它会使用嵌入的公钥来验证数据。由于许可服务中使用了公钥加密,应用可以检测响应是否已被篡改或属于伪造。

许可验证库

Android SDK 提供了一个名为“Google Market 许可软件包”的可下载软件包,其中包括许可验证库 (LVL)。LVL 显著简化了向应用添加许可机制的过程,并有助于确保更安全、更可靠的应用实现。LVL 提供的内部类可处理大多数许可查询标准操作,例如联系 Google Play 客户端以发起许可请求以及验证响应。LVL 还提供了相关接口,使您可以轻松插入自定义代码,以根据应用的需要定义许可政策并管理访问权限。关键的 LVL 接口如下:

Policy
您的实现根据从服务器收到的许可响应和任何其他可用数据(例如与应用相关联的后端服务器提供的数据)确定是否允许访问应用。此实现可以根据需要评估许可响应的各个字段并应用其他限制。此实现还可让您管理导致错误(例如网络错误)的许可检查的处理。
LicenseCheckerCallback
您的实现根据 Policy 对象对许可响应的处理结果来管理应用的访问权限。您的实现可以采用任何所需方式管理访问权限,包括在界面中显示许可结果或指导用户购买应用(如果用户当前尚未获得许可)。

为帮助您开始使用 Policy,LVL 提供了两种完整的 Policy 实现,可以不经修改直接使用,也可以根据需要进行调整:

ServerManagedPolicy
一种灵活的 Policy,使用许可服务器提供的设置来管理设备离线时(例如,用户乘坐飞机时)的响应缓存和应用访问权限。对于大多数应用,强烈建议使用 ServerManagedPolicy
StrictPolicy
一种限制性 Policy,不缓存任何响应数据并且仅在服务器返回已获得许可响应时才允许访问应用。

LVL 可作为 Android SDK 的可下载软件包提供。此软件包既包含 LVL 本身,也包含演示此库应如何与应用集成以及应用应如何管理响应数据、界面交互和错误情况的示例应用。

LVL 源代码以 Android 库项目的形式提供,这意味着您可以维护一组库源代码并在多个应用之间共享它们。SDK 还提供了完整的测试环境,因此,即使您无权访问物理设备,也可以在应用发布前开发和测试许可实现。

要求和限制

Google Play 许可适用于将许可控制应用于通过 Google Play 发布的应用。此服务不适用于控制未通过 Google Play 发布或在不提供 Google Play 客户端的设备上运行的应用的访问权限。

在应用中实现许可时,请牢记以下几点:

  • 只有当应用的主机设备上安装了 Google Play 客户端且设备运行的是 Android 1.5(API 级别 3)或更高版本时,应用才能使用此服务。
  • 要完成许可检查,必须可通过网络访问许可服务器。您可以实现许可缓存行为,以便在没有网络连接的情况下管理应用访问权限。
  • 应用许可控制的安全性最终取决于实现本身的设计。此服务提供可让您安全检查许可的构建块,但许可的实际执行和处理由您决定。遵循以下文档中的最佳做法,可以确保您的实现安全无虞。
  • 向应用添加许可不会影响应用在不提供 Google Play 的设备上的运行情况。
  • 您可以为免费应用实施许可控制,但前提是您使用此服务提供 APK 扩展文件

取代复制保护

Google Play 许可是一种灵活、安全的机制,用于控制应用访问权限。它有效地取代了之前在 Google Play 上提供的复制保护机制(不再受支持),可帮助应用扩大其分发范围。

利用这项许可服务,您可以迁移到基于许可的模型,此模型可在所有安装了 Google Play 的设备上实现。是否向用户授予访问权限的依据不再是主机设备的特征,而是您在 Google Play 上的应用(通过应用的公钥)和您定义的许可政策。您的应用可以在任何设备的任何存储空间(包括 SD 卡)上进行安装和管理。

虽然没有任何许可机制可以杜绝未经授权的使用,但这项许可服务可让您控制所有兼容设备(无论设备是否锁定)上大多数正常使用类型的访问。

要开始向您的应用添加应用许可机制,请接着阅读设置许可