Android SDKで遊んでみた

Mac OS X 10.5な環境で試してみます。

とりあえずダウンロード&起動

Googleからダウンロードするといきなり動かせます。この簡単さは偉いなあ。

1. http://code.google.com/android/index.html から右のDownload the SDKリンクをたどってダウンロード。
2. 解凍(というか勝手に解凍される)
3. ターミナルからエミュレータを起動してみる

% cd ~/Downloads/android-sdk_m5-rc15_mac-x86/
% cd tools
% ./emulator -debug-kernel -console

いきなり怪しげなオプションをつけていますが、普通に動かすだけなら不要。カーネルのログとか見たい&コンソールからコマンドを叩きたい人用です。下のような起動ログが出ます。

Linux version 2.6.23-g0774dffb (arve@arvelnx.corp.google.com) (gcc version 4.2.1) #76 Tue Jan 22 19:53:32 PST 2008
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00003137
Memory: 96MB = 96MB total
...
io scheduler anticipatory registered (default)
...

I/OスケジューラASかい。
あと、ドライバ類は全部カーネルに組み込みの模様。

# lsmod
/proc/modules: No such file or directory

あ、カーネルモジュールはサポートしてないのね。

SDカードを読み込ませてみる。

% ./mksdcard 128M test.img
% open test.img  # Mac上にマウントされるので適当なファイルをコピー
% ./emulator -debug-kernel -console -sdcard test.img

起動後、

# mount
rootfs / rootfs rw 0 0
/dev/pts /dev/pts devpts rw 0 0
/proc /proc proc rw 0 0
/sys /sys sysfs rw 0 0
/tmp /tmp tmpfs rw 0 0
/dev/block/mtdblock0 /system yaffs2 rw,nodev,noatime,nodiratime 0 0
/dev/block/mtdblock1 /data yaffs2 rw,nodev,noatime,nodiratime 0 0
/dev/block/mtdblock2 /cache yaffs2 rw,nodev,noatime,nodiratime 0 0
/dev/block/mmcblk0 /sdcard vfat rw,sync,dirsync,fmask=0000,dmask=0000,codepage=cp437,iocharset=iso8859-1,utf8 0 0

最後の行で、/sdcard にマウントされていることが分かる。ってかyaffs2って初めて見た。NANDフラッシュ向けファイルシステムらしい。

いきなりネイティブバイナリを動かしてみる

CPUはARM。そういえば以前LS-GLでARM用のクロスコンパイル環境を作っているので、あれを使ってネイティブのバイナリを試してみますか。
参考:http://www.adamrocker.com/blog/191/c_native_executable_file_on_android.html
以下Mac環境にて。

% cat test.c
main(){puts("Hello,World!");exit(0);}
% arm-none-linux-gnueabi-gcc test.c -o hello1
% arm-none-linux-gnueabi-gcc -static test.c -o hello2
% arm-none-linux-gnueabi-gcc -c test.c
% arm-none-linux-gnueabi-ld -entry=main -dynamic-linker /system/bin/linker -rpath /system/lib -lc -o hello3 test.o

test.cは普通(?)のHello,Worldですが、都合によりexit(0)をつけておきます。
hello1は、駄目元(っていうかLS-GLとは全然libc等のライブラリ構成が違うのでまず動かない)。
hello2は、staticリンクですが、これもカーネルも全然違うしlibcがまともに動かず駄目な予感。
hello3は参考サイトの方法をまねっこ。(start.cを書くのが面倒なのでmain中でexit(0)してエントリポイントを直接mainにしてます。)

それぞれ先ほどのSDカードイメージにコピーしてエミュレータを起動し、実行してみます。以下エミュレータのコンソールにて...

# cd /sdcard
# ./hello1
./hello1: not found
# ./hello2
[1]   Segmentation fault      ./hello2
# ./hello3
ERROR:   615 could not load 'libc.so.6'
ERROR: failed to link ./hello3
ERROR: CANNOT LINK EXECUTABLE './hello3'

hello1,2は予想通りダメ。hello3も lib.so.6 になってしまいましたね。

% arm-none-linux-gnueabi-readelf -d hello3 | nkf -w
Dynamic section at offset 0x1f8 contains 16 entries:
 タグ        タイプ                       名前/値
 0x00000001 (NEEDED)                     共有ライブラリ: [libc.so.6]
 0x0000000f (RPATH)                      ライブラリの rpath: [/system/lib]
...

ううむ。ライブラリ構成をエミュレータ環境から引き抜いてきて、それを使ってコンパイルすれば良いはずですが、とりあえず強引に動作テストということで、

# cd /system/lib
# ln -s libc.so libc.so.6
# /sdcard/hello3
Hello,World!

シンボリックリンクで騙したら、動いた。(笑) 


でもエミュレータを再起動すると/systemは元に戻ってしまうようなので、ちゃんとしたコンパイル環境を作らねば。


なんて言うか、我ながら全く以て間違ったSDKの試し方ですね。。。