今週はUbuntuとAndroidについてのレシピのしめくくりとして、Androidのエミュレータ環境と非IDE環境でのAndroid開発手法を紹介します。
Androidのスクリーンショットを撮る
先週、先々週のレシピでもIDEOS実機のスクリーンショットを撮っていますが、これらのスクリーンショットはAndroid SDKを導入したUbuntuから撮影しています。ここでいきなり脱線して、スクリーンショットの撮影方法を紹介しましょう。
まず先週紹介したSDKの導入、実機のデバッグモードとパーミッションの設定までを行なっておきます。準備ができたら実機をUbuntuにUSB接続してDalvik Debug Monitorを起動しましょう。
Dalvik Debug Monitorの起動
$ cd android-sdk-linux_86/tools
$ ./ddms
図1 起動したDalvik Debug Monitor。IDEOSが認識されているのがわかる
Dalvik Debug Monitor上でスクリーンキャプチャしたい対象デバイスを選択したら、メニューの「Device」 ->「Screen capture」を選択してください。キャプチャウィンドウが開き、現在デバイスに表示されている画面がウィンドウ内に表示されます。「 Save」で画像をUbuntu上にファイルとして保存し、「 Copy」で画像をクリップボードへ転送します。「 Rotate」では画像を反時計回りに90度ずつ回転し、「 Refresh」で画像を更新します。
図2 スクリーンキャプチャ画面。実機で画面遷移が発生した場合の自動更新は行われないため、手動でRefreshをクリックする必要がある
エミュレータ上での実行
さて、先週紹介したように、作成したアプリケーションは簡単に実機上で動作させることが可能です。しかし普段使っている携帯電話に、開発中のアプリケーションをインストールすることに抵抗がある人もいるでしょう。また、実機を持ってないけどAndroidに触ってみたいという人もいるかもしれません。そのような時はAndroid SDKに含まれるエミュレータを使うのがお勧めです。
Eclipseの「ウィンドウ」 ->「Android SDK and AVD Manager」を開き[1] 、「 Virtual devices」 ->「新規」をクリックします。新規バーチャルデバイスの作成ダイアログが表示されたら任意の名前を入力し[2] 、ターゲットに「Android 2.2」を選択してください[3] 。デバイスが作成できたら、「 開始」 ->「起動」をクリックすれば、Androidエミュレータが起動します。なお、起動には少し時間がかかります。
図3 バーチャルデバイスとしてAndroid 2.2のデバイスを作成する
複数のAndroidデバイスが接続されていると、Eclipseからアプリケーションを実行した際に、ターゲットを選択するダイアログが表示されます。ここでバーチャルデバイスである「Virtual-IDEOS」を選択しましょう。エミュレータ上にアプリケーションがアップロードされ、実機同様に実行されます。
図4 IDEOS実機とバーチャルデバイスの計2デバイスが接続されているのがわかる
図5 エミュレータ上で実行したHelloWorld
非IDE環境でのAndroidプログラミング
このようにEclipseを使うことで、簡単にAndroidプログラミングを始めることができます。しかしこれではみんなの大好きなEmacsの出番がありません。ですがご安心ください。Android SDKにはコマンドライン用のツールが用意されていますので、統合開発環境を用いないでもAndroid開発は可能です。ADV Managerの起動に用いたandroidコマンドがそれです。
android create projectコマンドを実行することで、プロジェクトのひな型を作ることができます。Eclipseのダイアログで行ったのと同様に、ターゲットとなるバージョンやプロジェクトを作成するパス、パッケージ名などをオプションとして与える必要があります。
ここで注意しなければならないのは、ターゲットのバージョンは、今現在インストールされているターゲットの中からIDで指定する必要があるということです。そのためにはまずandroid list targetsコマンドを実行して、ターゲットのIDを調べておく必要があります。また、Eclipseをインストールした場合はJava開発に必要なパッケージが依存関係によって自動的にインストールされていますが、手動で開発に必要なパッケージをインストールする場合はantとdefault-jdkパッケージをインストールしてください。
Java開発に必要なパッケージをインストールする
$ sudo apt-get install ant default-jdk
インストールされているターゲットを確認する
$ ./android list targets
Available Android targets:
id: 1 or "android-8"
Name: Android 2.2
Type: Platform
API level: 8
Revision: 2
Skins: WVGA854, QVGA, HVGA (default), WVGA800, WQVGA400, WQVGA432
新規Androidプロジェクトを作成する
$ ./android create project \
--target 1 \
--name HelloIDEOS \
--path ~/ideos \
--activity HelloIDEOS \
--package com.example.helloideos
コーディングが完了したら、build.xmlのあるディレクトリ(プロジェクト作成時に指定したパスになります)でant debugコマンドを実行します。これでアプリケーションがデバッグビルドされ、binディレクトリ以下にHelloIDEOS-debug.apkというパッケージが作成されます。このファイルはNautilusなどを用いてIDEOSにコピーして、インストールを行うことが可能です。
パッケージのビルド
$ ant debug
Buildfile: /home/mizuno/ideos/build.xml
[setup] Android SDK Tools Revision 8
[setup] Project Target: Android 2.2
(...略...)
リリースビルドと署名
デバッグビルドがあるならば、当然リリースビルドも存在します。次のようにビルドを行なうことで、リリースビルドを作成することができます。
$ ant release
しかし、これによって作成されるHelloIDEOS-unsigned.apkというファイルは、そのままでは実機にインストールできません。このファイルは名前から推測できるように、署名がなされていないアプリケーションです。しかしAndroidは、署名がなされていないアプリケーションのインストールを許可しません[4] 。
プログラマはリリースするアプリケーションへ署名を行わなければなりませんが、それにはまず署名用のキーを作成する必要があります。以下のようにkeytoolコマンドを使って新しいキーストアを作成します。ここでキーストア名として指定した名前でカレントディレクトリにキーストアファイルが作成されます。
キーストアの作成。ここではキーストアファイル名をkeystore、鍵の別名をhogeとした
$ keytool -genkey -keystore keystore -alias hoge
キーストアのパスワードを入力してください:
新規パスワードを再入力してください:
姓名を入力してください。
[Unknown]:
組織単位名を入力してください。
[Unknown]:
組織名を入力してください。
[Unknown]:
都市名または地域名を入力してください。
[Unknown]:
州名または地方名を入力してください。
[Unknown]:
この単位に該当する 2 文字の国番号を入力してください。
[Unknown]:
CN=Unknown, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown でよろしいですか?
[no]: yes
<hoge> の鍵パスワードを入力してください。
(キーストアのパスワードと同じ場合は RETURN を押してください):
キーストアが作成されたら、以下のようにjarsignerコマンドでアプリケーションに署名を行いましょう。これでAndroidへアプリケーションのインストールが可能になります。
パッケージへの署名
$ jarsigner -keystore keystore bin/HelloIDEOS-unsigned.apk hoge
キーストアのパスワードを入力してください:
警告:
署名者の証明書は 6 か月以内に期限切れになります。
リリースビルド時に自動的に署名を行う
毎回パッケージをビルドする際に署名を行うのは面倒ですね。署名のための情報をあらかじめ設定しておくことで、この作業を自動化することができます。
build.xmlと同じディレクトリにbuild.propertiesというファイルが存在します。このファイルに設定を記述しておけば、antでのビルド時に任意の値で設定値を上書きすることができます。署名を自動化するためには、このファイルにキーストア名、エイリアス名、パスワードを記述します。
build.propertiesにキーストア情報を記述してリリースビルドする
$ vi build.properties
key.store=/home/mizuno/ideos/keystore (作成したキーストアファイルのパス)
key.alias=hoge (作成時に指定したalias名)
key.store.password=(キーストアのパスワード)
key.alias.password=(aliasのパスワード)
$ ant release
Buildfile: /home/mizuno/ideos/build.xml
[setup] Android SDK Tools Revision 8
[setup] Project Target: Android 2.2
[setup] API level: 8
(...略...)
release:
[echo] Signing final apk...
[signjar] Signing JAR: /home/mizuno/ideos/bin/HelloIDEOS-unsigned.apk to /home/mizuno/ideos/bin/HelloIDEOS-unaligned.apk as hoge
[signjar]
[signjar] 警告:
[signjar] 署名者の証明書は 6 か月以内に期限切れになります。
[signjar] キーストアのパスワードを入力してください:
[echo] Running zip align on final apk...
[echo] Release Package: /home/mizuno/ideos/bin/HelloIDEOS-release.apk
BUILD SUCCESSFUL
Total time: 4 seconds
このように正常にリリースビルドと署名が完了すると、HelloIDEOS-release.apkのように*-release.apkというファイルが作成されます。
コマンドラインからアプリケーションをインストールする
Eclipseを使用している場合はEclipse上からアプリケーションを実行するだけで、実機やエミュレータへパッケージがインストールされ、アプリケーションを実行できました。しかしコマンドラインでantを用いてパッケージをビルドした場合は、完成したapkファイルを手動で転送しなければなりません。Nautilusなどを用いて実機にファイルをコピーし、実機上でインストール作業を行ってもよいのですが、それよりも手軽なのがadbコマンドを用いたインストールです。adbコマンドはAndroid SDKを展開したディレクトリのplatform-toolsディレクトリに存在し、installサブコマンドと引数にパッケージファイルを指定することでアプリケーションのインストールが可能です。
adbコマンドでアプリケーションをインストールする
$ ./adb install /home/mizuno/ideos/bin/HelloIDEOS-release.apk
209 KB/s (13549 bytes in 0.063s)
pkg: /data/local/tmp/HelloIDEOS-release.apk
Success
図6 HelloIDEOSアプリをエミュレータにインストールできた