目录
需求
预备知识
熟悉 Android 上的 Adobe AIR 原生扩展、Java 和 Android 授权验证库(LVL)
需要的第三方产品
用户水平
中级
需要的产品
示例文件
注意:Adobe 建议使用下一版的 Flash Builder 来开发 Adobe AIR 的原生扩展。立即注册获取Flash Builder 4.6 的预发行版。
本教程向您展示针对Android 授权的原生扩展的使用和封装,包括保护应用程序的技巧。
理解Adobe AIR 中的Android 授权
Android 授权原生扩展为 AIR 应用程序开发人员提供了访问 Android Market 授权服务的能力。此服务可帮助您执行您通过 Android Market 发布的付费应用程序的授权策略。当使用此服务时,您的应用程序可在运行时查询 Android Market 来获取当前用户的授权状态,然后允许或禁止进一步使用。
- AIR 应用程序使用一个原生扩展来访问 Android Market 授权服务。
- 原生扩展使用授权验证库(LVL)与 Android Market 授权服务器通信,将结果传递回 AIR 应用程序。
- 原生扩展库向 LVL 发送请求,将向应用程序提供响应。
- 您可以修改在 AIR SDK 中提供的 SWC 的 LVL 和源代码。例如,如果您希望为 Android 授权实现您自己的自定义策略,您可能希望更改 LVL 代码。(默认情况下,LVL 使用一种基于服务器的策略)。
使用Android 授权原生扩展
开始之前:验证您的Flash Builder 副本是否安装了Java 开发工具(JDT)。您需要JDT 来在Flash Builder 中编辑Java 代码。关于如何安装JDT 的详细信息,请参阅Jason 在 Flash Builder 中的 Java 开发中的 Flex 博客文章中介绍的步骤。
要使用针对 Android 授权的原生扩展,您需要创建:
- 1 个 Java 项目
- 一个 ActionScript 基于
- AIR 应用程序
创建 Java 项目
要创建 Java 项目,执行以下步骤:
- 启动 Flash Builder 并选择 Java 透视图(参见图 1):
图 1. 在 Flash Builder 中选择 Java 透视图。
2. 选择 File > New Java Project。
3. 对于项目名称,输入AndroidLicensingJavaProject(参见图 2)。
图 2. 输入您的新 Java 项目的名称。
4. 单击 Finish。
5. 要引用 Google Android API,右键单击您的 Java 项目,然后选择 Properties,然后选择左侧面板中的 Java Build Path,最后单击右侧面板上的 Libraries 选项卡(参见图 3)。
图 3. 添加外部 JAR 文件。
6. 单击 Add External JARs 并将它指向来自您的 Android SDK 目录的 android.jar 文件:
7. 创建来自 Adobe AIR SDK 的 FlashRuntimeExtensions.jar 的引用:
8. 转到
9. 链接到所有外部库之后,您现在需要我们的 Java 项目中的 AIR 原生扩展。 转到 AIR SDK,复制您的 Java 项目的 src 文件夹中的 <air_sdk_dir>\frameworks\projects\air\Licensing\Android\AndroidLicensingJavaProject\src 中的 com 文件夹。
现在,您的 Java 项目应该类似于图 4。
图 4. Flash Builder 中您的 Java 项目的包资源管理器
10. 编译 Java 项目,应该没有编译错误。
11. 右键单击您的 Java 项目并选择 Export,然后在 Java 中选择 Jar,最后将 Jar 文件重命名为SampleAndroidLicensing.jar。
开发 ActionScript 库
针对原生扩展设置您的 Java 项目之后,您需要创建一个 ActionScript 库,它支持在 Java 代码与您的 AIR 应用程序在运行时通信。
在以后,您将在 AIR 应用程序中引用此 ActionScript 库。
- 要开发 ActionScript 项目,在 Flash Builder 中选择 Flash 透视图。在继续之前,确保您在 Flash Builder 中改写了最新的 AIR SDK。
- 选择 File > New > Flex Library Project。
- 对于项目名称,键入AndroidLicensingLib(参见图 5)。
图 5. 为您的新 Flex 库项目键入一个名称。
4. 确保您选择了复选框 Include Adobe AIR libraries,否则 Flash.external.ExternalContext API 将不可用于您的 ActionScript 库。
5. 单击 Finish。
6. 转到 AIR SDK,将 Flex 库代码从 frameworks\projects\air\Licensing\Android\AndroidLicensingJavaProject\src\复制到您的 Flex 库项目的 src 文件夹。
7. 您还需要在 Flex 库项目中设置您的开发人员公钥,您的 AIR 应用程序与 Android Market 服务器之间的通信需要它。 登录您的 Google Android Market 门户,复制公钥并将它设置为 LicenseChecker.as 文件中的 BASE64_PUBLIC_KEY 变量:
// Add the Public key obtained from Android Market here private static const BASE64_PUBLIC_KEY:String = "";
- 编译您的 Flex 库项目,您应该在项目的 bin 文件夹中看到 AndroidLicensingLib.swc 文件。现在,您的项目资源管理器应该类似于图 6。
图 6. Flash Builder 项目资源管理器显示 Java 和 Flex 项目。
开发示例 AIR 应用程序
接下来创建一个 AIR 应用程序,它将通过您刚才创建的原生扩展使用 Android 授权。
- 选择 File > New > Flex Mobile Project。
- 输入一个项目名称,我使用 AndroidLicensingUsage(参见图 7)。确保没有使用相同的项目名称,因为此 ID 已在 Google Android Market 中使用。
图 7. 键入 Flex 移动 AIR 项目的名称。
3. 单击 Next,然后单击 Finish。
4. 接下来您需要添加上面开发的 ActionScript 库的引用。右键单击此项目,选择 Properties,然后在左侧面板上选择 Flex Build Path。单击 Add SWC 并指向 AndroidLicensingLib 项目的 AndroidLicensingLib.swc(参见图 8)。
图 8. 引用您的 Flex 移动项目的 SWC。
5. 将 SWC 的链接类型更改为 External,双击 Link Type 并从弹出菜单中选择 External,单击 Ok(参见图 9)。
图 9. 将链接类型设置为 External。
6. 要向您的项目添加 UI 组件,切换到设计视图并添加一个按钮,将它标记为 Check for License,为该标签提供一个 id lbl。
7. 切换回源代码视图,在监听器函数中向该按钮添加一个处理函数: ```
var lc:LicenseChecker = new LicenseChecker();
lc.addEventListener(ErrorEvent.ERROR,errorHandler);
lc.addEventListener(LicenseStatusEvent.STATUS,licenseResult);
lc.checkLicense();
8. 确保使用以下语句导入了 ActionScript 库类: import com.adobe.air.sampleextensions.android.licensing.\*; 9. 接下来编写 checkLicense 方法调用的一个响应处理函数。添加以下函数: ``` protected function licenseResult(event:LicenseStatusEvent):void{ lbl.text = "status: " + event.status + " statusReason: +" + event.statusReason; if (event.status == LicenseStatus.LICENSED) { //Application is licensed, allow the user to proceed. } else if (event.status == LicenseStatus.NOT_LICENSED) { //Application is not licensed, don't allow to user to proceed. switch (event.statusReason) { case LicenseStatusReason.CHECK_IN_PROGRESS: // There is already a license check in progress. break ; case LicenseStatusReason.INVALID_PACKAGE_NAME: // Package Name of the application is not valid. break ; case LicenseStatusReason.INVALID_PUBLIC_KEY: // Public key specified is incorrect. break ; case LicenseStatusReason.MISSING_PERMISSION: // License Check permission in App descriptor is missing. break ; case LicenseStatusReason.NON_MATCHING_UID: // UID of the application is not matching. break ; case LicenseStatusReason.NOT_MARKET_MANAGED: // The application is not market managed. break ; default: // Application is not licensed. } } }
- 在编写使用 Android 授权原生扩展的 AIR 应用程序时,需要在应用程序描述符中进行以下更改。 在 application 标记之后添加一个扩展 ID 标记:
<extensions> <extensionID>com.adobe.air.sampleextensions.android.licensing</extensionID> </extensions>
所有执行许可证检查的应用程序需要一个 Android 权限,您需要将它添加到
<uses-permission android:name="com.android.vending.CHECK_LICENSE"/>
另外,确保应用程序描述符命名空间设置为 3.0:
<application xmlns="http://ns.adobe.com/air/application/3.0">
- 编译应用程序。这将在输出(bin-debug)文件夹中生成一个 SWF/XML。 注意:这里生成的 SWF 是一个调试 SWF。在 Flash Builder 中完成此任务的一种方式(无论是 AIR 项目还是 Web 项目,或者无论是否可以导出)是向编译器选项添加一个参数。为此,转到 Project > Properties > Flex Compiler,然后向 Additional 编译器参数添加“-debug=false”。
最后,在单击按钮时,此应用程序将执行一次许可证检查,并在标签文本中打印响应。
封装 Android 原生扩展和您的应用程序
对于您自己的项目,请确保阅读了下一节,其中提供了保护您的应用程序的建议。
要封装您的应用程序,您需要以下文件:
- JAR 文件,从 Java 项目生成(这里为 SampleAndroidLicensing.jar)
- SWC 文件,从 ActionScript 库项目生成(这里为 AndroidLicensingLib.swc)
- AIR 应用程序的 SWF/XML 文件,从您的 Flex 移动项目生成(这里为 AndroidLicensingUsage.swf 和 AndroidLicensingUsage-app.xml)
- extenson.xml(一个示例文件,您可以在 AIR SDK 中的 frameworks\projects\air\Licensing\Android\AndroidLicensingLib\src\中找到)
创建一个名为PackageAL的工作文件夹,将所有这些文件复制到此文件夹,然后使用 ADT 工具(可在 AIR SDK 中找到)封装应用程序
生成 ANE 文件
- 在命令提示符上将目录更改为指向您刚创建的工作文件夹,在这里创建一个名为Android-ARM的文件夹。
- 将 SampleAndroidLicensing.jar 文件复制到 Android-ARM 目录。
- 通过解压提取出 AndroidLicensingLib.swc,将文件 library.swf 复制到 Android-ARM 目录,然后删除 catalog.xml,不要删除 AndroidLicesingLib.swc。
- 使用以下 ADT 命令封装 ANE 文件。
在 Windows 上
<Full Path to adt.bat> -package -storetype PKCS12 -keystore <path to Certificate for Native Extension> -storepass <password> -target ane com.adobe.air.sampleextensions.android.licensing.ane extension.xml -swc AndroidLicensingLib.swc -platform Android-ARM -C .\Android-ARM\.
在 Mac OS X 上
<Full Path to adt> -package -storetype PKCS12 -keystore <path to Certificate for Native Extension> -storepass <password> -target ane com.adobe.air.sampleextensions.android.licensing.ane extension.xml -swc AndroidLicensingLib.swc -platform Android-ARM -C ./Android-ARM/.
生成 APK 文件
有了 ANE 文件之后,使用以下命令封装 APK 文件:
在 Windows 上:
<Full Path to adt.bat> -package -target apk -storetype PKCS12 -keystore <path to Certificate for AIR application> -storepass <password> AndroidLicensingUsage.apk AndroidLicensingUsage-app.xml AndroidLicensingUsage.swf –extdir.
在 Mac OS X 上:
<Full Path to adt> -package -target apk -storetype PKCS12 -keystore <path to Certificate for AIR application> -storepass <password> AndroidLicensingUsage.apk AndroidLicensingUsage-app.xml AndroidLicensingUsage.swf –extdir.
注意:如果您希望在设备 logcat 中查看轨迹,请将目标更改为 apk-debug。
当将您的应用程序发布到市场,并且您应用程序的用户已从 Google Android Market 购买了该应用程序,他们将收到响应“Licensed”。
保护应用程序的技巧
参考以下技巧,使您的应用程序更加安全:
-
不要与任何人共享 Android Market 门户公钥。
-
将 LicenseChecker.as 中以下行中的函数名称“checkLicenseNative”更改为其他某个名称: ```
var retValue:int = extContext.call( “checkLicenseNative”, BASE64_PUBLIC_KEY ) as int;
- 修改 AndroidLicensingExtensionContext.java 中的以下行以与新函数名称匹配: ``` functionMap.put("checkLicenseNative", new AndroidLicensing() );
-
根据需要改进 AndroidLicensing.java 中的 SALT 变量。
-
在生成 SampleAndroidLicensing.jar 文件之后,模糊化它,然后封装 ANE。JAR 文件可使用 ProGuard 工具模糊化。您可以使用本教程附带的配置文件(licensing.pro)来模糊化 JAR 文件: ```
java –jar
@licensing.pro
SampleAndroidLicensing\_o.jar 重命名为 **SampleAndroidLicensing.jar** 并使用它封装 ANE。 - 模糊化 ActionScript 代码。 {1} ## <a name="header_3"></a> 排除应用程序的故障 {1} 下表介绍了一些可能的错误消息和解决它们的技巧: {1} 错误消息 {1} 如何解决 {1} 无效的密钥规范错误(来自 logcat 中的 LVL) {1} 确保您提供了您的 Google Android Market 门户中可用的完全相同的密钥。 {1} missingPermission (statusReason) {1} 检查您是否在应用程序描述符中提供了 Android Permission for Check License。 {1} notMarketManaged (statusReason) {1} ID 无法被 Google Android Market 应用程序识别,因为从未将具有此 ID 的应用程序上传到 Google Android Market。上传合适的应用程序。 {1} 联系授权服务器时出错(来自 logcat 中的 LVL) {1} 确保您登录过您的 Android 电话的市场应用程序。另请确保您的设备拥有有效的互联网连接。 {1} ## 延伸阅读 {1} 在这个示例中,您学习了如何使用 AIR 原生扩展授权您的 Android 应用程序。要了解关于 ANE 的更多信息,请访问 AIR 开发人员中心中的 [Adobe AIR 原生扩展](http://www.adobe.com/devnet/air/native-extensions-for-air.html)。 {1} [![clip_image022](http://cookbooks.adobe.com/resources/images/license_creative_commons.png "clip_image022")](http://creativecommons.org/licenses/by-nc-sa/3.0/)+[![clip_image023](http://cookbooks.adobe.com/resources/images/license_adobe.jpg "clip_image023")](http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html) {1} 此作品依据 [Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License](http://creativecommons.org/licenses/by-nc-sa/3.0/) 授权。超出本许可证范围,与本作品中包含的代码示例相关的权限可在 [Adobe](http://www.adobe.com/communities/guidelines/ccplus/commercialcode_plus_permission.html) 上找到。 {1} ** 查看原文:**[Licensing Adobe AIR applications on Android ](http://www.adobe.com/devnet/air/articles/android-licensing-native-extensions.html)
评论