Android: お薦め => bash+BusyBox+su+Terminal Emulator

Andoridエミュレータにbash, BusyBox, su をインストールし、端末エミュレータで使ってみました。
端末エミュレータ内でrootになって、色々なLinuxコマンドを使ってAndroidを設定したり調べたりできます。Linuxコマンド愛好者にお薦めです。
(いずれ実機でも同じことを試そうと思います。) * 実機の場合は → こちら (10/6/2011に追記)

 

[ bash ]

Andoridエミュレータに入っているシェル(/system/bin/sh)は、ソースコードのドキュメント system/core/sh/NOTICE を見るとKenneth Almquist氏によって書かれたシェル(ash)がベースのようです。

Copyright (c) 1991, 1993
The Regents of the University of California. All rights reserved.
This code is derived from software contributed to Berkeley by Kenneth Almquist.

WITH_HISTORYをdefineしてコンパイルすればヒストリー機能も使えるようですが、エミュレータのshには組み込まれていません。

なので、使い慣れたbashをインストールしてみました。
前回の記事のようにソース(bash-4.1)からコンパイルしても良いし、コンパイル済みのバイナリを使うこともできます。
コンパイル済みのバイナリ(bash-4.0)は以下からダウンロードできます。それを7-Zipコマンドで解凍します。
http://www.compdigitec.com/labs/files/bash-android.7z
 $ 7za e bash-android.7z

これをadbコマンドかEclipse/DDMSのファイル・エクスプローラーでエミュレータにコピーします。
私は/data/localディレクトリの下にbinディレクトリを作って、そこに置きました。

bash-4.1# ls -l /data/local/bin/bash* lrwxrwxrwx 1 0 0 15 Sep 29 08:51 /data/local/bin/bash -> bash.compile.4.1 -rwxr-xr-x 1 0 0 2797284 Sep 29 08:50 /data/local/bin/bash.compile.4.1 -rwxr-xr-x 1 0 0 2760700 Sep 29 06:29 /data/local/bin/bash.download.4.0 bash-4.1#

[ BusyBox ]

参考:BusyBoxとは
http://ja.wikipedia.org/wiki/BusyBox
http://busybox.net/about.html
 => The Swiss Army Knife of Embedded Linux

BusyBoxをソースからNDKでクロスコンパイルしてARMバイナリを生成しようとしたのですが、エラーが色々と出て、簡単には解決できそうにないので、一旦中断し、ライブラリをスタティックリンクしたバイナリが提供されているので、それをダウンロードして、bashと同じ/data/local/binディレクトリにコピーしました。
(x86アーキテクチャのバイナリであれば、既定の手順通りにコンパイルできます。)

ソース:
http://busybox.net/downloads/busybox-1.19.2.tar.bz2

コンパイル済みバイナリ:
http://busybox.net/downloads/binaries/1.19.0/busybox-armv5l
http://busybox.net/downloads/binaries/1.19.0/busybox-armv6l
(ARM, Intel, Motorola, MIPS, PowerPC, SPARCなどの海外のプロセッサに混じって、唯一 made-in-Japanのsh4が入っている)

Android Emulator(sdk r11)ではプロセッサがarmv5l と表示されるので、busybox-armv5lを使いましたが、busybox-armv6lでも動くようです。

bash-4.1# cat /proc/cpuinfo | head -1
Processor : ARM926EJ-S rev 5 (v5l)

busyboxを使う場合は次のようにしますが、

bash-4.1# PATH=/data/local/bin:$PATH
bash-4.1# busybox-armv5l コマンド 引数 (例:# busybox-armv5l head /init.rc )

次のようにシンボリックリンクを作っておくと、上記画面のlsやgrepのように、busybox内のコマンドを単に"コマンド 引数"で実行できるので便利です。
(busyboxに含まれているコマンドは、busyboxを引数なしに実行すると表示されます。)

bash-4.1# ls -l /data/local/bin total 6495 lrwxrwxrwx 1 0 0 15 Sep 29 08:51 bash -> bash.compile.4.1 -rwxr-xr-x 1 0 0 2797284 Sep 29 08:50 bash.compile.4.1 -rwxr-xr-x 1 0 0 2760700 Sep 29 06:29 bash.download.4.0 lrwxrwxrwx 1 0 0 14 Sep 29 01:21 busybox -> busybox-armv5l -rwxr-xr-x 1 0 0 1085140 Sep 29 01:17 busybox-armv5l lrwxrwxrwx 1 0 0 7 Sep 29 01:22 cp -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 06:37 find -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 01:22 grep -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 04:43 head -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 06:44 hostname -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 06:36 less -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 01:22 ls -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 06:35 more -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 04:43 tail -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 01:22 vi -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 06:36 wc -> busybox lrwxrwxrwx 1 0 0 7 Sep 29 01:22 which -> busybox bash-4.1#

また、"adb -e shell"コマンドでログインする度にPATHを設定し直すのは面倒なので、rootfs(initrd)内の/init.rcのPATH設定を変更しました。

bash-4.1# grep " PATH " /init.rc
export PATH /data/local/bin:/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin

なお、rootfsはメモリーにロードされているので、rwでremountして書き直しても、再起動すると元に戻ってしまいます。
なので元のイメージramdisk.imgを書き直しました。 => 手順はこちら

[ su ]

エミュレータに入っているsuコマンド(/system/xbin/su)では、rootになろうとすると"su: uid 10018 not allowed to su"のように、エラーとなってしまいます。これはsuコマンドが実行ユーザのuidをチェックし、rootしか実行できないようにしている為です。
前回の記事のように、uidのチェックを外してソースからコンパイルし直すか、あるいはコンパイル済みのバイナリを使うこともできます。
コンパイル済みのバイナリは以下からダウンロードできます。
http://www.magicandroidapps.com/su.zip

なお、suコマンドの実行とコピーに関して、以下のような制限があります。
・/system(/system/xbin)以外に置かれたsuコマンドを実行すると、"permission denied"となって実行できない。
・/systemをrwでremountして/system/xbinにコピーしようとしても、大きさゼロとなってしまう。
・/system/xbinにファイルを作っても、再起動すると元に戻ってしまう。(/systemもrootfsと同じく、メモリーにロードされているものと思われます。)

なので、元のイメージsystem.imgを書き換えました。 => 手順はこちら

[ ターミナルエミュレータ ]

AndroidエミュレータにはTerminal Emulatorが入っています。
[Menu] => [Dev Tools] => [Terminal Emulator] で起動します。
Terminal Emulatorを起動後、[Menu] => [Preference] でFontSizeやColorをカスタマイズできます。