Google Play 许可是一项基于网络的服务,可让应用查询可信 Google Play 许可服务器,以确定当前设备用户是否拥有应用许可。Google Play 许可服务器能够确定特定用户是否已获得指定应用的使用许可,许可服务就是以这一能力为基础。如果记录显示用户购买了应用,Google Play 就会认为用户已获得许可。
当应用向 Google Play 客户端应用托管的服务发出请求时,请求流程即告开始。然后,Google Play 应用会向许可服务器发送请求并接收结果。Google Play 应用会将结果发送到您的应用,您的应用便可根据需要允许或禁止用户继续使用。
注意:如果应用的某个版本处于封闭式或开放式测试轨道中,则所有获得授权下载并安装该应用的用户均被视为此应用的许可用户。如需了解详情,请参阅使用测试轨道从用户那里获取宝贵的早期反馈。
![](https://developer.android.google.cn/static/images/google/play/licensing/licensing_arch.png?authuser=9&hl=lv)
图 1. 应用通过许可验证库和 Google Play 客户端发起许可检查。Google Play 客户端可处理与 Google Play 服务器之间的通信。
注意:过去,您可以通过上传未发布的“草稿”版本来测试应用。现在我们不再支持此功能,您必须将应用发布到封闭式或开放式测试轨道。如需了解详情,请参阅草稿应用不再受支持。
为了正确识别用户并确定许可状态,许可服务器需要有关应用和用户的信息,而您的应用将和 Google Play 客户端一起收集这些信息,再由 Google Play 客户端将其传递给服务器。
为了帮助您向应用添加许可机制,Android SDK 提供了一组可下载的库源代码:Google Market 许可软件包,供您添加到您的应用项目中。您可以将许可验证库 (LVL) 添加到负责处理与 Google Play 许可服务之间所有许可相关通信的应用中。将 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 卡)上进行安装和管理。
虽然没有任何许可机制可以杜绝未经授权的使用,但这项许可服务可让您控制所有兼容设备(无论设备是否锁定)上大多数常规使用类型的访问。
要开始向您的应用添加应用许可机制,请接着阅读设置许可。