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