在 Android 上授权 Adobe AIR 应用程序

  • Pahup Bilala

2011 年 10 月 19 日

话题:语言 & 开发

目录

需求

预备知识

熟悉 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 项目,执行以下步骤:

  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 原生扩展

clip_image022+clip_image023

此作品依据Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License授权。超出本许可证范围,与本作品中包含的代码示例相关的权限可在Adobe上找到。

查看原文:Licensing Adobe AIR applications on Android

语言 & 开发