busyboxの導入

androidのrootfsには、コマンドはほどんど含まれていない。
/system/bin/toolboxというコマンドのシンボリックリンクで小物のプログラムが統合されている。
入っているコマンドも、出力フォーマットが違い見慣れない。
何かちょっとしたことをやる場合にも不便でしょうがない。
たとえば、findがない。freeもない。tarもgzipもない。つまりソースの公開されていないバイナリの吸い出しができない(^^;。
toolboxと似たような、しかも組み込みではよく使われるbusyboxを導入する。
ライブラリ類もぜんぜん入っていないので、動作するようにスタティックにする。


busyboxを取得する。
http://busybox.net/
busybox-1.11.2.tar.gzが0903時点のstableになっている。

$ wget http://busybox.net/downloads/busybox-1.11.2.tar.gz
$ tar zxvf busybox-1.11.2.tar.gz

busyboxでは、make menuconfigで、組み込むプログラムやオプションを細かく決めることができるので、使いそうもないプログラムを削ってフットプリントをさらに小さくすることができる。
デフォルト設定でビルドしてみる。

$ cd busybox-1.11.2/
$ PATH=/home/kinneko/crosstool/gcc-4.1.1-glibc-2.5/arm-softfloat-linux-gnueabi/bin/:$PATH
$ make oldconfig
$ make CROSS_COMPILE=arm-softfloat-linux-gnueabi- ARCH=arm CFLAGS=--static LDFLAGS=--static

すんなりビルドできる。思えば、昨日はこの途中でHDDが死んだんだな...
ARMバイナリになっているのを確認。

# file ./busybox
busybox: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, stripped


busyboxのカスタムは後回しにして、実機で動作可能かどうかを確認する。
Mac側で出来たファイルをコピーするのには、scpを使うことにした。
androidのemulatorを起動して、adbコマンドでbusyboxをインストールする。
adbは、Android Debug Bridgeの略だそう。

$ cd android-sdk-mac_x86-0.9_beta/tools
$ ./adb push busybox /usr/bin/busybox
* daemon not running. starting it now *
* daemon started successfully *
failed to copy 'busybox' to '/usr/bin/busybox': No such file or directory
$ ./adb push busybox /busybox
failed to copy 'busybox' to '/busybox': Read-only file system
$ ./adb push busybox /data/busybox
2058 KB/s (2245252 bytes in 1.065s)

/dataの下にしか書けないのか。


shellに入って確認する。

$ ./adb shell
# cd data
# ls -l busybox
-rwxrwxrwx root     root      2245252 2008-09-04 14:28 busybox
# ./busybox
BusyBox v1.11.2 (2008-09-04 12:45:20 JST) multi-call binary
Copyright (C) 1998-2008 Erik Andersen, Rob Landley, Denys Vlasenko
and others. Licensed under GPLv2.
See source distribution for full notice.

Usage: busybox [function] [arguments]...
   or: function [arguments]...

	BusyBox is a multi-call binary that combines many common Unix
	utilities into a single executable.  Most people will create a
	link to busybox for each function they wish to use and BusyBox
	will act like whatever it was invoked as!

Currently defined functions:
	[, [[, addgroup, adduser, adjtimex, ar, arp, arping, ash,
	awk, basename, brctl, bunzip2, bzcat, bzip2, cal, cat, catv,
	chat, chattr, chgrp, chmod, chown, chpasswd, chpst, chroot,
	chrt, chvt, cksum, clear, cmp, comm, cp, cpio, crond, crontab,
	cryptpw, cut, date, dc, dd, deallocvt, delgroup, deluser,
	depmod, df, dhcprelay, diff, dirname, dmesg, dnsd, dos2unix,
	du, dumpkmap, dumpleases, echo, ed, egrep, eject, env, envdir,
	envuidgid, ether-wake, expand, expr, fakeidentd, false,
	fbset, fbsplash, fdflush, fdformat, fdisk, fetchmail, fgrep,
	find, fold, free, freeramdisk, fsck, fsck.minix, ftpget,
	ftpput, fuser, getopt, getty, grep, gunzip, gzip, halt,
	hdparm, head, hexdump, hostid, hostname, httpd, hwclock,
	id, ifconfig, ifdown, ifenslave, ifup, inetd, init, inotifyd,
	insmod, install, ip, ipaddr, ipcalc, ipcrm, ipcs, iplink,
	iproute, iprule, iptunnel, kbd_mode, kill, killall, killall5,
	klogd, last, length, less, linux32, linux64, linuxrc, ln,
	loadfont, loadkmap, logger, login, logname, logread, losetup,
	lpd, lpq, lpr, ls, lsattr, lsmod, lzmacat, makedevs, man,
	md5sum, mdev, mesg, microcom, mkdir, mkfifo, mkfs.minix,
	mknod, mkswap, mktemp, modprobe, more, mount, mountpoint,
	mt, mv, nameif, nc, netstat, nice, nmeter, nohup, nslookup,
	od, openvt, passwd, patch, pgrep, pidof, ping, ping6, pipe_progress,
	pivot_root, pkill, poweroff, printenv, printf, ps, pscan,
	pwd, raidautorun, rdate, readahead, readlink, readprofile,
	realpath, reboot, renice, reset, resize, rm, rmdir, rmmod,
	route, rpm, rpm2cpio, rtcwake, run-parts, runlevel, runsv,
	runsvdir, rx, script, sed, sendmail, seq, setarch, setconsole,
	setkeycodes, setlogcons, setsid, setuidgid, sh, sha1sum,
	slattach, sleep, softlimit, sort, split, start-stop-daemon,
	stat, strings, stty, su, sulogin, sum, sv, svlogd, swapoff,
	swapon, switch_root, sync, sysctl, syslogd, tac, tail, tar,
	taskset, tcpsvd, tee, telnet, telnetd, test, tftp, tftpd,
	time, top, touch, tr, traceroute, true, tty, ttysize, udhcpc,
	udhcpd, udpsvd, umount, uname, uncompress, unexpand, uniq,
	unix2dos, unlzma, unzip, uptime, usleep, uudecode, uuencode,
	vconfig, vi, vlock, watch, watchdog, wc, wget, which, who,
	whoami, xargs, yes, zcat, zcip

動作している。
引数を付けずに実行すると、利用可能なコマンドの一覧が表示される。
引数にこれらのコマンドを指定してやると、そのコマンドの実行結果が得られる。


findが入ったので、ファイルの一覧がとれるようになった。

# find /
find: not found

# /data/busybox find / 
/
/sqlite_stmt_journals
/cache
/cache/lost+found
/sdcard
/d
/etc
/system
(略)


freeコマンドも使える。

# free
free: not found

# /data/busybox free
              total         used         free       shared      buffers
  Mem:        94572        84800         9772            0            0
 Swap:            0            0            0
Total:        94572        84800         9772


dfも見慣れたフォーマットになる。

# df
/dev: 47284K total, 0K used, 47284K available (block size 4096)
/sqlite_stmt_journals: 47284K total, 0K used, 47284K available (block size 4096)
/system: 65536K total, 44172K used, 21364K available (block size 4096)
/data: 65536K total, 25796K used, 39740K available (block size 4096)
/cache: 65536K total, 1156K used, 64380K available (block size 4096)

# /data/busybox df
Filesystem           1k-blocks      Used Available Use% Mounted on
tmpfs                    47284         0     47284   0% /dev
tmpfs                    47284         0     47284   0% /sqlite_stmt_journals
/dev/block/mtdblock0     65536     44172     21364  67% /system
/dev/block/mtdblock1     65536     25796     39740  39% /data
/dev/block/mtdblock2     65536      1156     64380   2% /cache