7 Debian GNU/Linux 上で Android SDK を使ってみた

上川純 一

PIC
____________________________________________________________________

7.1 はじめに

Android は Open Handset Alliance の提供する携帯プラットフォームです。 携帯電話ではめずらしくオープンソースの集大成 であるということで、 Debian 開発者としては試してみずにはいられません。 Debian だからどうということは あまりないはずですが、 とりあえず、 SDK 1.5r1 がリリースされたのを機にそろそろ試してみることにし ます。

7.2 利用機材

7.3 ダウンロード・インストール

Debian 上で開発するために、 各種必要なパッケージなどをインストールします。

7.3.1 必要な Debian パッケージのインストール

Java や 32bit エミュレーション環境のパッケージなどをまずインストールしておきます。

# apt-get install ia32-libs sun-java6-bin sun-java6-jdk

x86_64 の 64bit 環境で 32bit のアプリケーションを利用できるために、 ia32-libs をインストールします。

また、 java もインストールしておきます。

7.3.2 SDK ダウンロード

Android の SDK をダウンロードしてきます。 Debian 用は Linux を選択します。 i386 版しかないので、 注意。 amd64 でも i386 エミュレーション上で稼働するので利用できます。 http://developer.android.com/sdk/1.5_r1/index.html

$ unzip android-sdk-linux_x86-1.5_r1.zip
$ ls -l android-sdk-linux_x86-1.5_r1
合計 24
-rw-rw----  1 dancer dancer  193 2009-04-22 13:15 RELEASE_NOTES.html
drwxrwx---  3 dancer dancer 4096 2009-04-23 10:50 add-ons
drwxrwx--- 12 dancer dancer 4096 2009-05-01 16:13 docs
-rw-rw----  1 dancer dancer  176 2009-04-22 13:15 documentation.html
drwxrwx---  4 dancer dancer 4096 2009-04-23 10:50 platforms
drwxrwx---  3 dancer dancer 4096 2009-04-22 13:14 tools

tools ディレクトリにパスを通しておきます。 .bashrc 辺りに下記を記述しておきます。

export PATH="${PATH}":path/to/android/android-sdk-linux_x86-1.5_r1/tools/
7.3.3 eclipse ダウンロード

Debian パッケージになっているバージョンは古いため、 eclipse のサイトからダウンロードしてきます。 http://www.eclipse.org/でバージョン Ganymede の x86-64 アーキテクチャ向けのバイナリをダウンロードしてきま した。

展開すればそこで ./eclipse を実行すればエディタが起動します。

$ tar xfz eclipse-java-ganymede-SR1-linux-gtk-x86_64.tar.gz
$ ls eclipse
about.html     configuration  eclipse.ini   libcairo-swt.so  plugins
about_files    dropins       epl-v10.html  notice.html      readme
artifacts.xml  eclipse       features     p2
$ cd eclipse/
$ ./eclipse
7.3.4 Eclipse に Android 用プラグインの追加

Eclipse のプラグインをインストールします。 http://developer.android.com/sdk/1.5_r1/installing.htmlを参考に 設定します。 うまく動かない部分はメーリングリスト検索を駆使し、 正しい方法を探します。

プラグインは http://dl-ssl.google.com/android/eclipse/site.xml から Android DDMS と Android Development Tools をインストールすればよいようです。

あ と 、 設 定 す る 内 容 と し て は 、 Window の Properties の Android でさきほど展開した SDK のパスを指定し ます。

7.3.5 Android デバイス接続

udev の設定の修正が必要です。 /etc/udev/rules.d/z60_android.rulesに下記記述します。

SUBSYSTEM=="usb_device",
SYSFS{idVendor}=="0bb4",MODE="0666",
SYMLINK+="%k"

接続できていれば、 adb コマンドで接続を確認できます。

$ adb devices
List of devices attached
HT------ device

adb shell コマンドでシェルが起動します。

$ adb shell

7.4 emulator を試してみる

まず、 コマンドラインから emulator を起動するのを試してみました。 emulator の起動には AVD (Android Virtual Device) の作成がまず必要なようです。 とりあえず適当に作成してみました。

$ android list targets
[選択可能なターゲットの一覧]
$ android create avd -n uekawadroid -t 2
Android 1.5 is a basic Android platform.
Do you wish to create a custom hardware profile [no]
Created AVD ’uekawadroid’ based on Android 1.5
$ emulator -avd uekawadroid

エミュレータは Android の実機をあつかうのと同じような感覚で操作できます。 Android のブラウザを起動したりできま す。 エミュレータ内部から見ると、 10.0.2.2 がホスト OS のアドレスになります。 HTML+javascript で作成したキッチンタイ マーを動作させて見たところ、 動作しました。

PIC

7.5 Android の簡単なアプリケーションを作成して起動してみる

それでは、 Android 用の簡単なアプリケーションを書いてみましょう。 http://developer.android.com/guide/developing/eclipse-adt.html にしたがって淡々と作成します。 まず、 File の New Project で Android のをプロジェクト選択して作成しました。 ターゲットビルドは 1.1 にとりあえず しろと書いてありますが、 よくわからないので、 手元のファームウェアのバージョン 1.5 にあわせておきま した。

Run の Run(Ctrl-F11) で Android Application を選択するとエミュレータを起動してアプリケーションを実行するこ とができます。 最初に生成されたソースコードのままの状態だと Hello World アプリケーションが起動し ます。

7.6 Android の簡単なアプリケーションを書いてみる

アプリケーションの作成やエディタの起動の部分はなんとかなるようになったので、 次はチュートリアルを眺めてみます。 Hello World あたりがよさげです。 http://developer.android.com/guide/tutorials/hello-world.html

一通り読んで、 とりあえずサンプルを眺めてどうやれば文字列を表示できるのかを確認したので、 好きな文字列を表示する アプリケーションを作ってみます。

Android の top コマンドでプロセスの一覧を出力できるので、 コマンドを実行してその出力を表示するだけのアプリ ケーションを作成してみました。 中核をなす src/jp.gr.netfort.dancer/TopView.java は以下のようになりま した。

package jp.gr.netfort.dancer;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import java.io.*;

public class TopView extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String [] command = { "top", "-n", "1"};
String output = "";

Runtime runtime = Runtime.getRuntime();
Process process = null;
try {
process = runtime.exec(command);
} catch (Exception exception){
System.exit(1);
}
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
try {
while((line = reader.readLine()) != null) {
output = output + line + "\n";
}
} catch (Exception exception) {
System.exit(1);
} finally {
try {
reader.close();
} catch (Exception exception) {
System.exit(1);
}
}
TextView tv = new TextView(this);
tv.setText(output);
setContentView(tv);
}
}

PIC

7.7 Android の簡単なアプリケーションを実機で稼働させてみる

実際に使う便利なアプリケーションを作ってみましょう。 ライトニングトークを実施する際にどのプレゼンテーションが気に 入ったかを表明する、 投票用に利用するボタンでも作成しましょうか。

7.7.1 エフェクト用のデータ

まず、 なんらかの効果音が必要です。 以前作成した ding.wav をひろってきます。 res/raw 以下に nautilus からドラッグアンド ド ロ ップ で コ ピ ー し ま す 。

あと、 ボタン風味の画像が必要です。 適当に gimp で絵をかいて png ファイルを作成しました。

nautilus から res/drawable 以下に png ファイルをドラッグアンドドロップでコピーします。

ファイル名からそのままリソースの名前を作成するため、 -は利用できないようです、 _ は利用できるようです。 最初 he-up.png を作成しようとして、 エラーが出たので he_up.png に変更しました。

PIC

7.7.2 レイアウトの作成

おもむろに ImageButton を作成して、 src に画像リソースを追加しておきましょう。

7.7.3 クリックアクションの作成

R.id.ImageButton01 に対して onClickListener を作成し、 クリックされた瞬間の反応を作成しましょう。

画像をクリックされた状態に切り替えるには ImageButton の setImageResource() を呼び出せばよいよう です。

音を出すには、 MediaPlayer のインスタンスを作成し、 start() を呼び出せばよいようです。

一定時間経過してから元の画像に戻すには、 アラームを設定してコールバックしてもらえるようにして、 コールバックを呼び 出されたときに処理をするようにすればよいようです。

7.7.4 サーバ側のアクション

それでは、 クリックされたときにどういうことを行うのかのアクションを作成してみましょう。 HTTP サーバを準備します。 こういうイロモノ系のサーバを作成するときには upaccho2 サーバを使うことが上川家の常識なので、 それを踏襲します。 (予定)

7.8 おまけ:開発環境に必要なメモリ消費は節減できるのか?

手元の MacBook には 1GB しかメモリを搭載していないです。 eclipse はデフォルトの設定だと起動した瞬間に 1GB 近くの仮 想メモリを消費し、 即 Swap を使用してしまうという問題がありました。

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
17124 dancer    20   0  972m 302m  20m S    1 31.2   0:39.85 java

とりあえず、 ヒントを求めて maps あたりを眺めてみます。 それなりにたくさん mmap していますが、 それだけでは説明で きないようなメモリ領域を確保しています。

$ cat /proc/17124/status | grep Vm
VmPeak:  1056748 kB
VmSize:  1003316 kB
VmLck:        0 kB
VmHWM:   310740 kB
VmRSS:   221616 kB
VmData:   788504 kB
VmStk:       84 kB
VmExe:       36 kB
VmLib:    38812 kB
VmPTE:     1108 kB
$ cat /proc/17124/maps | grep rw | sort -rn -k5
 .

とりあえず Java のアプリケーションの Heap の使い方がよくわからないので、 jconsole で接続して問題を解析し ま す 。

メモリプールがいくつかあることがわかります。

eclipse.ini が現状こうなっているのですが、 これをおそるおそるチューニングしてみます。

-showsplash
org.eclipse.platform
-framework
plugins/org.eclipse.osgi_3.4.2.R34x_v20080826-1230.jar
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx256m
-XX:MaxPermSize=256m

起動時に確保したヒープメモリの領域を開放していない部分については、 GC を頻繁に行えば起動は若干遅くなりますがうま くいけるような気がします。 Xmx 128m に変更してみると、 若干メモリの消費が下がりました。 しかしそこまで劇的ではあり ませんね。 MaxPermSize を 64MB にするとエラー

 Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: PermGen space

が発生しました。 96MB だとエラーでおちないようです。

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+   コメント
17124 dancer    20   0  972m 302m  20m S    1 31.2   0:39.85 java
19663 dancer    20   0  795m 296m  23m S    1 30.6   0:36.69 Heap 128MB 版
20266 dancer    20   0  661m 292m  22m S    1 30.1   0:41.62 MaxPermSize 96MB

がんばってみた割にはメモリが 10MB 程度しか節約できませんでした。 エミュレータも起動していると 500MB くらい swap にいってしまうので、 つらいです。 しかも、 ギリギリのメモリ設定にしていたところ、 いろいろと操作しているとメモリが足りないというエラーで落ちました。 こりゃダメだ。 メモリ買いにいく かな。

-showsplash
org.eclipse.platform
-framework
plugins/org.eclipse.osgi_3.4.2.R34x_v20080826-1230.jar
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx128m
-XX:MaxPermSize=96m

7.9 参考文献

本記事の作成に参考にした文献です。

第 52 回東京エリア Debian 勉強会 2009 年 5 月
____________________________________________________________________________________________