在Android上授权Adobe AIR应用程序
目录
- 理解Adobe AIR中的Android授权
- 理解Android授权原生扩展
- 封装Android原生扩展和您的应用程序
- 保护应用程序的技巧
- 排除应用程序的故障
需求
预备知识
熟悉Android上的Adobe AIR原生扩展、Java和Android授权验证库(LVL)
需要的第三方产品
- Java开发工具(JDT)
- 包含LVL的Google Android SDK
用户水平
中级
需要的产品
- Flash Builder 4.5 Premium(下载试用版)
- Adobe AIR
示例文件
- AndroidLicensingUsage.zip
- licensing.zip
注意: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透视图。
- 选择File > New Java Project。
- 对于项目名称,输入AndroidLicensingJavaProject(参见图2)。
图2. 输入您的新Java项目的名称。
- 单击Finish。
- 要引用Google Android API,右键单击您的Java项目,然后选择Properties,然后选择左侧面板中的Java Build Path,最后单击右侧面板上的Libraries选项卡(参见图3)。
图3. 添加外部JAR文件。
- 单击Add External JARs并将它指向来自您的Android SDK目录的android.jar文件:<Android SDK DIR>\platforms\android-11\android.jar。
注意:建议使用最新的Android API级目录。
- 创建来自Adobe AIR SDK的FlashRuntimeExtensions.jar的引用:<AIR SDK DIR>\lib\android\FlashRuntimeExtensions.jar。
您现在需要将Google Android SDK中可用的LVL复制到您的Java src项目。
- 转到<Android SDK DIR>\extras\google\market_licensing\library\src,复制com文件夹,将它粘贴到您的Java项目的src文件夹中。
- 链接到所有外部库之后,您现在需要我们的Java项目中的AIR原生扩展。
转到AIR SDK,复制您的Java项目的src文件夹中的<air_sdk_dir>\frameworks\projects\air\Licensing\Android\AndroidLicensingJavaProject\src中的com文件夹。
现在,您的Java项目应该类似于图4。
图4. Flash Builder中您的Java项目的包资源管理器
- 编译Java项目,应该没有编译错误。
- 右键单击您的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库项目键入一个名称。
- 确保您选择了复选框Include Adobe AIR libraries,否则Flash.external.ExternalContext API将不可用于您的ActionScript库。
- 单击Finish。
- 转到AIR SDK,将Flex库代码从frameworks\projects\air\Licensing\Android\AndroidLicensingJavaProject\src\复制到您的Flex库项目的src文件夹。
- 您还需要在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项目的名称。
- 单击Next,然后单击Finish。
- 接下来您需要添加上面开发的ActionScript库的引用。右键单击此项目,选择Properties,然后在左侧面板上选择Flex Build Path。单击Add SWC并指向AndroidLicensingLib项目的AndroidLicensingLib.swc(参见图8)。
图8. 引用您的Flex移动项目的SWC。
- 将SWC的链接类型更改为External,双击Link Type并从弹出菜单中选择External,单击Ok(参见图9)。
图9. 将链接类型设置为External。
- 要向您的项目添加UI组件,切换到设计视图并添加一个按钮,将它标记为Check for License,为该标签提供一个id lbl。
- 切换回源代码视图,在监听器函数中向该按钮添加一个处理函数:
var lc:LicenseChecker = new LicenseChecker();lc.addEventListener(ErrorEvent.ERROR,errorHandler);lc.addEventListener(LicenseStatusEvent.STATUS,licenseResult);lc.checkLicense();
- 确保使用以下语句导入了ActionScript库类:
import com.adobe.air.sampleextensions.android.licensing.*;
- 接下来编写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权限,您需要将它添加到<manifest>标记下:
<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 <Path to ProGuard.jar> @licensing.pro
SampleAndroidLicensing_o.jar重命名为SampleAndroidLicensing.jar并使用它封装ANE。
- 模糊化ActionScript代码。
排除应用程序的故障
下表介绍了一些可能的错误消息和解决它们的技巧:
错误消息 | 如何解决 |
无效的密钥规范错误(来自logcat中的LVL) | 确保您提供了您的Google Android Market门户中可用的完全相同的密钥。 |
missingPermission (statusReason) | 检查您是否在应用程序描述符中提供了Android Permission for Check License。 |
notMarketManaged (statusReason) | ID无法被Google Android Market应用程序识别,因为从未将具有此ID的应用程序上传到Google Android Market。上传合适的应用程序。 |
联系授权服务器时出错(来自logcat中的LVL) | 确保您登录过您的Android电话的市场应用程序。另请确保您的设备拥有有效的互联网连接。 |
延伸阅读
在这个示例中,您学习了如何使用AIR原生扩展授权您的Android应用程序。要了解关于ANE的更多信息,请访问AIR开发人员中心中的Adobe AIR原生扩展。
+
此作品依据Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License授权。超出本许可证范围,与本作品中包含的代码示例相关的权限可在Adobe上找到。
查看原文:Licensing Adobe AIR applications on Android
更多相关文章
- Android团队提供的示例项目
- Android应用程序怎么刷到手机上
- Android 文件系统及权限修改
- 用PHP编写Android应用程序
- 第二讲:Android系统构架分析和应用程序目录结构分析
- Android中对Log日志文件的分析