目录

  • 理解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项目,执行以下步骤:

  1. 启动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文件:<Android SDK DIR>\platforms\android-11\android.jar。

    注意:建议使用最新的Android API级目录。

  7. 创建来自Adobe AIR SDK的FlashRuntimeExtensions.jar的引用:<AIR SDK DIR>\lib\android\FlashRuntimeExtensions.jar。

    您现在需要将Google Android SDK中可用的LVL复制到您的Java src项目。

  8. 转到<Android SDK DIR>\extras\google\market_licensing\library\src,复制com文件夹,将它粘贴到您的Java项目的src文件夹中。
  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库。

  1. 要开发ActionScript项目,在Flash Builder中选择Flash透视图。在继续之前,确保您在Flash Builder中改写了最新的AIR SDK。
  2. 选择File > New > Flex Library Project。
  3. 对于项目名称,键入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 = "";
  8. 编译您的Flex库项目,您应该在项目的bin文件夹中看到AndroidLicensingLib.swc文件。现在,您的项目资源管理器应该类似于图6。

    图6. Flash Builder项目资源管理器显示Java和Flex项目。

开发示例AIR应用程序

接下来创建一个AIR应用程序,它将通过您刚才创建的原生扩展使用Android授权。

  1. 选择File > New > Flex Mobile Project。
  2. 输入一个项目名称,我使用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.         }     }}
  10. 在编写使用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">
  11. 编译应用程序。这将在输出(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文件

  1. 在命令提示符上将目录更改为指向您刚创建的工作文件夹,在这里创建一个名为Android-ARM的文件夹。
  2. 将SampleAndroidLicensing.jar文件复制到Android-ARM目录。
  3. 通过解压提取出AndroidLicensingLib.swc,将文件library.swf复制到Android-ARM目录,然后删除catalog.xml,不要删除AndroidLicesingLib.swc。
  4. 使用以下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

更多相关文章

  1. 初涉Android之文件保存
  2. Android小项目合集(经典教程)包含十五个Android开发应用实例
  3. Android(安卓)源码下载
  4. Android(安卓)打造编译时注解解析框架 这只是一个开始
  5. Android团队提供的示例项目
  6. 学Android的学习规划
  7. Android应用程序怎么刷到手机上
  8. Android(安卓)文件系统及权限修改
  9. Android(安卓)打包签名

随机推荐

  1. SQL中distinct的用法(四种示例分析)
  2. sql server 性能优化之nolock
  3. sql语句实现四种九九乘法表
  4. 数据库访问性能优化
  5. mybatis的动态sql详解(精)
  6. 五种SQL Server分页存储过程的方法及性能
  7. 整理MySql常用查询语句(23种)
  8. 开窗函数有浅入深详解(一)
  9. 彻底删除SQL Server注册表的方法
  10. SQL Server 2005附加数据库时Read-Only错