BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

在Android上授权Adobe AIR应用程序

| 作者 Pahup Bilala 关注 0 他的粉丝 发布于 2011年10月21日. 估计阅读时间: 27 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

目录

需求

预备知识

熟悉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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT