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 Licensing 包。许可验证库 (LVL) 是您可以添加到应用中的一个库,它负责处理与 Google Play 许可服务相关的所有通信。将 LVL 添加到您的应用后,您的应用只需调用一个方法并实现一个接收状态响应的回调,即可确定当前用户的许可状态。
您的应用不会直接查询许可服务器,而是通过远程 IPC 调用 Google Play 客户端来发起许可请求。在许可请求中
- 您的应用提供:其软件包名称、一个用于稍后验证来自服务器的任何响应的随机数,以及一个用于异步返回响应的回调。
- Google Play 客户端收集有关用户和设备的必要信息,例如设备的主要 Google 帐号用户名、IMSI 和其他信息。然后,它代表您的应用向服务器发送许可检查请求。
- Google Play 服务器使用所有可用信息评估请求,尝试以足够的置信度建立用户身份。然后,服务器会将用户身份与您应用的购买记录进行核对,并返回一个许可响应,Google Play 客户端通过 IPC 回调将此响应返回给您的应用。
您可以选择何时以及多久检查一次应用的许可,并且您可以完全控制应用如何处理响应、验证签名响应数据以及强制执行访问控制。
请注意,在许可检查期间,您的应用不管理任何网络连接,也不使用 Android 平台中任何与许可相关的 API。
许可响应是安全的
为确保每次许可查询的完整性,服务器使用仅在 Google Play 服务器和您之间共享的 RSA 密钥对签署许可响应数据。
许可服务为每个应用生成一个许可密钥对,并在 Play 管理中心的服务与 API 页面中公开公钥。您必须从 Play 管理中心复制公钥并将其嵌入到您的应用源代码中。服务器在内部保留私钥,并用它来签署您使用该帐号发布的应用的许可响应。
当您的应用收到签名响应时,它会使用嵌入的公钥来验证数据。许可服务中公钥加密技术的使用使应用能够检测到已被篡改或伪造的响应。
许可验证库
Android SDK 提供了一个名为 Google Market Licensing 包的可下载软件包,其中包含许可验证库 (LVL)。LVL 极大地简化了为应用添加许可的过程,并有助于确保为您的应用实现更安全、更健壮的许可功能。LVL 提供了内部类,可处理许可查询的大部分标准操作,例如联系 Google Play 客户端发起许可请求,以及验证和确认响应。它还公开了接口,让您可以轻松插入自定义代码,以根据应用需要定义许可政策和管理访问权限。LVL 的主要接口包括
政策
- 您的实现根据从服务器收到的许可响应以及任何其他可用数据(例如来自与您的应用关联的后端服务器的数据)来确定是否允许访问该应用。该实现可以评估许可响应的各个字段,并在需要时应用其他约束。该实现还允许您管理导致错误的许可检查的处理,例如网络错误。
LicenseCheckerCallback
- 您的实现根据
Policy
对象对许可响应的处理结果来管理应用的访问权限。您的实现可以按任何需要的方式管理访问权限,包括在界面中显示许可结果或引导用户购买该应用(如果当前未获得许可)。
为了帮助您开始使用Policy
,LVL 提供了两个完整的Policy
实现,您可以直接使用或根据需要进行调整
ServerManagedPolicy
- 一种灵活的
Policy
,它使用许可服务器提供的设置来管理响应缓存以及设备离线时(例如用户在飞机上时)对应用的访问。对于大多数应用,强烈建议使用ServerManagedPolicy
。 StrictPolicy
- 一种限制性
Policy
,它不缓存任何响应数据,并且仅当服务器返回许可响应时才允许应用访问。
LVL 作为 Android SDK 的可下载软件包提供。该软件包既包含 LVL 本身,也包含一个示例应用,该示例应用展示了该库应如何与您的应用集成,以及您的应用应如何管理响应数据、UI 交互和错误条件。
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 卡)上安装和管理。
尽管没有任何许可机制可以完全防止所有未经授权的使用,但许可服务允许您控制大多数正常使用类型在所有兼容设备(无论是否锁定)上的访问。
要开始为您的应用添加应用许可,请继续阅读设置许可。