titanium_mobile

Titanium Moblie いいですね。

特に Alloy という MVCフレームワーク的なものが標準になってから、昨今のイケてるJavaScript開発者にとっては馴染み易いスタイルになったんじゃないでしょうか。まんまbackbone.js(とunderscore.jsが使われている)な部分多いですし。私はイケて無いんでアレですけど、ディレクトリ体系もRails的でちょっと好きです。

ちょっと前にTitaniumを触ってみただけの方は是非Alloyも試して欲しいです。

体裁もtssとかいうcssライクなファイルで定義するといった感じなので、ライトなアプリを開発してみたいWeb開発者はもうみんなTitaniumでいいんじゃないか?とさえ思います。

とはいえ実際にはObjective-CやJavaでアプリを書ける事に越したことは無いし、デバイスに依存する部分(例えばカメラ周りとか、モーションセンサー周りとか)はネイティブで書かざるを得ないケースもあります。また既存のアプリを Titanium に移殖するといった時に、過去資産を活かしたい事もあるでしょう。

そういう場合、Titanium Mobile の 「Module(モジュール)」という枠組みに従えば、iOSやAndroidのネイティブアプリをTitanium側から呼び出して使う事が出来ます。

個人的には、モジュールが作れるからこそTitaniumをガッツリ触る気になった決め手というか、それが無かったら多分使わなかったです。

iOS側やAndorid側で出来てTitanium側は対応待ちとかそもそも不可能とか、そういうケースが出た時にAppcelerator社に依存とか厳しすぎだし、最悪自分で何とか出来るという安心感がTitanium Mobile の大変良い所の一つだと私は思っています。

そんなこんなで、モジュールを作成して色々とハマったのでメモ残します。

MacですがWindowsもさほど変わりは無いと思います。多分。

 


ハマったポイント1 exec returned: 2

iOSモジュールについては個人ブログ等での日本語の情報が豊富なのですが、Androidは少ないです。

本来学習コストが低いTitaniumですがモジュール(それもAndroidは特に)の開発となると話は別で、ネイティブでの開発経験が無いと厳しいです。特にAndoridのソレはiOS版と比べて、さらに環境構築の敷居が高い気がします。

その辺が情報の少なさとまとまった説明が無いという事情につながっているのでしょう。

加えて公式ドキュメントも、Androidモジュール開発に関する情報が分散していたり、不足している部分があったりします。

AndroidのSDKやtool群のアップデートの頻度やフラグメンテーションへの配慮など、Appcelerator社としても手に余るという事情も、もしかしたらあるのかもしれません。

という訳で、Android NDK周りで結構回り道しました、という話です。

Android Module Development Guide – Documentation & Guides – Appcelerator Wikiに従い、Androidモジュールを作成してみます。

環境
Mac os x 10.8.5
Titanium Studio 3.1.13
ant 1.8.4
java 1.7.0_13
Android SDK Tools Rev 22
Android SDK Platform-tools/Build-tools Rev 18.1.0
Android NDK r9

まずはこんな感じで、空のAndoridモジュールを作成してみます。

titanium.py create --platform=android --type=module --name=android_test_module
 --id=com.tdtsh.android_test_module --android=/Users/tdtsh/android-sdk-macosx

↑この時点でいくつか間違いや不足があるのですが、

まずはantタスクを実行してビルドしてみます。

cd /path/to/android_test_module
ant 

するとこんなエラーになりました。

BUILD FAILED
/Users/MYNAME/Library/Application Support/Titanium/mobilesdk/osx/3.1.3.GA/
module/android/build.xml:296: The following error occurred while executing this line:
/Users/MYNAME/Library/Application Support/Titanium/mobilesdk/osx/3.1.3.GA/
module/android/build.xml:247: Neither the ANDROID_NDK environment variable,
 or the android.ndk property is not set to an existing Android NDK installation
 (check your module's build.properties).

これについてはすぐ分かりました。ググればたくさん出てきます。こことか。

大概の場合はココでNDKが要る事に気がつくことになりますが、私はたまたま最新のNDKが既にインストールされていたので、そのまま使いました。

後で環境変数を書く方式に替えたのですが、取り敢えずはモジュール直下のbuild.propertiesにこう書けばよいです。

android.ndk=/path/to/android-ndk-r9

気を取り直して ant を実行すると、こんどはこのエラーです。

BUILD FAILED
/Users/MYNAME/Library/Application Support/Titanium/mobilesdk/osx/3.1.3.GA/
module/android/build.xml:326: The following error occurred while executing this line:
/Users/MYNAME/Library/Application Support/Titanium/mobilesdk/osx/3.1.3.GA/
module/android/build.xml:281: exec returned: 2

あまりにもエラー内容があっさりし過ぎてて何が起こっているかさっぱり判らず。

ここで悶えることしばし。

Titanium SDKを3.1.0まで順にデクリメントしてみたり、公式にはJDK6でないといけないと書いているので、色々試行錯誤してみたり。(結論から言うとJDK7でも一応ビルドできました)

ググって色々と試しているうちにコレを見つけます。

Vanilla Android Module Build Fails

まじか!

最新のNDK (r9) が原因かもしれない・・・

長くなったので続きは次回に。

 


参考にさせて頂いたサイト

勝手/全/超訳 Titanium Mobile Module Developer Guide for Android

Android Module Development Guide – Documentation & Guides – Appcelerator Wiki

Titanium Compatibility Matrix – Titanium 3.X – Appcelerator Docs

Overview (Titanium Android Java API)

TitaniumのAndroid用モジュールを作る その1- しそメモ(Titanium/Android/Ruby)

Issue Navigator – Appcelerator JIRA

Community Questions & Answers – Appcelerator Developer Center