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の試し方ですね。。。