Learn Android Market Licensing Service: Part 1

在 Android 发布早期,官方的 Android Market 颇为开发者诟病,原因之一就是版权保护机制的欠缺,诸如像从 Android Market 上下载的应用不能安装在有 root 访问权限的设备上,也不能安装到 SD 卡上等限制的版权保护能力实在太弱。后期,国内各家 Android 软件商店竞争进入白热化,场面一度精彩万分。凭借着本土化优势,这些第三方商店也一度吸引了部分国内开发者发布应用。但是,据我观察,它们在版权保护方面依旧乏善可陈,开发者们对版权保护的愿望照样落空。

这样的局面一直维持到2010年7月28日,这一天 Google 发布了 Licensing Service。这项标榜 “simple” 和 “free” 的服务提供了 “secure mechanism” 来管理对付费应用的访问,它的发布也昭示着原来的 “copy-protection mechanism” 将很快被废弃。虽然此后有消息称这套机制也可以被破解,但是眼下开发者如果想要赚钱,除了广告,尚没有清晰的第三条道路。因此,Google Licensing Service 对于开发者来说,还是非常有帮助的。–这里不得不说前几日看到有关 Android 吸费陷阱的报道,做恶的是不法 SP,无辜的是 Android,作为平台,Android 是不俱备扣费能力的。

有了 Android Market Licensing Service,用户在从 Android Market 购买付费应用时,Android Market Lincese Server 就会记录该用户的购买信息,这些信息就构成了 License。应用在运行时向 Android Market Lincese Server 查询当前用户的License,依据License决定是否允许当前用户继续使用应用。为了避免从 Android Market Lincese Server 返回的 License 被篡改或伪造,Android Market Lincese Server 会使用私钥对 License 进行签名,同时,应用使用公钥对 License 进行验证,依次判断是不是被篡改或伪造了 License。

Android Licensing Service

Android Licensing Service

从上面的流程来看,应用似乎要做非常多的步骤,实则不然,应用无需知道 Android Market Lincese Server,这交给了Android Market Client。Android Market Client 成了 Android Market Lincese Server 的代理,应用只需要和 Android Market Client 打交道。为了更进一步方便开发者,Android SDK 提供了 License Verification Library (LVL),LVL 负责和Android Market Client 打交道,应用只管调用 LVL 的 API 即可。整个的过程如图所示。

整个过程有三个角色出现,分别是:Applicaiton、Android Market Client、Android Market Licensing Server。它们各司其职,Applicaiton 负责提供 package name 和 nonce,这两个信息在稍后被用来验证从 server 得到的响应,因为响应是要异步返回的;Android Market Client 则要负责收集必要的用户和手机信息,然后代表 Applicaiton 把 license check request 发给 Server;Server 使用所有可用的信息来评估 request,根据购买记录检查用户标识,然后返回 License;Android Market Client 收到后再通过IPC回调,传递给 Applicaiton。

注意在整个过程当中,Application 并没有去管理任何网络连接,丝毫不用理会 Android Market Client 如何和 Android Market Licensing Server 如何通信,甚至并不用在意怎样和 Android Market Client通信(实际上是IPC调用)。

在使用 Licensing Service 时需要注意几点:

  1. 只有通过 Market 发布的付费应用才能使用;
  2. 要求运行 Android 1.5 及以上版本,同时安装有 Market Client;
  3. 可是通过网络访问到 Licensing Server。

要使用 Licensing Service,拥有一部 Android Phone 是再好不过了。不过即便没有,也并不会影响开发,因为使用模拟器效果也一致。这里需要注意,在创建 AVD (Android Virtual Device) 时,不能使用 standard Android system image,必须使用 Google APIs Add-On, API 8 (release 2) 或者更高版本,因为LVL是不包含在 standard Android system image 里的。

LVL 虽然简化了工作,但并不能完全替代开发者的工作,仍旧有一些工作需要来完成。这些工作可以复杂地做,也可以简单地做。先说简单的,只需要两个大环节:第一,实现自己的 LicenseCheckerCallback;第二,在AndroidManifest.xml 中增加 licensing permission。当然了,除了这两步之外还有其他一些工作要做,但是工作量都是比较小的。

如果 SDK 里安装了 “Google APIs by Google Inc.”,那么会有一个目录 market_licensing,这就是 LVL 的目录,其中有一个示例工程就是采用了简单方式。我把这个示例的关键代码抽取出来就是这样的:

private LicenseChecker mChecker;
 
private LicenseCheckerCallback mCheckerCallback;
 
@Override
public void onCreate(Bundle savedInstanceState) {
    mCheckerCallback = new MyLicenseCheckerCallback();
    String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
    byte[] salt = new byte[] {};
    Obfuscator obfuscator = new AESObfuscator(salt, getPackageName(), deviceId);
    Policy policy = new ServerManagedPolicy(this, obfuscator);
    String base64_public_key = "...";
    mChecker = new LicenseChecker(this, policy, base64_public_key);
    mChecker.checkAccess(mCheckerCallback);
}
private class MyLicenseCheckerCallback implements LicenseCheckerCallback {
 
    @Override
    public void allow() {
    }
 
    @Override
    public void dontAllow() {
    }
 
    @Override
    public void applicationError(ApplicationErrorCode errorCode) {
    }
}

1 Comment

[…] 原文链接:http://www.poemcode.net/2011/01/licensing-service-1/ >>> 进入[Android2D游戏开发]主题文章列表 转载编辑: Fgamers 转载地址:http://disanji.net/2011/03/11/study-android-market-licensing-service-part-1/ 分享到 | blog comments powered by Disqus /* […]

Leave a comment

Your comment