Adobe AIRの大きなメリットの1つとして、アプリケーションをクロスプラットフォームに展開できるという点が挙げられます。しかし、各プラットフォームで共通する機能の提供に注力してきた一方で、拡張性に閉じていました。そのため、AIRアプリ開発者は、新しい機能が欲しくても追加されるのをただ待つのみでした。

特にプラットフォーム固有の機能にアクセスできるようにしてほしいという要望は強く、AIR 2でネイティブアプリと連携するためのNativeProcessが実装されました。ただし、NativeProcessで可能となったのはネイティブアプリの起動や標準入出力を利用した連携のみ、またモバイルプラットフォームには非対応と限定的なものでした。

しかし、この状況は一変します。AIR 3では新機能「ネイティブ拡張(Native Extensions)」が追加され、開発者自身がAIRランタイムを拡張できるようになりました。ネイティブ拡張は、ネイティブコードとActionScriptクラスを組み合わせたものです。開発者は、ネイティブ拡張を使ってプラットフォーム固有の機能を最大限に活かすことができるようになります。

本連載では3回にわたり、ネイティブ拡張を使う上で必要となる基礎知識を解説します。まずは、ネイティブ拡張の概要から、開発・利用する際のポイントを取り上げます。

ネイティブ拡張とは

プラットフォームとのより深い統合が可能に

多くのデバイスには、下記のようにそれぞれのプラットフォームに固有な機能があります。しかし、従来のAIRランタイムからはこのようなプラットフォーム固有機能にアクセスできません。なぜならAIRランタイムは、できるだけ多くのプラットフォームで動作する共通機能のみが実装されてきたからです。

プラットフォーム固有の機能
デバイス プラットフォーム固有機能
モバイルデバイス (iOS、Android、PlayBook) 電話帳、各種センサー(磁気センサー、圧力センサー)、アプリ内課金、Bluetooth、OS連携
デスクトップデバイス (Windows、Mac OS X) データベース連携、USBデバイス連携、OS連携
テレビ用AIRデバイス チャンネル操作、番組表

AIR 3のネイティブ拡張を使えば、こうしたプラットフォーム固有機能であってもAIRランタイムに追加することができます。現在、AIR 3では次のデバイスを対象としてネイティブ拡張を利用できます。

  • Androidデバイス(Android 2.2 以降)
  • iOSデバイス(iOS 4.0以降)
  • Blackberry Playbook
  • AIR 3.0をサポートするWindowsデスクトップデバイス
  • AIR 3.0をサポートするMac OS Xデスクトップデバイス
  • テレビ用AIRデバイス(テレビ用AIR 2.5以降)

※ただし、下記のように実装不可能なこともあります。
・AIRランタイムの振る舞いを変更することはできない。
・プラットフォームに依存した表示方法を利用することはできない

2階層アーキテクチャ

これまでAIRアプリケーションは、UIやアプリケーションロジックなどをActionScriptで開発していました。ネイティブ拡張を使うと、下図のように2階層アーキテクチャになります。ActionScriptが画面/プレゼンテーションロジック/データモデルを担い、ネイティブコードがAIRランタイムを介さずにOSと連携します。

このアーキテクチャは何も新しいものではありません。多くのアプリケーションは、このように複数の言語で書かれたアーキテクチャで開発されてきました。AIRアプリケーション開発でもこのアーキテクチャを採用することよって、多くのメリットを享受することができます。

ActionScriptライブラリとしてのネイティブ拡張

ネイティブ拡張は、プラットフォームで動作するネイティブコードとActionScriptクラスを組み合わせたものです。それらを「.ane」という拡張子のファイル(ANEファイル)にパッケージングします。ANEファイルの構造は、ネイティブライブラリを含んだActionScriptライブラリ(SWCファイル)となります。そのため、他のActionScriptライブラリのようにアプリケーションとは独立して開発したり、共有したり、販売することもできます。

また、ネイティブ拡張は、1つのANEファイルでの複数のプラットフォームに対応させることができます。その場合、各プラットフォームのネイティブライブラリをANEファイルに格納します。つまり、プラットフォームごとにANEファイルを作成する必要はありません。

レガシーコードを再利用できる

アプリケーションの開発経験が豊富であれば、利用頻度の高いコードをライブラリとして持っているでしょう。また、洗練されたライブラリが数多く公開・共有されています。ネイティブ拡張では、それらのライブラリをラップして、AIRアプリケーションから扱うことができるようになります。

パフォーマンスを向上させることができる

ネイティブ拡張は、ActionScriptで不可能なことを実現するためだけのものではありません。例えば、負荷の大きい計算を実行するためにも使用することができます。ActionScriptでも実装できるものの、パフォーマンスの高度な最適化が必要な場合は、代わりにネイティブコードの処理を呼び出すことで解決します。

ネイティブコードでの最適化にはいくつか重要な方法があります。最高のパフォーマンスを得るために計算処理をC言語やアセンブリで記述できます。または、ネイティブコードをマルチコアで並行処理させます。

ネイティブ拡張の開発のポイント

ネイティブ拡張を開発するには、いくつかのスキルが必要です。

  • APIデザイン
  • 実装のトレードオフの評価
  • ランタイム拡張APIについての熟知
  • 各種プラットフォームごとのツールを使った開発

開発ツール

ネイティブ拡張を開発するには、ActionScriptとネイティブコードを記述するツールがそれぞれ必要になります。ActionScriptは、Flex SDKやFlash Builderなどを用います。ネイティブコードは、プラットフォームごとに開発ツールが異なり、プラットフォームごとに最適なネイティブライブラリが生成されます。

プラットフォームごとのライブラリファイル
プラットフォーム ライブラリファイル
Android Java Archive (.jar) or shared library (.so)
iOS Static library (.a)
Mac OS X Framework (.framework)
Windows Dynamic Link Library (.dll)

ネイティブコードAPI

AIR 3には、ネイティブコードと連携するために必要となる、ActionScript拡張クラスを実装するためのネイティブコードAPIがあります。実装する言語ごとに、C APIとJava APIの2つがあります。

ネイティブコードAPIとその言語
ネイティブコードAPI 言語
C API C言語
Java API Java

ネイティブコードは、C言語または Javaのいずれかを使用してActionScript拡張クラスから操作されます。ただし、ネイティブコードは、ネイティブコードAPIと異なる言語を使用しても問題はありません。例えば、C APIを使用する開発者は、C++/Objective-C/アセンブラコード(高度に最適化されたルーチンの活用)も使用できます。なお、ターゲットとなるデバイスごとに使用すべきネイティブコードAPIがあります。

デバイスと使用すべきネイティブコードAPI
デバイス 使用するネイティブコードAPI
Androidデバイス Java APIとAndroid SDK
C APIとAndroid SDK
iOSデバイス C AP
Blackberry PlayBook C APIまたは Java API
Windowsスクトップデバイス C API
Mac OS X デスクトップデバイス C API
テレビ用AIRデバイス C API

ネイティブ拡張APIの定義

ネイティブ拡張は、ActionScriptのAPIとして利用されます。その際、どのように使われるのかを設計する必要があります。例えば、プラットフォームとの統合が深いと、他のプラットフォームでは利用できないようにする、または利用制限する必要があります。ビルトインAPIの中には、下記のように利用状況を想定して設計されているので、参考にするといいでしょう。

  • プラットフォームでAPIをサポートしているかどうか(NativeWindow.isSupported, Camera.isSupportedなど)
  • プラットフォームで利用できる値をAPIで制限(Multitouch.supportedGestures, Camera.getCameraなど)
  • プラットフォームを判別してAPIの内部で処理する(NativeApplication.startsAtLoginなど)

ネイティブ拡張で公開するAPIは、できる範囲でActionScriptと同じ規則を採用すべきです。例えば、ビルトインAPIは通知するためにイベントを利用するので、ネイティブ拡張でも同様にすべきです。なお、プラットフォームによっては、異る規則を使う必要がありえます。

ネイティブ拡張記述ファイル(extension.xml)の構造

ネイティブ拡張記述ファイルは、ネイティブ拡張について記述したXMLファイルです。拡張ID/名前/バージョン番号/実行可能なプラットフォームなど、ネイティブ拡張に関する情報を記述します。このファイルは、パッケージング時にANEファイルに格納されます(図2)。

extension.xml

<extension xmlns="http://ns.adobe.com/air/extension/2.5"> <id>拡張ID </id> <versionNumber>バージョン番号</versionNumber> <name> <text lang="ロケール">名前</text> </name> <platforms> <platform name="プラットフォーム"> <applicationDeployment> <nativeLibrary>ネイティブライブラリファイル名</nativeLibrary> <initializer>初期化時に呼び出す関数名またはクラス名</initializer> <finalizer>破棄時に呼び出すの関数名またはクラス名</finalizer> </applicationDeployment> </platform> <platform name="default"> <applicationDeployment/> </platform> </platforms> </extension>

プラットフォームのname属性には次の値を使用します。

  • Windows-x86(Windows デバイスの場合)
  • MacOS-x86(Mac OS X デバイスの場合)
  • Android-ARM(Android デバイスの場合)
  • iPhone-ARM(iOS デバイスの場合)
  • default(指定されていない場合)

シミュレーションの支援

ネイティブ拡張は、対象外となるプラットフォームも定義もすることができます。それは、開発時のシミュレーターで利用するためです。例えば、モバイルプラットフォームを対象とするネイティブ拡張の場合、シミュレーターが動くデスクトッププラットフォーム向けにも定義を行います。その際、シミュレーションで動く程度の処理をActionScriptで記述します。

また、プラットフォームのname属性を「default」にして、ネイティブライブラリが含まれていないことを示すこともできます。詳細については次回のネイティブ拡張のデバック方法で説明します。

ネイティブ拡張を利用する方法

Flash Builderの場合、バージョン4.6(年内に公開予定)でネイティブ拡張を用いた開発に対応します。詳しくは、「Flash Builder 4.6 でネイティブ拡張(Native Extensions)を使ってみよう」を参照してください。

以下に、AIR SDKを使った方法を解説します。

アプリケーション記述ファイルの変更

AIRアプリケーションにネイティブ拡張を使う場合、AIRアプリケーションからネイティブ拡張に対してリンケージを指定する必要があり、その旨をアプリケーション記述ファイルに書きます。下記は、extensionIDがnativeExtension1を利用する場合です。

<extensions> <extensionID> com.example.Extension1</extensionID> </extensions>

コマンドラインツールを使った作業

ADLを使ってアプリケーションのデバック時にネイティブ拡張を使うためには、ネイティブ拡張を含むANEファイルをディレクトリに解凍します。解凍したディレクトリをADLのextdirで指定したディレクトリに移動します。ANEファイルはZIPファイルなので、ZIP解凍ツールを使います。ネイティブ拡張を解凍したディレクトリの名前は、必ず「.ane」で終わっている必要があります。下記は、SampleExtension.aneとした場合です。

adl -extdir extensions SampleApp.mxml

この場合、extdir引数で指定されているextensionsの中にSampleExtension.aneを解凍したSampleExtension.aneディレクトリを置きます。

SampleApp.xml extensions/ SampleExtension.ane/ META-INF/

次にADTのextdir引数で指定したディレクトリにネイティブ拡張を含むANEファイルを置きます。ここではextensionsの中にSampleExtension.aneを置きます。

adt –package -target native SampleApp.exe SampleApp-app.xml -C bin-debug SampleApp.swf \ -extdir extensions

パッケージ

ネイティブ拡張を利用しているアプリケーションをパッケージする場合、ネイティブ拡張も一緒にAIRアプリケーションとパッケージする必要があります。開発者は、ネイティブ拡張を利用するには、現状はコマンドラインツールADTを使う必要があります。

まとめ

本記事では、AIR 3の新機能であるネイティブ拡張の概要について説明しました。この機能によって今までのAIRアプリケーションではできなかった機能を追加することができるようになります。それだけなく、レガシーコードの再利用や、パフォーマンスを向上させることができます。

次回は、ネイティブ拡張を作成して、サンプルモバイルアプリケーションの開発について説明します。

関連情報

ネイティブ拡張(Native Extensions)入門

 

Flash Builder 4.6でネイティブ拡張(Native Extensions)を使ってみよう