@astronaughts さんから依頼を受け、moduleを作成したところ、ひと通りうまく動作しました^^。
検証中にちょっとハマったところがあり、@DeployGate_ja さんにドキュメントの改善要望をお問い合わせしました。
その後、こんなお話をいただいたので、Octpressの練習も兼ねてmoduleの作成方法を公開します。
サンプルソースはGitHubに置いておきましたので、こちら をどうぞ。
Andorid SDK 、Titanium Studio 、DeployGate で必要なものはインストール済みの前提です。
開発環境はMacで、shellはzshを利用しています。
Titanium Mobileのandroid moduleの作成
~/.zshrc例
export ANT_OPTS=-Dfile.encoding=UTF8
export ANDROID_SDK=$HOME/android-sdk
export ANDROID_NDK=$HOME/android-ndk-r8b
export PATH=$ANDROID_SDK/tools:$PATH
alias titanium='$HOME/Library/Application\ Support/Titanium/mobilesdk/osx/2.1.2.GA/titanium.py'
moduleを作成する
適当なディレクトリに移動して、.zshrc
でalias指定したtitanium
コマンドでmoduleのテンプレートを生成します。
1
$ titanium create --platform=android --type=module --name=TiDeployGate --id=local.twingob.android.tideploygate --android=$ANDROID_SDK
Created android module project
と出れば成功です。
tideploygate
ディレクトリ以下にテンプレートが作成されました。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
LICENSE
assets
- README
bin
build
build.properties
build.xml
dist
documentation
- index.md
example
- app.js
hooks
- README
- add.py
- install.py
- remove.py
- uninstall.py
lib
libs
manifest
platform
- README
src
- local
- twingob
- android
- tideploygate
- ExampleProxy.java
- TideploygateModule.java
timodule.xml
build.xml
,build.properties
がローカルPATHを指しており、そのままではコード共有しにくいので修正します。Titanium Studio、Eclipseなどを利用する場合は.classpath
も同様に修正したほうが良いです。
build.xmlの修正
build.propertiesから環境変数を参照できるように<property environment="env"/>
を追加しました。
<project name="deploygate" default="dist">
<description>
Ant build script for Titanium Android module TiDeployGate
</description>
<property environment="env"/>
<property name="ti.module.root" location="${basedir}"/>
<property file="build.properties" />
<import file="${titanium.platform}/../module/android/build.xml"/>
</project>
build.propertiesの修正
titanium.sdk=${env.HOME}/Library/Application\ Support/Titanium/
titanium.os=osx
titanium.version=2.1.2.GA
android.ndk=${env.HOME}/android-ndk-r8b
android.sdk=${env.HOME}/android-sdk
timodule.xmlの修正
example/app.jsからの動作確認時、リモートLogCatが利用できるように<uses-permission android:name="android.permission.READ_LOGS" />
を記載しておきます。
AndroidManifest.xml
はこの記述から自動生成されます。
<?xml version="1.0" encoding="UTF-8"?>
<ti:module xmlns:ti="http://ti.appcelerator.org" xmlns:android="http://schemas.android.com/apk/res/android">
<!--
Similar to tiapp.xml, but contains module/platform specific
configuration in <iphone>, <android>, and <mobileweb> sections
-->
<iphone>
</iphone>
<android xmlns:android="http://schemas.android.com/apk/res/android">
<manifest>
<uses-permission android:name="android.permission.READ_LOGS" />
</manifest>
</android>
<mobileweb>
</mobileweb>
</ti:module>
libディレクトリにdeploygatesdk.jarをコピーする
後ほど説明するantビルド時に、lib
ディレクトリのjarが参照されます。
moduleのソースコード変更、DeployGateの呼び出し
コマンドから自動生成されるソースコードは下記2種類です。
src/local/twingob/android/tideploygate
1
2
- ExampleProxy.java
- TideploygateModule.java
不用なサンプルファイルを削除
今回はProxyは利用しないので、ExampleProxy.java
は削除します。
以降は、テンプレートをTitanium Studio、Eclipseにインポートしたほうがやりやすいかと思います。
TideploygateModule.javaの名前が気になるのでリファクタリング
TiDeployGateModule.javaに修正しました。
TiDeployGateModule#onAppCreate()にDeployGate#install()を追加
ここがTitanium MobileでDeployGateを利用する際のポイントになります。
TiDeployGateModule#onAppCreate()はApplication#onCreate()時に呼び出されます。
また、Titanium Mobileで生成されるAndroidManifest.xml
のandroid:debuggable
は常にfalse
となっています。
そのため、DeployGatei#install(Application app)
ではなく、DeployGate#install(Application app, DeployGateCallback callback, boolean forceApplyOnReleaseBuild)
を利用する必要があります。deploygatesdk-javadoc.jar
にその旨記載がありました。
例では、forceApplyOnReleaseBuild:true
となるように、DeployGate.install(app,null,true)
と指定しました。
// Exec Application#onCreate()
@Kroll.onAppCreate
public static void onAppCreate(TiApplication app) {
// put module init code that needs to run when the application is created
Log.d(LCAT, "DeployGate#install()");
DeployGate.install(app,null,true);
}
Android SDKをEclipseから開発ビルドした場合は、android:debuggable
はtrue
になるみたいです。最初DeployGateのWeb上のドキュメントだけ見て、JavaDocを読んでなかったので、なぜ動かないのかわからず、ちょっとはまりました^^;。ドキュメントは最初にひと通り読まないとダメですよね><。
クラスのコンストラクタ以外のmethodサンプルを削除して、必要なmethodを追加
こちらはmoduleやDeployGateのサンプルの通りです。
// Methods
@Kroll.method
public void log(String mode, String message) {
switch (LogMode.toLogMode(mode)) {
case ERROR:
DeployGate.logError(message);
break;
case WARN:
DeployGate.logWarn(message);
break;
case DEBUG:
DeployGate.logDebug(message);
break;
case INFO:
DeployGate.logInfo(message);
break;
case VERBOSE:
DeployGate.logVerbose(message);
break;
default:
Log.d(LCAT, "LogMode Error:" + mode);
return;
}
}
@Kroll.method
public boolean isInitialized() {
return DeployGate.isInitialized();
}
@Kroll.method
public boolean isManaged() {
return DeployGate.isManaged();
}
@Kroll.method
public boolean isDeployGateAvailable() {
return DeployGate.isDeployGateAvaliable();
}
@Kroll.method
public boolean isAuthorized() {
return DeployGate.isAuthorized();
}
@Kroll.method
public String getLoginUsername() {
return DeployGate.getLoginUsername();
}
@Kroll.method
public void refresh() {
DeployGate.refresh();
}
example/app.jsを記載して、moduleの動作確認を行う
ant run
で動作確認できるように、js側でmoduleを呼び出します。
// TODO: write your module tests here
var deploygate = require('local.twingob.android.tideploygate');
Ti.API.info("module is => " + deploygate);
var text = 'ログテスト';
deploygate.log('ERROR',text);
deploygate.log('WARN',text);
deploygate.log('DEBUG',text);
deploygate.log('INFO',text);
deploygate.log('VERBOSE',text);
deploygate.log('DEBUG','isInitialized:' + deploygate.isInitialized());
deploygate.log('DEBUG','isManaged:' + deploygate.isManaged());
deploygate.log('DEBUG','isDeployGateAvailable:' + deploygate.isDeployGateAvailable());
deploygate.log('DEBUG','isAuthorized:' + deploygate.isAuthorized());
deploygate.log('DEBUG','getLoginUsername:' + deploygate.getLoginUsername());
deploygate.refresh();
moduleは、テンプレートのディレクトリ直下でantコマンドを実行すると、emulatorで動作確認ができるので、実行してみます。
Android emulatorの起動
Terminalの別のTabでテストビルド
無事アプリは起動したのですが、emulatorのLogCatに下記のように出力され、動作しませんでした。DeployGateのクライアントアプリのインストールが必要ということですよね。
1
DeployGate V DeployGate is not available on this device.
そこで、ant run
してできたapkをdgate push
して、実機で動作確認して見ることにしました。ant run
のログの最後の方に下記のように出力されているので、それを使ってみます。
1
2
[exec] [DEBUG] /Users/[user]/android-sdk/platform-tools/adb -e install -r /var/folders/3j/cjcy2jcd6tlbkqyv1crfj1yh0000gn/T/m0sWWDXti/tideploygate/build/android/bin/app.apk
[exec] [INFO] Launching application ... tideploygate
1
2
3
4
5
6
7
8
$ dgate push /var/folders/3j/cjcy2jcd6tlbkqyv1crfj1yh0000gn/T/m0sWWDXti/tideploygate/build/android/bin/app.apk
Push app file successful!
Name : tideploygate
Owner : twingo_b
Package : local.twingob.android.tideploygate
Revision : 1
URL : https://deploygate.com/users/twingo_b/apps/local.twingob.android.tideploygate?key=3cc6266d2d8a606a25dfcb209331bf5de954734a
無事Pushできたので、アプリを実機で起動してみます。
動いた!
リモートLogCatも動いた!
うまく動いてますね^^。
Titanium Mobileプロジェクトでの利用
実際のプロジェクトで利用するために、moduleのzipファイルを生成
ant dist
コマンドで、zipファイルを生成します。
1
2
3
4
5
6
7
8
9
10
$ ant dist
...
zip.libs:
[zip] Updating zip: /Users/[user]/[path to dir]/tideploygate/dist/local.twingob.android.tideploygate-android-0.1.zip
zip.metadata:
post.dist:
BUILD SUCCESSFUL
dist
ディレクトリ以下にできたzipファイルlocal.twingob.android.tideploygate-android-0.1.zip
をTitanium Mobileプロジェクト直下にコピーします。
tiapp.xmlの修正
moduleの指定を追加します。リモートLogCatを利用する場合は、<uses-permission android:name="android.permission.READ_LOGS" />
も記載します。
<android xmlns:android="http://schemas.android.com/apk/res/android">
<manifest>
<uses-permission android:name="android.permission.READ_LOGS" />
</manifest>
</android>
<modules>
<module version="0.1">local.twingob.android.tideploygate</module>
</modules>
実際には、Distributeビルド(リリースビルド)の際、これらの記載は削除し、module自体もビルドに含めないように、別途ビルドスクリプトを作成しています。
さいごに
DeployGateとTitanium Mobileの組み合わせは、開発をさらに加速できそうですよね!今後は@astronaughts さんに使い倒してもらいますw