読者です 読者をやめる 読者になる 読者になる

Android であそぶ

やんごとなき事情 により夢電話をゲットしたのでぼんやり遊んでいます。方針としては

  • Java を使わない
  • testsprite を動かす方がネットワークがつながるより価値が高い

以下 Android 上で native binary とたわむれるメモ。ちなみに既に WiFi とかそのへんの機能全部使えなくなってるのでマネしないでください。

Terminal Emulator

適当に Market からゲット。

ロスコンパイラ

とりあえず深く考えず下記からダウンロードしてつっこんだ。 arm-none-linux-gnueabi のヤツね。

http://www.codesourcery.com/gnu_toolchains/arm/download.html

後述するけど本家のクロスコンパイラ使った方が間違いなく良い。

busybox

http://android-dev.g.hatena.ne.jp/takuma104/20081219/1229707664

を参考に。

% make CROSS_COMPILE=arm-none-linux-gnueabi- ARCH=arm CFLAGS=--static LDFLAGS=--static CONFIG_PREFIX=/sdcard/system install

readline

% CC=arm-none-linux-gnueabi-gcc CFLAGS=-static LDFLAGS=-static ./configure --prefix=/sdcard/system --host=arm-none-linux-gnueabi --build=amd64-gnu-linux
% make
% make install

bash

% CC=arm-none-linux-gnueabi-gcc CFLAGS=-static LDFLAGS=-static configure --prefix=/sdcard/system --host=arm-none-linux-gnueabi --build=amd64-gnu-linux --without-bash-malloc
% make
% make install

lib/sh/shmatch.c に適当に

#undef free

とか足した。

zlib

% CC=arm-none-linux-gnueabi-gcc CFLAGS='-O -static' LDFLAGS=-static configure --prefix=/sdcard/system
% make
% make install

openssl

% make CC=arm-none-linux-gnueabi-gcc LDFLAGS=-static
% make install_sw INSTALLTOP=/sdcard/system OPENSSLDIR=/sdcard/system RANLIB=arm-none-linux-gnueabi-ranlib AR=arm-none-linux-gnueabi-ar

openssh (うまく動かず)

% CC=arm-none-linux-gnueabi-gcc CFLAGS='-O -static -I/sdcard/system/include' LDFLAGS='-static -L/sdcard/system/lib' configure --prefix=/sdcard/system --host=arm-none-linux-gnueabi --build=amd64-gnu-linux
% make install STRIP_OPT=

sshd は getpwnam がまともに動かんので動かすのは大変そうだった。まぁ bashbusybox で満足することに。いずれにせよこのへんは Android.mk 書いて

SDL with fbcon

http://www.anddev.org/port_opengl-sdl-tinysdgl_to_android_with_native_c-t3265.html

の通りやったところ、 frame buffer は surfaceflinger がガンガン書き込んでるので、全然きちんと表示されず。あと音もたぶんこれでは動かないと思う。

たぶん surfaceflinger を通して描画してもらうべきだろうな…ということで Androidソースコード落としてくることに。

フルビルド

http://source.android.com/download

を見てダウンロード、コンパイル

色々頑張ってみたものの、インストールされてるシステムとこのソースコードで AIDL がなんか違う気がする。

そこで元のシステムをふっとばすことに。再起動時にカメラボタン押しっぱで起動して、後ろに戻るボタンを押して fastboot と表示させて、 PC から、

./out/host/linux-x86/bin/fastboot -p generic flash system
./out/host/linux-x86/bin/fastboot -p generic flash userdata
./out/host/linux-x86/bin/fastboot reboot

で全データぶっとばしつつ再起動。

WiFi, bluetooth, カメラ, GPS, Compass, GMail, Maps などのアプリあたりが使えなくなった。気にしない方向で。

udev

http://code.google.com/intl/und/android/intro/develop-and-debug.html#developingondevicehardware

に説明があるけど、 Debian lenny (たぶん) では、

SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", MODE="0666"

を z99-android.rules とかで書くとうまくいった。たぶん 50-udev.rules より前に来ちゃうとダメなんじゃないかな。

SDL with surfaceflinger

適当にごにょったら testsprite 動いた。もう少し適当にごにょったら key event がほどほどに。

イベント奪えてないから普通に後ろで動いててアホっぽい。

続きをごにょごにょしたら公開できるといいね…

LD_LIBRARY_PATH は linker のコメントによると未実装ぽいので、

/system/bin/mount -o remount /dev/block/mtdblock3 /system

とかして書き込み可能にしてからインストール。

NesterDC

なんかこの解像度だと無改造で動くのがエミュレータくらいだなぁ…と、適当にごにょったら動いた。ちょっと遅い感じ…

音は適当に

http://www.netmite.com/android/mydroid/system/extras/sound/playwav.c

を参考に /dev/msm_pcm_out を叩いたらえらい遅かった。ちゃんと IPC でやった方がいいのかな。

つか /dev/msm_mp3 ってデバイスはすごいね…

sdlquake

http://git.openmoko.org/git/openmoko.git/packages/quake/sdlquake/sdlquake-no-x86-asm.diff

の patch はこう、これだけでなんでいいの…って感じではあるがコンパイルは通った。しかし起動中に止まるのであった…

その他もろもろ

ro で mount されてる / やら /system, ヘンなオプションが色々ついてる /sdcard は

/system/bin/mount -o remount foo bar

とかで remount すると書き込めるようになって吉。

まぁ個人的には SDL 動いた時点で飽きた…

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h