はじめに
今までのAdobe AIRは、クロスプラットフォームで展開されるため各プラットフォームで共通する機能のみが提供されていました。つまり、プラットフォーム固有の機能にはAIR上からアクセスすることができませんでした。
今回、AIR 3に追加された新機能「ネイティブ拡張(Native Extensions)」を利用すると、開発者はAIRランタイムを拡張でき、AIR上からネイティブコードを使ったプラットフォーム機能へとアクセスできるようになります。本記事では、このネイティブ拡張の概要、および先日リリースされたばかりの「Flash Builder 4.6」を用いたネイティブ拡張の使い方について解説していきます。
Flash Builder 4.6は、Adobeのサイトよりダウンロードが可能です。下記のボタンからダウンロードすると、60日間無料で利用できる体験版を使用できます。ダウンロードにはAdobe IDが必要ですが、以前作成したことがあれば、そのIDを利用可能です。インストールの手順はバージョン4.5と同様なので、次の記事も参考にしてください。
Adobe AIR 3「ネイティブ拡張」とは
ネイティブ拡張とは、ネイティブコードとActionScriptクラスを組み合わせたものです。開発者は、ネイティブ拡張を使ってプラットフォーム固有の機能を最大限に活かすことができます。この機能を利用するメリットには、次の3つがあります。
1)プラットフォームへのアクセス
多くのデバイスには、それぞれに次のようなプラットフォーム固有の機能があります。
プラットフォーム固有の機能
-
モバイルデバイス(iOS、Android、BlackBerry)
電話帳、各種センサー(磁気センサー、圧力センサー)、アプリ内課金、Bluetooth、OS連携
-
デスクトップデバイス(Windows、Mac OS X)
データベース連携、USBデバイス連携、OS連携
-
テレビ用AIRデバイス
チャンネル操作、番組表
従来のAIRランタイムからは上記のような機能にはアクセスできませんでしたが、ネイティブ拡張を使えば、こうしたプラットフォーム固有機能にアクセスする機能をAIRランタイムに追加できます。現在、ネイティブ拡張は、次のデバイスで利用可能です。
- Androidデバイス(Android 2.2以降)
- iOSデバイス(iOS 4.0以降)
- Blackberry Playbook
- AIR 3.0をサポートするWindowsデスクトップデバイス
- AIR 3.0をサポートするMac OS Xデスクトップデバイス
- テレビ用AIRデバイス(テレビ用AIR 2.5以降)
2)コードの再利用
アプリケーションの開発を行う上で利用頻度の高いコードは、既にライブラリとして持っていると思います。さらに、洗練されたライブラリも既に数多く公開・共有されています。ネイティブ拡張では、それらのライブラリをラップして、AIRアプリケーションから扱うことができるようになります。
3)パフォーマンスを向上
ネイティブ拡張は、ActionScriptだけでは実現できないことを可能にするだけのものではなく、負荷の大きい計算を実行するためにも使用できます。ActionScriptでも実装できるものの、パフォーマンスの高度な最適化が必要な場合は、代わりにネイティブコードの処理を呼び出すことで解決できるでしょう。
ネイティブ拡張の開発について
次に、ネイティブ拡張の開発方法について説明していきます。手順は以下のようになります。
-
ネイティブ拡張ライブラリの作成
プラットフォームに依存したネイティブコードを使用して作成します。
-
ネイティブ拡張ActionScriptライブラリの作成
ネイティブ拡張ライブラリと連携するためのライブラリを作成します。
-
ネイティブ拡張記述ファイルの作成
ネイティブ拡張を定義するためにネイティブ拡張記述ファイルを作成します。
-
ANEファイルへパッケージング
ネイティブ拡張ライブラリとネイティブ拡張ActionScriptライブラリをANEファイルへパッケージングします。
ネイティブ拡張ライブラリの作成
ネイティブ拡張には、各プラットフォームと連携するためのネイティブAPIが用意されています。ネイティブAPIには次の2種類が用意されており、JavaとCの2つの言語で利用できます。
-
ネイティブ Java API:Java言語
プラットフォーム:Android
-
ネイティブ C API:C言語
プラットフォーム:iOS、Blackberry、Windows、Mac OS X
ネイティブ Java API
では、ネイティブ Java APIを使ったネイティブ拡張ライブラリの作成方法を説明します。
開発準備
ネイティブ Java APIを使って開発するには、下記のjarファイルが必要になります。
AIR 3 HOME/lib/android/FlashRuntimeExtensions.jar
jarファイルには、ネイティブ拡張を作成するためのクラスやインターフェイスが定義されています。詳細はネイティブ Java API リファレンス(英語)を参照ください。
今回はネイティブ Java APIのサンプルとして、Androidのバイブレーター機能を実行させるネイティブ拡張ライブラリを作成していきます。
Androidプロジェクト作成
まず、Eclipseを使用してAndroidプロジェクトを作成します。[ファイル]-[新規]-[Android Project]から[New Android Project]ウィザードを開きます。
[New Android Project]ウィザードで、Android SDKのターゲットに「Android 2.3.3」を選択します。
アプリケーション情報を入力します。アプリケーション名を「VibrateANE」として[終了]ボタンをクリックし、プロジェクトを作成します。
Androidプロジェクトが作成できたら、ネイティブ Java APIの「FlashRuntimeExtensions.jar」をビルドパスに指定します。これで開発環境が整います。
ネイティブ拡張関数クラスを作成
プラットフォームの機能にアクセスするロジックを記述するためには、com.adobe.fre.FREFunctionを実装したネイティブ拡張関数クラスを実装します。
ネイティブ拡張関数クラスとは、ActionScript側からネイティブ拡張コンテキスト経由で呼び出すことができるクラスを示します。実装するのは、call関数です。この関数の中にロジックを記述します。ActionScriptにデータを返したい場合は、FREObjectに変換して返り値にします。
作成例
サンプルファイルでは、call関数の中でAndroidのバイブレーター機能を呼び出す処理を実装しています。
public class VibrateNowFunction implements FREFunction { @Override public FREObject call(FREContext context, FREObject[] args) { FREObject result = null; Activity activity = context.getActivity(); Vibrator vb = (Vibrator) activity .getSystemService(Context.VIBRATOR_SERVICE); vb.vibrate(1000); return result; } }
ネイティブ拡張コンテキストクラスを実装
ネイティブ拡張関数をネイティブ拡張コンテキストに登録するため、com.adobe.fre.FREContextクラスを継承してネイティブ拡張コンテキストクラスを実装します。実装する関数については、次の表のようになります。
関数名 | 目的 |
getFunctions | ネイティブ拡張コンテキストに登録するネイティブ拡張関数マップを返す。このマップは、キーを関数名、値をFREFunctionのインスタンスとし、ネイティブ拡張コンテキスト内部で登録される |
dispose | ネイティブ拡張コンテキストが破棄されるときに呼びだされる関数 |
作成例
サンプルファイルでは、VibrateNowFunctionネイティブ拡張関数クラスのインスタンスをVibrateNowという関数名で登録しています。これによって、ActionScriptからVibrateNowをキーにして、VibrateNowFunctionネイティブ拡張関数を呼び出すことができます。
public class VibratorANEContext extends FREContext { public VibratorANEContext() { } @Override public Map<String, FREFunction> getFunctions() { Map<String, FREFunction> functionMap = new HashMap<String, FREFunction>(); functionMap.put("VibrateNow", new VibrateNowFunction()); return functionMap; } @Override public void dispose() { } }
ネイティブ拡張クラスを作成
ネイティブ拡張コンテキストを管理するため、com.adobe.fre.FREExtensionインターフェイスを実装したネイティブ拡張クラスを作成する必要があります。このクラスは、ネイティブ拡張ごとに1つ作成します。
関数名 | 目的 |
initialize | ネイティブ拡張が初期化されるときに呼びだされる関数。ActionScriptのExtensionContext.createExtensionContext()を呼び出すことで実行される |
createContext | ネイティブ拡張コンテキストを生成するための関数。引数の値を用いて目的に応じたコンテキストを作成することも可能 |
dispose | ネイティブ拡張が破棄されるときに呼びだされる関数。ActionScriptのExtensionContext.dispose()を呼び出すことで実行される |
作成例
サンプルファイルでは、createContext関数の戻り値にVibratorContextクラスのインスタンスが返るように実装しています。
public class VibratorANEExtension implements FREExtension { @Override public FREContext createContext(String arg0) { return new VibratorANEContext(); } @Override public void dispose() { } @Override public void initialize() { } }
jarファイル作成
ソースが作成できたら、コンパイルしてjarファイルを作成します。
作成例
サンプルファイルでは、Androidプロジェクトのコンテキストメニューの[エクスポート]より、VibratorANE.jarをエクスポートしています。
ネイティブ C API
続いて、ネイティブ C APIを使ったネイティブ拡張ライブラリの作成方法を説明します。
開発準備
ネイティブ C APIを使って開発するには、次のヘッダーファイルが必要になります。
AIR 3 HOME/include/FlashRuntimeExtensions.h
また、コンパイルする場合、次のライブラリファイルが必要になります。
プラットフォーム | ライブラリ |
Android | AIR 3 HOME/lib/ android/FlashRuntimeExtensions.so |
Windows | AIR 3 HOME/lib/win/FlashRuntimeExtensions.lib |
ヘッダーファイルには、AIRとネイティブコード間のインターフェイス、型、関数が定義されています。詳細については、ネイティブ C API リファレンス(英語)を参照ください。
今回は、ネイティブ C APIのサンプルとして、iPhoneのバイブレーター機能を実行させるネイティブ拡張ライブラリを作成していきます。
Cocoa Touch Static Libraryプロジェクト作成
まず、XCode 4.1を使用してCocoa Touch Static Libraryプロジェクトを作成します。[File]-[New]-[New Project]を選択します。
[Choose a template for your new project]ウィザードが開きます。「Cocoa Touch Static Library」を選択して[Next]ボタンをクリックします。
[Product Name]に「VibratorANE」を入力し、プロジェクトを作成します。
Cocoa Touch Static Libraryプロジェクトが作成できたら、ネイティブ C APIのFlashRuntimeExtensions.hを追加します。FlashRuntimeExtensions.hを追加するには、プロジェクトのコンテキストメニューから[Add Files to]を選択し、ファイルダイアログで「FlashRuntimeExtensions.h」を指定します。これで開発環境が整います。
ネイティブ拡張関数を作成
ネイティブ拡張関数は、ヘッダーに定義されているFREFunction関数型で実装する必要があります。FREFunction関数型は、次のようになります。
関数型名 | 目的 | ||||||
FREFunction |
この関数型の引数と同じ関数を作成してその中にロジックを記述します。ActionScriptにデータを返したい場合は、FREObjectに変換して返り値にします。
|
作成例
サンプルファイルでは、iOSのバイブレーター機能を呼び出す処理を実装しています。
id vibrator; @implementation VibratorANE - (void)vibrate { AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); } @end FREObject VibrateNow(FREContext ctx,void* funcData,uint32_t argc,FREObject arg[]){ [vibrator vibrate]; return NULL; }
ネイティブ拡張コンテキストの初期化関数と破棄関数を作成
ネイティブ拡張コンテキストの初期化関数と破棄関数は、ネイティブ拡張の初期化時に必要です。この初期化関数を使用して、ネイティブ拡張コンテキストに登録するネイティブ拡張関数を指定できます。実装する関数型については、次のようになります。
関数型名 | 目的 | ||||||||||||||
FREContextInitializer |
ネイティブ拡張コンテキストが初期化されるときに呼びだされる関数
|
||||||||||||||
FREContextFinalizer | ネイティブ拡張コンテキストが破棄されるときに呼びだされる関数 |
作成例
サンプルファイルでは、関数名VibrateNowとVibrateNowFunctionネイティブ拡張関数クラスのインスタンスを関連付けています。これによって、ActionScriptからVibrateNowをキーにしてVibrateNowFunctionネイティブ拡張関数を呼び出すことができます。
void ContextInitializer(void* extData, const uint8_t* ctxType, FREContext ctx, uint32_t* numFunctionsToTest, const FRENamedFunction** functionsToSet) { *numFunctionsToTest = 1; FRENamedFunction* funcs = (FRENamedFunction*)malloc(sizeof(FRENamedFunction)*1); funcs[0].name = (const uint8_t*)"VibrateNow"; funcs[0].functionData = NULL; funcs[0].function = &VibrateNow; *functionsToSet = funcs; VibratorANE *selfRef = [[VibratorANE alloc] init]; vibrator = selfRef; } void ContextFinalizer(FREContext ctx) { [vibrator release]; return; }
ネイティブ拡張の初期化関数と破棄関数を作成
ネイティブ拡張は、初期化関数と破棄関数をネイティブ拡張ライブラリに定義する必要があります。この初期化関数を使用して、ネイティブ拡張コンテキストの初期化関数と破棄関数を登録できます。また、この2つの関数は、ネイティブ拡張ごとに1組作成します。実装する関数型については、次のようになります。
関数型名 | 目的 | ||||||
FREInitializer |
ネイティブ拡張が初期化されるときに呼びだされる関数
|
||||||
FREFinalizer | ネイティブ拡張が破棄されるときに呼びだされる関数。ActionScriptのExtensionContext.dispose()を呼び出すことで実行されます。 |
作成例
サンプルファイルでは、ContextInitializer関数をネイティブ拡張コンテキストの初期化関数に、ContextFinalizer関数をネイティブ拡張コンテキストの破棄関数に指定しています。
void ExtInitializer(void** extDataToSet, FREContextInitializer* ctxInitializerToSet, FREContextFinalizer* ctxFinalizerToSet) { *extDataToSet = NULL; *ctxInitializerToSet = &ContextInitializer; *ctxFinalizerToSet = &ContextFinalizer; } void ExtFinalizer(void* extData) { return; }
aファイル作成
Cocoa Touch Static Library Projectのビルドが通ると、次のような図になります。
作成例
サンプルファイルでは、ビルドが成功するとlibVibratorANE.aが生成されます。このファイルをコピーしたい場合は、libVibratorANE.aのコンテキストメニューの[Show in Finder]をクリックしてFinderで開きます。
ネイティブ拡張記述ファイルの作成
ネイティブ拡張記述ファイルは、ネイティブ拡張を定義するためのXMLファイルです。このファイルは、ANEファイル作成時と、AIRアプリケーションに組み込む際に必要になります。
<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>
記述ファイルで使用するタグは、主に次のようなものがあります。
- <id>:このIDは、ActionScriptからネイティブ拡張を指定する際に使います。拡張IDと呼びます。
- <nativeLibrary>:ネイティブ拡張ライブラリのファイルを指定します。
- <platform>:プラットフォームを指定します。
Name要素には、下記のようなプラットフォームを示す値を入れます。
name要素の値 | プラットフォーム | デバイス |
Windows-x86 | Windows | Windows デスクトップ |
MacOS-x86 | MacOS | MacOS デスクトップ |
Android-ARM | Android | Android デバイス |
iPhone-ARM | iOS | iPad, iPhone |
QNX-ARM | BlackBerry | BlackBerry PlayBook |
default | プラットフォームが指定されていない場合 |
また、AIR Debug Launcher(以下、ADL)を使用したシミュレーターでアプリケーションを実行した場合のプラットフォームは、defaultが選択されます。
-
<initializer>:
Java APIの場合は、FREExtensionを実装したクラスの完全限定名を指定。C APIの場合は、初期関数名を指定
-
<finalizer>:
Java APIの場合は、FREExtensionを実装したクラスの完全限定名を指定。C APIの場合は、破棄関数名を指定
作成例
サンプルファイルでは、次のようなネイティブ拡張記述ファイルをextension.xmlとして作成します。ここでは、Android向けの設定とiOS向けの設定を行っています。プラットフォームがdefaultの場合は、ネイティブ拡張ライブラリの指定は必要ありません。
<?xml version="1.0" encoding="utf-8"?> <extension xmlns="http://ns.adobe.com/air/extension/2.5"> <id>example.ane.vibrator</id> <versionNumber>1.0.0</versionNumber> <platforms> <!-- Androidプラットフォーム向け --> <platform name="Android-ARM"> <applicationDeployment> <nativeLibrary>VibratorANE.jar</nativeLibrary> <initializer>example.ane.ext.VibratorANEExtension</initializer> <finalizer>example.ane.ext.VibratorANEExtension</finalizer> </applicationDeployment> </platform> <!-- iPhoneプラットフォーム向け --> <platform name="iPhone-ARM"> <applicationDeployment> <nativeLibrary>libVibratorANE.a</nativeLibrary> <initializer>ExtInitializer</initializer> <finalizer>ExtFinalizer</finalizer> </applicationDeployment> </platform> <!-- デフォルトプラットフォーム --> <platform name="default"> <applicationDeployment/> </platform> </platforms> </extension>
ネイティブ拡張ActionScriptライブラリの作成
ネイティブ拡張ライブラリを呼び出すためのActionScriptライブラリを作成します。このライブラリをネイティブ拡張ActionScriptライブラリと呼びます。ネイティブ拡張ActionScriptライブラリの作成には、Flash BuilderのFlexライブラリプロジェクトを使用します。
ここでは、前ページまでで作成したネイティブ拡張ライブラリを用いて説明します。
ネイティブ拡張コンテキストの取得
ネイティブ拡張ライブラリと連携するためActionScriptのExtensionContextクラスのcreateExtensionContext関数を呼び出し、ネイティブ拡張コンテキストをExtensionContextインスタンスとして取得します。
拡張IDは、ネイティブ拡張記述ファイルで指定した値と一致させます。
var extContext:ExtensionContext = ExtensionContext.createExtensionContext(拡張ID, コンテキスト作成引数);
ネイティブ拡張関数の呼び出し
ネイティブ拡張コンテキストに登録されているネイティブ拡張関数を呼び出すには、ExtensionContextインスタンスのcall関数を使って呼び出します。
extContext.call(ネイティブ拡張関数名, ネイティブ拡張関数引数);
作成例
サンプルファイルでは、ネイティブ拡張ライブラリに登録されているGetVibrator関数を呼び出すクラスを作成します。次のようにコンパイル引数に「-swf-version 13」を指定して、このクラスをコンパイルしてSWCファイルを作成します。
package example.ane { import flash.display.BitmapData; import flash.events.EventDispatcher; import flash.external.ExtensionContext; public class Vibrator extends EventDispatcher { private var _context:ExtensionContext; public function Vibrator() { try{ _context = ExtensionContext.createExtensionContext("example.ane.vibrator", "type"); } catch(e:Error){ } } public function vibrateNow():void { if( _context != null ){ _context.call("VibrateNow"); } } public function dispose() : void { if( _context != null ){ _context.dispose(); } } } }
ANEファイルへパッケージ
ネイティブ拡張ライブラリ、ネイティブ拡張記述ファイル、ネイティブ拡張ActionScriptライブラリが作成できました。次は、AIR Developer Tools(以下、ADT)を使用して、ネイティブ拡張ライブラリとネイティブ拡張ActionScriptライブラリを組み合わせたANEファイルを作成します。
ANEファイルとは、「.ane」という拡張子がついたActionScriptライブラリ(SWCファイル)の構造をしたファイルです。実際には、ネイティブ拡張ライブラリを含んだActionScriptライブラリとなります。1つのANEファイルには、複数のプラットフォーム向けのネイティブ拡張ライブラリを格納できるため、プラットフォームごとにANEファイルを作成する必要はありません。
ANEファイルパッケージ前準備
ADTでパッケージする前に、必要な作業が2点あります。
-
library.swfの抽出
ネイティブ拡張ActionScriptライブラリのSWCファイルはZip形式なので、 Zipツール等を使って展開することができます。プラットフォームごとにフォルダを作成して、その展開したフォルダの中にあるlibrary.swfをコピーします。
-
証明書の作成
これは、Flash BuilderでAIRアプリケーション開発時に作成する証明書を使うことができます。ネイティブ拡張を作成して配布する際は、AIRのAdobe AIRコード署名証明書を利用すべきです。
ANEファイルパッケージ
ADTでANEファイルにパッケージするには、次のコマンドを実行します(実際には1行)。
adt -package -storetype pkcs12 -keystore 証明書ファイル -target ane ANEファイル名 ネイティブ拡張記述ファイル -swc ネイティブ拡張ActionScriptライブラリ -platform プラットフォーム名 -C プラットフォームディレクトリ .
作成例
サンプルファイルでは、Vibratorフォルダ直下にて次のADTコマンドを実行し、ANEファイルにパッケージングします(実際には1行)。
adt -package -storetype pkcs12 -keystore test.p12 -target ane VibratorExtension.ane extension.xml -swc bin\VibratorExtension.swc -platform Android-ARM -C platform\android . -platform iPhone-ARM -C platform\iphone . -platform default -C platform\default .
AIRアプリケーションへの組み込み
ネイティブ拡張のANEファイルが生成できたので、Flash Builder 4.6を用いてAIRアプリケーションに組み込みます。
FlexビルドパスにANEファイルを追加
Flexモバイルプロジェクトのコンテキストメニューの[プロパティ]を開きます。そして、[Flexビルドパス]パネルの[ネイティブエクステンション]のタブを開きます。次の図のように、現在使用しているネイティブ拡張の一覧と詳細が真ん中に表示されます。
ネイティブ拡張を追加するためには、[ANEを追加]ボタンを押下して、ANEファイルを選択します。[フォルダ追加]ボタンを押下してANEファイルが含まれているフォルダを指定し、フォルダ内のネイティブ拡張を探して追加してください。
追加したANEファイルは、通常のActionScriptライブラリと同様にコード補完の対象となります。
また、[AIRアプリケーション記述子を更新]にチェックを入れると、次のコードが追加されます。これは、パッケージング時にアプリケーションの使用するネイティブ拡張を示すためです。
<extensions> <extensionID>example.ane.vibrator</extensionID> </extensions>
作成例
サンプルファイルでは、ボタンを押すとネイティブ拡張を利用してバイブレーターを動作させるFlexモバイルアプリケーションを作成します。[Start Vibrator]ボタンを押下し、ネイティブ拡張コンテキストからVibrateNowネイティブ関数を呼び出します。
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" applicationDPI="160"> <fx:Script> <![CDATA[ import example.ane.Vibrator; import mx.events.FlexEvent; private var vibrator:Vibrator; protected function button1_clickHandler(event:MouseEvent):void { if( vibrator == null ){ vibrator = new Vibrator(); } vibrator.vibrateNow(); } ]]> </fx:Script> <s:Button label="Start Vibrator" click="button1_clickHandler(event)"/> </s:Application>
ANEファイルのパッケージ設定
リリースビルドを書き出す際や、FlexモバイルプロジェクトのプロパティのFlexビルドのパッケージ化のパネルで、ターゲットOSごとにANEファイルのパッケージ設定を行います。
次のようにネイティブ拡張を呼び出しているのに、該当するANEファイルをパッケージ化されていない旨が通知されるので、使うネイティブ拡張の列にあるパッケージのチェックボックスにチェックを入れます。
チェックを入れると、パッケージ化の対象になります。
また、ネイティブ拡張記述ファイルの項目について、次のような検証を行ってくれます。
- id:ネイティブ拡張のIDが正しいか
- nativeLibrary:ネイティブ拡張の利用時に、ネイティブ拡張ライブラリを含んでいるか
- initializer:初期化時に呼び出される関数やネイティブ拡張エクステンションクラスが存在するか、また、それらの名称が重複していないか
- finalizer:終了時に呼び出される関数やネイティブ拡張エクステンションクラスが存在するか、また、それらの名称が重複していないか
おわりに
本記事では、AIR 3の新機能「ネイティブ拡張」と、ネイティブ拡張をFlash Builder 4.6で利用する方法について説明しました。ネイティブ拡張を利用することで、プラットフォームごとにさまざまな機能が使えるようになりました。また、ネイティブコードで作られたライブラリなどの資産も活用でき、さらに重い処理をネイティブコードで処理することによりパフォーマンス向上が期待できます。
Flash Builder 4.6を使ってネイティブ拡張を利用すると、ネイティブ拡張のANEファイルの設定を簡単に行うことができます。コード補完もデバッグも通常通り行うことができ、ネイティブ拡張を意識する必要はありません。ぜひ、Flash Builder 4.6で生産性の高いモバイルアプリケーション開発を試してみてください。