上川純
一
![]() |
Android は Open Handset Alliance の提供する携帯プラットフォームです。 携帯電話ではめずらしくオープンソースの集大成 であるということで、 Debian 開発者としては試してみずにはいられません。 Debian だからどうということは あまりないはずですが、 とりあえず、 SDK 1.5r1 がリリースされたのを機にそろそろ試してみることにし ます。
Debian 上で開発するために、 各種必要なパッケージなどをインストールします。
Java や 32bit エミュレーション環境のパッケージなどをまずインストールしておきます。
# apt-get install ia32-libs sun-java6-bin sun-java6-jdk
|
x86_64 の 64bit 環境で 32bit のアプリケーションを利用できるために、 ia32-libs をインストールします。
また、 java もインストールしておきます。
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/
|
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 |
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 のパスを指定し ます。
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
|
まず、 コマンドラインから 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 で作成したキッチンタイ マーを動作させて見たところ、 動作しました。
それでは、 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 アプリケーションが起動し ます。
アプリケーションの作成やエディタの起動の部分はなんとかなるようになったので、 次はチュートリアルを眺めてみます。 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); } } |
実際に使う便利なアプリケーションを作ってみましょう。 ライトニングトークを実施する際にどのプレゼンテーションが気に 入ったかを表明する、 投票用に利用するボタンでも作成しましょうか。
まず、 なんらかの効果音が必要です。 以前作成した ding.wav をひろってきます。 res/raw 以下に nautilus からドラッグアンド ド ロ ップ で コ ピ ー し ま す 。
あと、 ボタン風味の画像が必要です。 適当に gimp で絵をかいて png ファイルを作成しました。
nautilus から res/drawable 以下に png ファイルをドラッグアンドドロップでコピーします。
ファイル名からそのままリソースの名前を作成するため、 -は利用できないようです、 _ は利用できるようです。 最初 he-up.png を作成しようとして、 エラーが出たので he_up.png に変更しました。
おもむろに ImageButton を作成して、 src に画像リソースを追加しておきましょう。
R.id.ImageButton01 に対して onClickListener を作成し、 クリックされた瞬間の反応を作成しましょう。
画像をクリックされた状態に切り替えるには ImageButton の setImageResource() を呼び出せばよいよう です。
音を出すには、 MediaPlayer のインスタンスを作成し、 start() を呼び出せばよいようです。
一定時間経過してから元の画像に戻すには、 アラームを設定してコールバックしてもらえるようにして、 コールバックを呼び 出されたときに処理をするようにすればよいようです。
それでは、 クリックされたときにどういうことを行うのかのアクションを作成してみましょう。 HTTP サーバを準備します。 こういうイロモノ系のサーバを作成するときには upaccho2 サーバを使うことが上川家の常識なので、 それを踏襲します。 (予定)
手元の 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 |
本記事の作成に参考にした文献です。
第
52 回東京エリア Debian 勉強会 2009 年 5 月
____________________________________________________________________________________________