`

利用Adobe AIR本地扩展支持Android开发

ane 
阅读更多

http://bbs.9ria.com/thread-180609-1-1.html

学前准备... 2

所需知识... 2

额外工具... 2

用户等级... 2

例子文件... 2

设置AIR SDK以及本地开发工具... 2

含ASC2.0的AIR SDK3.6和Flash Builder 4.7. 3

Adobe Flex 支持AIR SDK3.6及Flash Builder4.7的应用... 3

Java版本... 4

Eclipse以及ADT插件... 4

开发AS库... 4

项目初始化... 5

扩展上下文... 6

扩展API. 7

构建... 7

开发本地项目... 7

项目初始化... 7

Android布局... 8

ANESample.java和FREExtension接口... 9

ANESampleContext.java和FREContextl类... 10

FREFunction的实现:initFunction.java和getVersion.java. 10

访问Android资源:showBrowser.java. 11

WebViewActivity.java. 11

构建... 12

第三方本地库问题... 13

任意资源问题... 13

打包ANE文件... 13

extension.xml 14

library.swf. 15

Android-ARM folder. 15

代码标记... 15

ADT命令行... 15

在AIR应用中使用本地扩展... 16

项目初始化... 16

处理AS代码和本地扩展的更新... 18

ANESampleTestHomeView.mxml 19

ANESampleTest-app.xml 19

构建... 20

在Android上部署... 20

调试本地扩展... 22

Flash Builder 调试设置... 22

Eclipse调试设置... 23

之后... 25

学前准备
所需知识

使用ASFlashBuilderJavaEclipseAndroid及本地扩展等的经验都会在阅读本文中起到很大帮助。

额外工具

·         AIR SDK 3.6

·         Android SDK (with Eclipse)

Flash Builder 4.7 Standard(Download trial)

用户等级

中等

例子文件

·         ane-android-sample.zip

Adobe AIR是为跨平台与设备独立设计的。但是AIR应用仍然可以通过AIR本地扩展来获取本地平台的API。本地扩展可以使你使用特定平台特性,重用当前本地库以及在本地提高那些对性能要求高的代码。本教程集中讲解Google Android平台开发过程中前两个方面的东西。

       本教程涵盖实现、应用以及一个简单使用Android 活动来浏览选择的网址的调试的例子。一些针对Android平台本地扩展的陷阱,例如本地资源及资料的引用等都将详细在此文中介绍。为了实现这里概括的各方面内容,需要使用最新的Adobe ActionScript工具,例如:Flash Builder4.7,AIR SDK 3.6,Eclipse IDE以及本地java插件ADT

此教程很多地方需要动手,在开始时候确定已经下载了包括Flash BuilderEclipse等的项目例子文件。

       其他像Adobe AIR 开发者中心的《为iOSAndroid构建本地扩展》系列参考教程都是很不错的,此系列教程探讨本地扩展各方面内容而不只是我们这里谈论的只关于Android的问题。Adobe帮助中心的《面向Adobe AIR 的本地扩展开发》同样是个不错的帮助资源。


设置AIR SDK以及本地开发工具

本教程不包括Flash Builder4.7的详细安装过程,可以参考Flash Builder的产品主页来获取相关版本及购买软件。

当前安装SDK需要额外步骤来方便使用ASASC2.0编译器。新编译器跟Flash Builder4.7一起提供一些新特性及性能上的增强。例如多线程,快速编译等都让游戏开发更加有利。然而鉴于发行版的限制,Flash Builder4.7却兼容特殊的老AIR 3.4版本的SDK(包含新编译器)。

ASC2.0的AIR SDK3.6和Flash Builder 4.7

使用当前AIR SDK3.6及其最新特性和修复bug时,必须要单独下载含ASC2.0AIR SDK并手动安装。当然这些指示对更新版本的AIR SDK也有效。为了发布的Flash Builder 4.7也会支持新版本的AIR SDK,如果为了版本适合需要,就可以跳过此步骤。

1.       从Adobe Labs或者Adobe Developer Connection下载含ASC2.0的AIR SDK。新版的AIR SDK也可在Adobe Labs找到,但此教程只在AIR SDK3.6上测试过。

Flash Builder4.7AIR SDK默认地址是:

·         Mac OS X: /Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722/AIRSDK

·         Windows 7 (64-Bit): C:\Program Files\Adobe\Adobe Flash Builder 4.7 (64 Bit)\eclipse\plugins\com.adobe.flash.compiler_4.7.0.349722\AIRSDK

后面的序列数字可能根据你安装的Flash Builder4.7环境而不同。需要注意的是这些地址跟以前版本的Flash Builder不同,现在需要将AIR SDK放在应用最上面的sdks目录里。

2.       如果Flash Builder 正在运行,则退出

3.       重命名拷贝的AIRSDK文件来备份

4.       删掉原来AIRSDK目录里的内容

5.       将含有ASC2.0的AIR SDK3.6解压到原来的文件夹内,名字还是AIRSDK。首先将AIR SDK3.6的下载包拷贝到原来的AIRSDK文件夹内,然后在终端里输入tar jxvf package.tbz2来创建新的SDK,用实际名字代替package。

6.       从备份的AIRSDK文件夹里将lib/aot文件夹拷贝到新建的AIRSDK文件夹下的lib/aot里。

7.       最后如果文件不存在就创建一个名为strip的空文件夹,放到lib/aot/bin目录下.如果你需要在iOS上部署,上述方法也是行得通的。

如果需要更多关于此步骤的信息,可以参考《在Flash Builder4.7上更新AIR SDK》。

Adobe Flex 支持AIR SDK3.6及Flash Builder4.7的应用

ASC2.0AIR SDK发布只为纯AS开发,跟当前的Flex SDK是不共存的。为了支持新版本AIR SDKFlex开发,需要一个不包括ASC2.0AIR SDK发布版来覆盖绑定Flash Builder4.7Flex SDK。当使用测试应用来使用Flex框架支持UI组件是,需要如下人工部署来使用AIR SDK3.6

1.       从Adobe Developer Connection下载带ASC2.0的AIR SDK3.6.确保为Flex用户选择了下面的其中一个(Mac或Windows),而不是直接包含新编译器的开始下载。

2.       如果Flash Builder在运行则退出Flash Builder。

3.       将当前存在的Flex SDK文件夹拷贝到一个不同的文件夹。Flex SDK默认文件夹如下:

·         Mac OS: /Applications/Adobe Flash Builder 4.7/sdks/4.6.0

·         Windows: C:\Program Files\Adobe\Flash Builder 4.7\sdks\4.6.0

下面的步骤是使用AIR应用里的本地扩展,前提是你已经将Flex SDK拷贝到sdks目录里的4.6.0-air3.6文件夹里。

4.       将下载的SDK包拷贝或移动到拷贝目录并解压到当前目录来更新带AIR 3.6的Flex SDK。稍后,当为测试应用配置Flex移动项目时,需要为构建的项目选择更新的Flex SDK。

5.       如果是将当前的Flex应用更新到新的SDK,可能需要检查-target-player的配置选项以及对应的playerglobal.swc的位置。例如:

·         AIR 3.4 SDK contains frameworks/libs/player/11.4/playerglobal.swc

·         AIR 3.6 SDK contains frameworks/libs/player/11.6/playerglobal.swc

Flex环境的默认-external-library-pat需要链接到正确版本的playerglobal.swc。检查frameworks/flex-config.xml来确定版本信息匹配正确。

Java版本

当前Adobe工具跟Java7是不太兼容的,可能在链接或者打包时会出错。如果你的Java7安装并出现这样问题,那尽量用最新版的Java6.可能你会用32位或64位的,下面的操作假设你用的64位的Java6

Eclipse以及ADT插件

Eclipse是开发Java应用的IDE,此教程里需要使用Eclipse开发本地扩展里的Java源代码。

如果没有装Eclipse IDE,需要下载Android开发的全部环境,包括EclipseADT插件,这些都可以在Android开发主页获得。如果已经安装Eclipse IDE,则只需要安装Android SDK工具即可。确保安装到Eclipse里的ADT插件是按照Google提供的方法安装的哦。

此教程假设Eclipse版本为4.2经典版。Android开发套件则对Eclipse版本没什么固定要求,好用就行,32位跟64位都可以。

       不要混淆Android开发工具跟AIR开发工具。不幸的是在不同开发者社区它们都被当做ADTAIR开发工具是为打包、签约、安装、运行AIR应用以及包括shell脚本和Java库的命令行功能工具。可执行的shell脚本可以在Flash Builder安装的根目录里的sdks/{version}/bin文件夹和elicpse/plugins/com.adobe.flash.compiler_{version}/AIRSDK/bin目录下找到。可以直接将本科扩展打包到ANE文件里,然后为了方便选择两者其中一个地址即可。

开发AS库

       本部分需要创建作为本地Android Java代码及AIR应用之间接口的AS库。本例子是很简单的,只是创建并初始化桥接AIR跟本地平台的扩展文本实例罢了。例子应用里包括两个函数:getVersion(),此函数获得应用的Android版本号及AIR的运行时间,showBrowser()函数则表示提供给用户的Android本地活动。

例子文件包括ANESample.fxpl,可以直接导入Flash Builder里的一个Flash Builder项目。此文件基本可以构建了,除了需要引用AIR SDK里的库例外。引用路径跟文件系统路径略微不同的,取决于安装的AIR SDK的路径。

此教程手把手从头教你开发,以便能起到作用。

开始前,重命名.fxpl文件为一个.zip扩展名的文件,然后解压到你选择的目录。

项目初始化

1.       打开Flash Builder4.7并选择文件>新建>AS库项目

2.       项目名字为ANESample,如果没别的原因,那就用默认地址哦。

3.       在Flash Builder的Eclipse插件文件夹里安装了AIR SDK3.6,项目创建文件将会弹出“此项目将使用AIR SDK3.6(如图1)”,如果没有,则重新查看上面的安装步骤。

4.       选择包含Adobe AIR 库并点击下一步

<ignore_js_op>1.png

 

图1. 创建新的AS库项目

5.       下一个对话框里会在库路径列表里的构建路径库里看到“AIR SDK3.6”,AIR SDK的位置就是根据SDK安装操作对应的。

6.       点击完成结束项目初始化。

7.       在左边的资源管理器里会看到新建的项目,点击反三角符号来看下项目的初始组件。

8.       在包管理器里右键项目并选择性质。

9.       选择坐板凳AS库来看下编译器的设置,会看到如下选项被选中:包含Adobe AIR库,使用AIR SDK确定的版本,强类型检测以及警告开启。

10.   输入-locale en_US作为额外的编译器参数(如图2)

11.   点击确定。

<ignore_js_op>2.png

 

图2 设置AS库的编译器参数

12.   Flash Buider默认会自动构建项目,这有时候会很烦人,可以选择项目>自动构建,确定里面没被勾选。这会让项目>构建按钮启动的。

13.   添加源码。

现在需要将ANESampe库源代码添加到项目里。

选择文件>新建>Flash Builder 中的AS

1.       包的话输入com.adobe.sampleasextension.名字的话输入SampleASExtension.

2.       点击完成

4.       在代码编辑器里可以看到大致生成的代码框架。

5.       从 src/com/adobe/sampleasextension/SampleASExtension.as拷贝并粘贴代码到代码编辑器里,代替里面的框架代码。

扩展上下文

代码13行可以看到调用导入的静态类flash.external.ExtensionContextcreateExtensionContext()函数。ExtensionContext 实例在SampleASExtension初始化时会被创建。

第一个参数是本地扩展的标识符,可以再打包本地扩展时使用此标识符,在应用打包时可以使用本地扩展。因为所有扩展都共享相同的命名空间,所以尽量用DNS的逆序标示来避免重复。如果任何在建立过程中出错,createExtensionContext()函数都会在运行时失败并返回null

       第二个参数是上下文类型,它给本地扩展很多信息来指示做什么。例如,相同的扩展上下文可以用来操作亮度等级或者显示对比,这都取决于提供的字符串是bright还是contrast。此例的扩展则提供SampleASExtension。在源代码里没有进行检测,如果想的话可以设为空。

       创建扩展上下文之后需要在本地旁边做一些合适的上下文初始化。这里使用带表示调用哪边源码的字符串(“initMe”)的扩展上下文的call()函数来实现的。

扩展API

此扩展提供了最小的两个API函数:getVersion()showBrowser()。前者将显示应用的版本数量以及安装在Android设备上的AIR运行时。后者表示开始Android活动。     

利用本地上下文初始化,这些都利用扩展上下文的call()函数实现:

public function getVersion():void {

   extContext.call("getVersion");

}

 

public function showBrowser():void {

   extContext.call("showBrowser");

}

在开发本地Java源代码时,会看到call()函数的字符串参数是如何被映射到合适的本地方法里的。

构建

1.       保存粘贴到代码查看器里的代码

2.       选择项目>构建项目。当然也可以右击包管理器中的项目,然后选择构建项目。

       一切顺利的话,会在包管理器的项目bin目录里看到名为ANESample.swc的结果文件。这就是后面你创建ANE文件时需要使用的AS库。可以在文件系统里右击文件选择属性来查看其地址(如图3)。

<ignore_js_op>3.png

 

图3. AS库的属性

开发本地项目

ANESample_java.zip例子文件包括Eclipse项目及本部分需要的Java源代码。以前可能项目会轻易导入Eclipse中,但是下面的步骤则包含从开始的整个过程。

项目初始化

1.       打开Eclipse并选择文件>其他>Android应用项目

2.       点击下一步。

3.       应用及项目名字都设为ANESample_java。

4.       包的名字为:com.adobe.samplesextension。

5.       下面连续点击下一步,直到遇到结束按钮,点击结束。

6.       下一步右击项目名字并选择性质。

7.       在性质对话框里选择Java构建路径。需要将Flash运行时扩展库链接到本地代码里。

8.       选择库列表然后点击添加额外Jar包。

9.       到Flash Builder4.7安装文件夹并到Eclipse>plugins>com.adobe.flash.compiler_4.7.x.xxxxx>AIRSDK>lib>android,选择FlashRuntimeExtension.jar,然后点击确定(如图4)。

<ignore_js_op>4.png

 

图4 添加Flash运行时扩展库

Android布局

       本教程主要目的就是展示如何获取并使用来自AIR本地扩展的Android资源。为实现此目的需要首先建立Android获得的布局和相关资源,后面需要在Java源代码里引用这些资源。如何使用ADT图形布局编辑器已经超出本教程范围,可以使用提前弄好的位于res/layout/anesample.xml里的ANESample_java.zip项目文件里的布局。

1.       选择文件>新建>其他>Android>Android布局文件然后点击下一步。

2.       输入anesample.xml作为名字,选择线性布局,然后点击结束。新的布局文件将在包管理器的res/layout/anesample.xml地方。

3.       如果不使用activity_main.xml文件,就可以删掉它,当然也可以删掉res/menu文件夹。

4.       双击在图形布局编辑器里打开anesample.xml文件。

5.       点击anesample.xml标签来查看XML,将anesample.xml文件的内容粘贴到ANESample_java.zip文件,代替原来内容。

6.       保存文件。

7.       在此点击图形布局标签来查看布局。会有两个错误:不能解析资源@string/cnn和不能解析资源@string/yahoo。 可以通过更新res/values/strings.xml文件来解决这些错误并提供一个合适的应用名。

8.       在包管理器中双击,选择string.xml标签,从ANESamp_java.zip文件里粘贴string.xml的内容,代替原来内容。

9.       保存文件。

10.   在包管理器中双击anesample.xml文件可以看到没有错误的布局(如图5)。

<ignore_js_op>5.png

 

图5 新布局

ANESample.java和FREExtension接口

       现在需要实现FREEXtension接口,它可是本地java代码的源入口哦。此类的名字很重要,会在extension.xml里面的<initializer><finalizer>节点上使用来打包本地扩展。

1.       选择文件>新建>类 在项目来新建一个java类。

2.       包是: com.adobe.sampleasextension,包名: ANESample,接口为: com.adobe.fre.FREExtension

3.       点击完成。新文件将在包管理器的src/com.adobe.sampleasextension下。

4.       由于不需要MainActivity.java了,可以删掉哦。

5.       双击在编辑器中显示ANESample.java的代码。然后从ANESample_java.zip文件内拷贝并粘贴ANESample.java的内容覆盖以前的。

Eclipse16行调用ANESampleContext()构造器时会抛错。可以在下一部分将源码导入来解决出错。此类中最重要的是15行的createContext()函数。此函数在AS中调用ExtensionContext.createExtensionContext()时被AIR运行时调用。它必须返回FREContext类实例。此处的字符串参数是传递给AS里的createExtensionContext()函数的第二个参数。还可以根据需要创建不同的FREContext实例。例子只是用一个上下文,因此参数在此处就省略了。

       Initialize()dispose()函数在扩展初始化和清除时分别被AIR运行时调用。它们可以用来创建和恢复需要的持久资源。本例中,不需要做特殊的处理,因此它们是空的。构造器如果有的话是不带任何参数的。

调用createExtensionContext()后完成的初始顺序是:

·         FREExtension 实现的构造器

·         initialize()

·         createContext()

ANESampleContext.java和FREContextl类

1.       跟以前一样选择文件>新建>类来创建一个新的Java类。

2.       包为 com.adobe.sampleasextension ,包名为:ANESampleContext ,但这次需要将com.adobe.fre.FREContext作为超类来继承。

3.       点击完成

4.       双击包管理器中的ANESampleContext.java来在编辑器中查看代码,然后从ANESample_java.zip文件中拷贝并粘贴ANESampleContext.java的内容来代替原来代码。

       ANESampleContext类在createContext()ANESample实现中被调用时创建。ExtensionContext.call()中使用的函数的键是调用SampleASExtension AS代码中跟本地java映射的调用。19行的getFunctions()函数是个在FREContext里定义的抽象方法,需要被实现并返回一个关联扩展函数的键到本地FREFunction实现的Map。首先Eclipse代码编辑器会在22,23,24行像是put()调用的错误,这是因为没实现FREFuntion的接口导致的。

       另外类中需要实现的就是dispose()函数了。调用关于扩展上下文的ASdispose()函数会导致AIR调用Java15行定义的dispose()函数。如果AS里没有明确调用dispose()函数,那将会被AIR垃圾回收器在没有引用扩展上下文时被回收。例如,可以上dispose实现为空,这样就不需要非默认构造器了。

FREFunction的实现:initFunction.java和getVersion.java

       跟以前一样创建initFunctiongetVersion Java类,这次用com.adobe.fre.FREFunction作为接口来实现。

       initFunction()函数被映射到initME函数键值,此扩展中不需要特别初始化,因此这里只是在调用时打印即可。getVersion()函数也映射到相同的函数键值。此方法里可以看出如何获得Android获得以及从11行传给FREContext对象的第一个参数。

额外的FREFunction实现的AS参数是被作为FREObject实例传给Java代码的。这里是不使用的,但是如果需要,FREObject类提供方法获得类型以及包括的Java值。AS里的基本类型和对象都可作为FREObject传递。AS上有FREObject方法来创建并在Java边设置属性及调用方法。AS对象里保存大量数据的对象也在Java API里有特殊方法来方便高效的操作数据。

获取FREObject时有很多限制条件的哦,此处不一一给出了。基本上只能从同一个运行的FREFunction的相同线程中获得FREObject实例。FREObject实例只在调用栈上的FREFunction实例返回时有效。这是AIRAS这里调用ExtensiContext.call()时调用的。FREObject实例不能在扩展间共享。也不能在调用FREFunction之间的公用数据时保存引用和获取有效访问。推荐的同步异步的ASJava线程中的数据是通过FREContext实例的dispatchStatusEventAsync()函数。对应的AS上的扩展上下文实例将派发可以回应的状态事件。

访问Android资源:showBrowser.java

       利用initFunctiongetVersion类同样的方法创建showBrowser类。通过此类可以了解特殊访问Android资源,例如布局和按钮等。

       在传统Android Java项目里,这些资源被编译到每个应用里并可以通过Androind资源包工具产生的特殊R类提供的常量访问到。只有一个R的实例,AAPT也没提供合并构建产物的资源的机制。这就出现一个AIR本地扩展问题,最终的构建只有在扩展被打包到AS应用时才会出现。多个本地Android库及其资源可以在完成应用时看到。

       项目res文件夹下的Android资源可以在Eclipse的包管理器中查看。为了让本地扩展访问这些资源,必须拷贝整个文件夹到打包扩展时的ANE文件里。当打包好整个AS应用后,所有扩展的资源会被合并到一个Android资源目录里。因此需要保证扩展的名字没有冲突哦。

       现在不是通过R.id.buttonName访问资源,而是用FREContext实例的getResourceId()函数来获取为id.buttonName。在showBrowser类里可以在代码17-19行看到为layout.anesampleid.CNNButtonid.YahooButton资源的三个调用例子。

layoutID = ctx.getResourceId("layout.anesample");

CNNButtonID = ctx.getResourceId("id.CNNButton");

YahooButtonID = ctx.getResourceId("id.YahooButton");

这些资源在建立Android活动布局时在res/layout/anesample.xml里被定义好。showBrowser 类建立Android以便来启动WebViewActivity类定义的实际的想要呈现给用户的活动。活动在一个独立的线程中运行,当然需要将资源标识符传递给线程,由于FREContext实例已经创建,只在主线程中可用,所以这里就需要其他办法了。Intent类提供putExtra方法来管理额外数据到Intent类。32-34行代码中挖掘需要的资源到活动线程中。

i.putExtra("layoutID", layoutID);

i.putExtra("CNNButtonID", CNNButtonID);

i.putExtra("YahooButtonID", YahooButtonID);

WebViewActivity.java

       按通常方式创建此类,这次类需要继承android.app.Activity。此类基本上是标准Android代码,除了需要获得跟Intent类相关的额外数据的资源标识符外。可以在代码18,23,26行用在活动建立时Intent类的getIntExtra()方法获得,并将为showBrowser类里获得的int资源标识符的键值传递过去。利用这些可用的资源标识符,可以调用21行的setContentView()跟教程开始部分定义的布局来,在29行跟30行创建按钮。建立Intents类来浏览按钮相关联的URL

int layoutID = getIntent().getIntExtra("layoutID", -1);

System.out.printf("layout ID: %d\n", layoutID);

 

setContentView(layoutID);

 

int CNNButtonID = getIntent().getIntExtra("CNNButtonID", -1);

System.out.printf("CNNButton ID: %d\n", CNNButtonID);

 

int YahooButtonID = getIntent().getIntExtra("YahooButtonID", -1);

System.out.printf("YahooButton ID: %d\n", YahooButtonID );

 

Button CNNButton = (Button)findViewById(CNNButtonID);

Button YahooButton = (Button)findViewById(YahooButtonID);

构建

到此Eclipse应该不会报错,当然也必须构建一个没有错误的项目。为生成需要打包到本地扩展中的库,需要遵循如下几步:

1.       右击项目选择导出

2.       选择Java > JAR 文件然后点下一步

3.       选择默认设置,在下面选择导出目的位置,选择项目文件夹作为地址,根据ANESample.jar的名也是一样(如图6)

4.       在打包扩展时需要用这个路径来获取库

5.       点击完成。

<ignore_js_op>6.png

 

图6 导出Jar文件

第三方本地库问题

       本地扩展原来目的是为了访问那些当前AS API不包括的本地平台特性。然而很多面向AndroidAS开发者表现出强大的兴趣想利用当前已存第三方的打包很多Android特殊功能的库,因此他们没必要重新自己用AS实现。乍一看好像本地扩展提供给开发者方便整合第三方库到自己AS应用中的一个方法。

       正如所见,尽管第三方库需要访问本地Android资源,并且大多数都会访问,但是他们不可能直接在本地扩展里没改变源代码的情况下就改变访问的资源。很多库没有提供源代码,因此在没有获得源代码证书情况下很难与大多数开发者的AS应用库结合。即使结合了,也需要很多工作来构造代码并维护本地扩展资源访问机制带来的兼容性问题。

       目前这的确不是个好方法。理想状况下,第三方库开发者支持开发者的AIR应用和通过抽象访问到的资源标识符的Android应用开发。

例如,一个可以访问所有线程的静态Map可以集中所有资源ID或通过getResourceId()函数在运行于本地扩展的上下文时获取资源。或者只是在没运行时返回R.id.resource。这是由创建扩展上下文后通过初始函数调用本地扩展时决定的。调用时需要设置一个标志一边资源访问合理执行。

任意资源问题

       除了访问Android本地资源外,开发者通常需要访问任意像图形或者声音文件的资源。这些资源通常被打包到独立的Jar文件里,而不是集中放置一个位置,特别是第三方本地库。本地扩展机制不会内查这些Jar文件来找出或者抽取出来。相反,需要将它们从每个Jar文件拷贝出来然后手动放到一个特殊位置。

文件夹需要命名为raw并且必须放在打包ANE文件时标准Android资源放置的res文件下。所有raw目录里的文件都需要在应用打包时拷贝到Android APK文件的res/raw目录。这些文件可以通过本地代码的Resources.openRawResource() Android API访问。还需要调用FREExtensiongetResourceId()函数来获取合适资源标识符一边在openRawResource()调用时使用。

打包ANE文件

现在AS代码跟本地Java代码都构建好了,现在准备打包产生的库到链接到AS应用的本地扩展ANE文件了。此工作流程不是并入Flash Builder里,必须人工使用AIR开发工具ADT来在命令行实现。像SDK安装部分描述的一样,此工具可以在sdks/{version}/bin Flash Buidler 安装文件夹下或者eclipse/plugins/com.adobe.flash.compiler_{version}/AIRSDK/bin.下。

ANESampleBuilde.zip文件保护一个Bash Shell脚本-buildANE.sh,可以自动为例子代码打包本地扩展,也为打包提供了文件结构(如图7所示)。

<ignore_js_op>7.png

 

图7 ANESampleBuild.zip中的文件

使用此脚本,需要改变ADT及上面nativedir变量的文件路径设置。还需要解压整个ZIP文件的文件夹结构到Flash Builder项目文件目录下的ANESampleANESample_test文件夹。

adt="/Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722/AIRSDK/bin/adt"

nativedir="/Users/markhood/Documents/Eclipse64/ANESample_java"

 

rm -rf Android-ARM/*

rm -f SampleASExtension.ane library.swf

mkdir -p Android-ARM

 

unzip ../ANESample/bin/ANESample.swc library.swf

cp library.swf Android-ARM

cp "$nativedir"/ANESample.jar Android-ARM

cp -r "$nativedir"/res Android-ARM

 

"$adt"  package  target ane SampleASExtension.ane extension.xml  swc ../ANESample/bin/ANESample.swc -platform Android-ARM -C Android-ARM .

extension.xml

文件作为描述性文件为ADT提供连接本地扩展库到AS应用的必须信息。下面例子提供了相同功能的示例代码:

<extension xmlns="http://ns.adobe.com/air/extension/3.6">

  <id>com.adobe.sampleasextension</id>

  <versionNumber>1</versionNumber>

  <platforms>

    <platform name="Android-ARM">

      <applicationDeployment>

        <nativeLibrary>ANESample.jar</nativeLibrary>

        <initializer>com.adobe.sampleasextension.ANESample</initializer>

        <finalizer>com.adobe.sampleasextension.ANESample</finalizer>

      </applicationDeployment>

    </platform>

  </platforms>

</extension>

必须的结构如下:

·         如果使用AIR SDK3.6,那么命名空间使用:http://ns.adobe.air.extension.3.6

·         id: 这个名字必须是调用createExtensContext()里相同逆序的DNS形式。

·         platform name: 必须是Android本地扩展的"Android-ARM"。

·         nativeLibrary: 从Eclipse项目导出的Jar文件。

·         initialize 和 finalizer: 实现FREExtension的Java类。

       多平台可能需要本地扩展的支持,如果这样,那么它们必须在XML<platforms>节点里列出来。也可以提供一个纯AS的默认平台的实现,来防止特定平台没被实现。实现可能功能不强大,但是对于调试AS很有帮助。多平台的实现已经超出本教程的范围,音量控制教程则提供了很多好的示例。

library.swf

       Library.swf文件被编译到AS代码里。可以从AS构建后产生的ANESample.swc文件中解压得到。SWC文件位于ANESample项目目录的bin文件夹下。buildANE.sh脚本实现此功能并拷贝到Android-ARM文件夹里。

Android-ARM folder

       Android-ARM文件夹必须包含从Android源代码项目导出的Jar文件,还有从AS库里得到的library.swf文件以及Android项目的整个res文件夹。buildANE.sh脚本执行此功能。

代码标记

       ANE文件可以使用标准加密方法标记,但不是案例项目必须的。Cre.p12例子证书及其密码:password也提供。ADT-keystore-storepass用来标记代码。

ADT命令行

很多不同ADT选项都会导致打包成功。buildANE.sh脚本展示了典型命令行工作机制。第二个不同是用-keyword-storepass选项来标记给定证书的包。
命令行必须的选项:

·         包: 表示当前操作的包

·         目标: 表明正在打包一个ANE以及根据extension.xml指定的包名为SampleANEExtension.ane。

·         swc: 确定AS构建产生的SWC文件的位置,也需要确定library.swc的哦

·         平台: 确定实现本地扩展的平台,所有需要的本地元件都在Android-ARM(“-c Androind-ARM.”)目录里。所有必需元件放好后,运行buildANE.sh会产生连接到下一部分测试应用的SampleASExtension.ane库。如果好奇的话,可以解压ane文件看看里面的内容。

·         确保每次更改AS或者Android项目都会获得创建ANE的脚本,当然运行中不会遇到错误的情况下。这是缺乏结合Flash Builder工作流程的陷阱。整个流程可以自动作为Ant脚本合并到Flash Builder中,因此如果以前弄过Ant,可以使用Bash脚本自己写一个。

在AIR应用中使用本地扩展

       此部分包含处理构建及连接使用创建ANE文件的应用。需要建立一个Flex应用来建立一个最小代码量的用户界面。对新项目来说,可能需要用AS API构建整个应用。Flex测试项目包含在ANESampleTest.fxpANESampleTest.zip文件里。此压缩Flex项目可以直接导入Flash Builder里,下面的步骤将从头开始导入。将.fxp文件重命名为.zip文件并接要到选择的目录里。

项目初始化

1.       在Flash Builder的菜单栏选择文件>新建>Flex 移动项目。

确保选择了移动项目,否则很多Android部署需要的库跟特性都没法访问的哦。并且也不能将桌面应用转换为移动应用。

2.       项目名命名为:ANESampleTest。

3.       点击配置Flex SDK。

4.       需要选择配置不带AS2.0编译器的AIR SDK3.6时部署的Flex SDK。点击添加SDK到列表然后保证选择即可。

<ignore_js_op>8.png

 

图8 添加SDK

5.       点击确定

6.       确保新移动Flex项目对话框里显示了你选择需要使用的SDK。此对话框也表明SDK需要Adobe AIR 3.6(如图9)

7.       点击下一步。

<ignore_js_op>9.png

 

图9 确认SDK选中

8.       如果iOS选项框被选中则取消,保证只是选择Google的Android。.

9.       在应用模版下选择基于应用的视图应用(如图10)。

10.   点击两次下一步。

<ignore_js_op>10.png

 

图10 选择基于视图的应用

在构建路径对话框里,可以看到在库路径部分配置的Flex SDK的路径。

11.   选择本地扩展部分,点击添加ANE,然后浏览打包ANE时的ANESampleBuild文件夹。

12.   确保更新的AIR应用描述器被选中,然后点击确定。

       当前发布的Flash Builder4.7,可以在构建路径对话框入口的SampleASExtension.ane旁边看到有个红色的X(如图11)。点击三角会看到“此ANE不支持iOS设备,Mac桌面平台的错误。这是Flash Builder4.7里的一个警告。点击目标旁边的三角会发现ANE是支持GoogleAndroid的。

<ignore_js_op>11.png

 

图11 构建路径对话框

13.   点击完成结束项目初始化。

在包管理器中的src目录下看到一些新文件。

default/ANESampleTest.mxml此例子应用中一般是空的。views/ANESampleTestHomeView.mxml  在这里放置应用代码。ANESampleTest-app.xml  应用描述文件,需要待会做些编辑。

处理AS代码和本地扩展的更新

       在构建及调试带本地扩展的项目时,很自然的需要修正本地及AS库。由于打包ANE文件时从Flash Builder里解耦出来的,因此必须在修正库后重新创建ANE文件,然后告诉Flash Builder使用新的ANE

1.       重新构建ANE后,右击包管理器中的应用项目选择属性。

2.       选择Flex构建路径并点击本地扩展。

3.       点击并选择SampleASExtension.ane(如图12)。

4.       此时点击刷新来更新Flash Builder和新ANE文件。但实际上开发者发现更新失败。为了更好的效果,先点击去除,然后点击添加ANE来刷新ANE文件。

<ignore_js_op>12.png

 

图12 刷新本地扩展

       创建本地扩展和正常Flash Builder工作流程之间的处理过程缺乏衔接的确是个挑战。简单的使用发布版的本地扩展有点太直接,本地扩展开发者可不会那么简单的开发。

ANESampleTestHomeView.mxml

案例应用的主要代码位于ANESampleTestHomeView.mxml.

1.       从ANESampleTest文件拷贝代码并粘贴到代码编辑器里代替原来的代码。

2.       保存文件。

脚本只是导入SampleASExtension类并在1117行为按钮定义了两个点击处理函数。每个处理函数都生成一个新的SampleASExtension类然后调用扩展里定义的两个API方法(showBrowser()getVersion())。为每个新建的SampleASExtension类创建点击有点浪费,但是类的实现只创建在本地的静态ExtensionContext类。

ANESampleTest-app.xml

应用的描述文件时ANESampleTest-app.xml。大多数节点注出并维持原来方式,如果细心的话可以自己查看下。此处有些地方需要自行编辑或只是将ANESampleTest.fxp文件的内容粘贴到产生的文件来代替原来的XML

1.       30行的<versioinNumber>节点默认为:0.0.0.当点击Get Version按钮的时候例子应用就会显示版本号及AIR运行时的版本号。在此处放置些任意值以便确认函数的确是正常工作的。

应用会建立Android活动,因此需要在应用描述文件里声明下,也需要让应用的调试设为可运行。

2.  查找没有标记的<android>节点,里面内嵌有<manifest>节点。在关闭标签前添加如下内容: <application android:enabled="true" android:debuggable="true">

    <activity android:name="com.adobe.sampleasextension.WebViewActivity"></activity>

</application>

构建

构建应用前,需要建立Flex编译器来生成19版本的SWF,需要用ASC2.0编译器来构建产生默认的AS库的19版本,但Flex默认的编译器版本为14

1.       右击包管理器中的ANESampleTest项目选择属性>Flex编译器。

2.       在额外的编译器参数里添加:-swf-version=19,如果没有-locale en_US,则添加。如果不这样设置,会在打包应用时候出错。

<ignore_js_op>13.png

 

图13 添加额外编译器参数

3.       右击包资源管理器中的项目选择构建,此时不会产生问题。

       在包资源管理器中的bin-debug会找到两个构建后的产物:ANESampleTest-app.xmlANESampleTest.swf。注意不要讲bin-debug文件里的ANESampleTest-app.xml文件跟src文件夹里的混淆。如果编辑前者而不是src文件夹里的,那样在下一次构建时会丢失所做的修改。当导出发行版时这两个相同的文件都会在bin-release-temp文件夹下产生,当然警告对二者都适用。

Android上部署

导出Android APK包到设备上时需要一个pl2证书。为了测试,可以在ANESampleBuilde文件里找到pl2证书。同时需要一个Android设备通过USB连接到开发的机器上。

1.       选择项目>导出Flash Builder里构建的发行版。

2.       确认Google Android被选择为平台目标,导出文件夹也被设为一个合适的目录。默认目录是项目文件的根目录。

3.       点击下一步来配置Flex构建包。

4.       在标记代码和本地扩展选项没被选择的时候,数字签证和本地扩展按钮在对话框报错时都会被标记。

<ignore_js_op>14.png

 

图14导出发行版

4.       在部署部分,确认是需要安装并在打包应用后运行还是想共享已经安装在Android设备上的AIR运行时来包括AIR运行时的包。如果选择后者,需要将AIR3.6运行时安装在设备上,用户可以从特殊AIR下载URL来运行应用。此处的只是假设是安装并运行的,并且AIR运行时也已经在设备上安装了。

5.       在电子签名部分,浏览到ANESampleBuild文件夹下的cerp12证书的位置,使用password作为密码。

6.       在本地扩展部分,选择包来将SampleASExtension.ane文件包括进来。注意在选择此选项前会有SampleASExtension.ane的错误标记。

7.       点击完成来打包应用。

8.       在设备上安装并运行。

       如果需要AIR运行时安装或者更新,设备则需要获取那样做的允许。测试应用本身是简单的,本身的操作也是独立的。Android APK包、ANESampleTest.apk都留在项目的根目录里。如果Flash Builder4.7连接不到设备就会失败并产生APK包。如果应用没有安装在链接的设备上,则需要重连设备以及重新构建来解决问题。

注意:当修改为AS项目或本地库后,删除或者添加ANE文件到项目时,最终应用包里的ANE文件里包含的选项可能会重置。需要右击项目,选择性质>Flex Build>Google Android>本地扩展,然后确认包选项已经选择(如图15).

<ignore_js_op>15.png

 

图15. 重新选择包选项

调试本地扩展

可以使用Flash Builder来交互调试AS应用,使用Eclipse调试Android代码。此教程不包括详细的交互调试内容,只是有些关于建立调试设置的信息。

Flash Builder 调试设置

       AS上调试本地扩展的应用跟调试AS应用类似。Flash Builder工具栏有绿色调试图标来启动调试会话。旁边的运行图标则用来正常运行应用。

1.       点击调试图标右边的小箭头来创建并选择一个新的调试设置(如图16)。

<ignore_js_op>16.png

 

图16 选择调试设置

2.       选择移动应用并点击左边工具栏的新建按钮。

3.       命名为ANESampleTest.

调试设置可以保存,特定的描述合适配置的名字可以从工具栏选择。此处的ANESampleTest名字可以使用,但是如果在多个平台开发,则需要包括平台名字。

4.       确定目标平台是google的Android。启动方法选择设备上的通过USB调试(如图17)。

5.       点击调试来启动调试对话

图17 创建调试设置

<ignore_js_op>17.png

 

如果Flash Builder找不到连接的设备就会弹出选择设备对话框。如果这个对话框弹出来,那就断开并重现点击刷新连接设备。如果Flash Builder仍然找不到设备,确保设备的USB调试时可行的,这可以在Android设置>开发者选项里进行配置。

Flash Builder将会打包调试版本的应用,然后再设备上安装,等到连接。在设备屏幕上也可以看到显示等待的提示,但是待会被应用的带启动跟获取版本按钮的主界面代替的。

       如果没有设置任何断点,现在就可以,因为应用正等待点击按钮开始呢。此时可以向正常模式一样进行调试。可以打印出到ExtensionContext的所有东西。也可以查看任何加入代码里的trace语句。

Eclipse调试设置

由于没有运行主应用,因此直接用Eclipse调试本地代码实际是非常复杂的。但是还是可以建立监听并添加到运行应用中去。
启动时确保Eclipse以及调试连接到应用了。

1.       到Eclipse的DDMS视图选择窗口>打开视图>其他>DDMS。DDMS是google提供的能转发,处理线程信息,登陆查看等功能的调试工具。现在可能最感兴趣的就是左上角的设备区。那里是Android设备的入口处。如果没有设备列出,DDMS会连接失败,必须断开并重连设备或者在找到设备前重启DDMS。

理想情况下是想EclipseFlash Builder都连接到设备,但是有时很难实现。如果Flash BuilderDDMS连接后没能连上,需要直接从设备上运行调试版本的应用。调试版本的应用在运行调试版时安装在设备上的,如果前面步骤正确的话,你会找到的。它会主动连接Flash Builder,但是可以取消它。

2.       删除现在来自Flash Builder的断点,在SampleASExtension.as的createExtensionContext()函数调用前插入一个断点。然后从Flash Builder启动调试窗口。

实际可以不在AS里放置断点,因为应用启动后会等待用户输入,但是从一开始到本地代码启动是很有趣的。

由于已经在描述文件里标志应用为可调试,应该在Eclipse的DDMS视图里可以看到设备的入口点,通常都是带air.ANESampleTest.debug的。右边第一个数字是进程号,第二个是监听的端口,一般用8600.如果此应用是正常模式那可以选择启动进程并点击设备选项卡右边的绿色调试图标来建立连接。但是此案例中是会得到一个错误。

<ignore_js_op>18.png

 

图18 尝试调试时的错误

连接运行中的本地扩展需要首先建立特殊的监听。

3.       点击DDMS工具条右边的小三角形的调试图标,选择调试设置。

4.       选择远程Java应用并点击调试设置工具条左边的新建按钮。

5.       为设置起一个描述性的名字。项目名应该为:ANESample_java。输入应用处理过程中监听的端口号,通常使用8600或者类似的(如图19)。

<ignore_js_op>19.png

 

图19 创建监听

6.       点击调试,DDMS的设备方框区入口处可以看到一个绿色调试图标。

7.       打开调试视图并选择窗口>打开视图>在Eclipse里调试。就跟在Java视图看到的一样。

8.       在ANESample的createContext函数开始处插入一个断点,另一个在showBrowser FREFunction实现的call函数的起始处插入断点,或者其他你希望的地方都可以插入断点。

9.       点击Android设备应用上的启动活动按钮。如果在SampleASExtension构造器里添加了断点,调试器现在会停在这里。

10.   到Flash Builder的调试视图并跳过createExtensionContext()函数。

11.   在Eclipse里可以看到在createContext()起始处插入的断点导致的暂停,如果回到AS里的下一个语句,则选择跳过即可。

12.   指示Flash Builder从那里重新运行,这样就在Eclipse本地代码下一个断点处了,当然也可以继续单步调试。

13.   祝你成功哦!

之后

       到此为止以及完成了整个的开发、调试以及在Android平台上使用简单AIR本地扩展。此教程只是讲解某些方面并省略了其他很多东西,主要为了集中精力讲用EclipseFlash Builder4.7AIR SDK3.6开发Android Java代码。

 

这样看着比较凌乱,可以看word里的,格式等好点: <ignore_js_op>word.zip (1.42 MB, 下载次数: 99)

 

 

原文链接:http://www.adobe.com/devnet/air/articles/ane-android-devices.html

翻译词数:9000

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics