2013/04/07

Test Titanium Android App on emulator using Intel x86 Atom System Image

(先日Appcelerator Developer Blogで、
Configuring Appcelerator Titanium to Use Intel x86 Images
としてx86エミュレータを使う方法が説明されました。そこでは主にコマンドラインからの使用法を解説されています。ここでは、それとは独立にTitanium Studioから使う場合のハマりそうなポイントを書いておきます)。

Intel x86 AtomベースのAndroid端末の登場とともに、Intelは、開発ツール群そろえてくれていて、x86 Atom用のAndroid エミュレータも提供しています。そのエミュレータが比較的高速に動くので、テストやデバックの効率が良くなります。
x86 Android端末のお披露目のときに伺った話では、x86 Android端末では、ARMベースのネイティブコードを含むAppも「Intelのスーパーテクノロジでエミュレートできる」とのことです(「スーパーテクノロジ」がなんなのかは、開発担当者しかわからないとのことでしたが。。)もしかするとx86エミュレータでも、v8エンジンなどのARMネイティブコードを含むTitanium mobile Appの開発に使えるかもしれないと淡い期待を抱きます(Titanium SDK 2.1.0GA以降x86のネイティブコードが追加されています 捕捉参照)。
Javaによる開発では、x86 エミュレータでさくさく開発できるのですが、Titaniumで使うとうまくいかない状況が続いていました。Titanium SDK 2.xの場合、エミュレータにAndroid (x86) を指定しても、ARM エミュレータが立ち上がっていましたが、Titanium SDK 3.0.0.GA以降は、正しくx86 エミュレータが起動します。


必要なことは
1) AVDマネージャからIntel x86 Atom System Imageを導入
2) Google謹製のGoogle Map API (com.google.android.maps) を導入したsystem.imgを作成
です。

1)はいろいろなサイトで紹介があるので、ここを参考に導入されると良いでしょう。
Titanium Studioから導入する場合には、Android SDK Managerを起動するために、Java Perspective に切り替える必要があります([Window > Open Perspective > Other ... > Java])。これ以外の点は特に問題ないでしょう。
Android SDK の extras にある Intel Hardware Accelerated Execution Manager の導入もお忘れなく。


2)は、配布されているx86のsystem.imgにGoogle Map API が含まれていないためで、TitaiumからGoogle Map API を使用していないのであれば、必要ありません。


OSX 10.7.5
Titanium Studio 3.0.3.201302141237
Titanium SDK 3.0.0.GA
Android SDK tool 21.1 / Android SDK platform-tools 16.0.1

Android SDK 4.2 (API Level 17)のエミュレータを例にGoogle Map APIの導入手順を示します。

●下準備その1
Androidエミュレータ内のsystemディレクトリを修正するとき、”Out of Memory"エラーにならないように、Titanium Studioからエミュレータを起動する場合、Titanium SDKのbuilder.pyの一部を修正して、エミュレータの起動オプション-partition-sizeの値を増やしておく必要があります。

Titanium SDK 3.0.0GAの場合 /android/builder.pyのL.593あたりを以下のように書き変えておきます。


'-partition-size','512' #'128' # in between nexusone and droid


他のTitanium SDKを使用する場合には、'-partition-size'で検索して該当箇所を修正してください。この作業は、system.img作成/導入以降には必要ないものなので、作業後もとにもどしておくのも良いでしょう。

●下準備その2
system.imgファイルを作成するためのツールmkfs.yaffs2.x86を用意します。

Download:mkfs.yaffs2.x86
からダウンロードしておきます。


●最初に、Google APIs 4.2 [ARM] のエミュレータからcom.google.android.maps関連のファイルを抜き取ります。

step1 Google APIs 4.2 のエミュレータ [ARM] を起動します。
Titaium Studioから起動するには以下のようにな設定してRunすることになります。



step2 OSX側に適当な保存先フォルダを用意します。
terminalで、先ほどの保存先フォルダに移動して、adb pullコマンドで2つのファイルをOSX側にコピーします。
$ adb pull /system/etc/permissions/com.google.android.maps.xml
122 KB/s (816 bytes in 0.006s)
$ adb pull /system/framework/com.google.android.maps.jar
949 KB/s (157310 bytes in 0.161s)

step3 コピーが終了したら、Google APIs 4.2 のエミュレータを終了します。

●次にx86 エミュレータを起動して、Google Map APIを導入したsystem.imgを作成します。

step1 Android 4.2 [x86] のエミュレータを起動します。
Titaium Studioから起動するには以下のようにな設定してRunすることになります。




step2 systemディレクトリを書き込み可能にする
terminalで、adb shell コマンドを使用します。
$ adb shell mount -o remount,rw /system

step3 Google Map API関連のファイルを書き込む
抜き取っておいたファイルをadb pushします。
$ adb push com.google.android.maps.xml /system/etc/permissions
144 KB/s (816 bytes in 0.005s)
$ adb push com.google.android.maps.jar /system/framework
2554 KB/s (157310 bytes in 0.060s)

step4 イメージ作成ツールを/dataに書き込み実行可能にする
ダウンロードしておいたmkfs.yaffs2.x86を書き込んで、実行できるようにします。
$ adb push mkfs.yaffs2.x86 /data
351 KB/s (441952 bytes in 1.229s)
$ adb shell chmod 777 /data/mkfs.yaffs2.x86

step5 イメージファイルを作成
mkfs.yaffs2.x86を実行して、/systemのイメージファイルを作成します。
$ adb shell /data/mkfs.yaffs2.x86 /system /data/system.img
mkfs.yaffs2: Android YAFFS2 Tool,Build by PowerGUI
   at http://www.openhandsetalliance.org.cn
Building...
Build Ok.

step6 出来上がったイメージファイルをOSX側の保存先にコピー
$ adb pull /data/system.img
505 KB/s (285922560 bytes in 552.216s)

200M強あるので、かなり時間がかかります。

●Android SDKディレクトリにあるシステムイメージの保存場所に上記のsystem.imgをコピーします。
コピー先は、Android SDK 4.2 (API Level 17)のx86用なので、
<android-sdk>/system-images/android-17/x86/system.img
になります。


これで、次回のエミュレータ起動からGoogle Map API導入済みのsystem.imgが使用されます。

以上で、Kitchen Sinkも動くようになりました。


問題点

さくさく動きはするのですが、いくつか問題があります。

その1 adb コネクションが切れやすいんじゃないか?

Titanium Studioに限ったことじゃないけど、adbのコネクション切れの確率が高いようです。



その2 モジュールにx86用のネイティブコードがない場合がある(というか大抵対応してない)


Titanium SDK 2.1.0より前のSDKで生成されるモジュールプロジェクトは、x86用のコードを生成してくれません。これを生成できるようになるのはTitanium SDK 2.1.0以降です。
マーケットプレースにある多くのモジュールは2.1.0以前の環境用につくられているのため、それらを使用したTitanium アプリケーションは、x86用v8とのグルーコードがないので起動時にロードエラーを起こします。

このあたりは、モジュール開発者の対応待ちです。
(モジュールのバージョン番号のポリシーが破綻してしまっているけど ..... あまり深く考えないでおこう)

(捕捉)
Titanium SDK 2.1.0GAから、ARM用のネイティブコードに加えてx86用のものがlibsに追加されて、Titanium アプリはx86対応となっているようです(ということは、x86サポートしなくても良いなら、libsから削除すれば、ダイエットできるってことです)。
しかし、x86 エミュレータを起動する機能はこの時点では追加されておらず、3.0.0GAで初めてx86エミュレータの起動機能が追加されました。

(捕捉2)
当初、x86 Atom system image は、Intel により提供された2.3.3(API Level 10)と4.0.3(API Level 15)だけでした。4.0.3のほうが安定しているとされており、2.3.3は、「がんばって安定させます」とのことでした。
その後、API Level 16,17も提供されるようになりました。
また、Android Sourceからビルドして作成することもできるようになっています。

(参考)
Installing the Intel Atom Android x86 Emulator Image Add-on from the Android SDK Manager
Using the Android Emulator | Android Developers
How to use Google Maps API in Android emulator SDK version 17

0 件のコメント:

コメントを投稿