Android 預設的 shell 就是 /system/bin/sh 這個 process,移植自 NetBSD 早期的 sh 程式,原本功能算是完整,但被 Android 開發團隊移去相當多功能,致使在 shell 下的操作苦不堪言
1. 下載busybox
http://www.busybox.net/
2. 编译busybox
$>tar xvf busybox-1.17.0.tar.tar //这里使用现成的busybox,你也可以下载最新的来制作
$>cd busybox-1.17.0/
$>make menuconfig
Busybox Settings —>
General Configuration —>
[*] Don’t use /usr–> //要选择此项,不然又部分命令会被安装到_install/usr/bin和_install/usr/sbin, busybox-1.18.0中,这项没有用,不管选择与否都会有部分命令安装到_install/usr/bin和_install/usr/sbin。使用busybox-1.17.0就正常,且此项在Build Options中。
Build Options —>
[*] Build BusyBox as a static binary (no shared libs) //使用静态库编译
(arm-none-linux-gnueabi-) Cross Compiler prefix //填入交叉编译工具链名,如果不在路径PATH中,可使用绝对路径。
Busybox Library Tuning —>
[*] Tab completion -> //检测此项是否选择,如没有选,就不能使用tab键补全,默认是选择的。
$>make //生成busybox文件
$>make install //将busybox命令安装到_install/bin和_install/sbin目录
3. 將編譯好的busybox放入 /system/bin 底下
4. 执行busybox sh命令
target #./busybox sh //执行这个命令后,便能正常使用tab补全,回格删除,上下方向键记忆等命令。但是没有cp命令。
shell實現分為兩部分:
一、shell解釋器和內置命令
源碼位於system/core/sh目錄下,主要完成shell命令的解釋查找,對於builtins.c中包含的內置命令,直接執行,對於toolbox的擴展命令,間接調用toolbox程序完成。
二、toolbox擴展命令
主要完成擴展命令的執行,每一個擴展命令對應一個name_main函數,如ls命令,對應ls_main函數。同時,每一個擴展命令都由一個system/core/toolbox/目錄下面的.c文件實現。 toolbox.c會根據這個目錄下面的.c文件生成tools.h頭文件,並在system/core/toolbox/Android.mk文件中為每個命令生成指向toolbox的連接。 toolbox的實現結構使它擴展一個命令很容易。
假設現在我們自己想手工添加一個shell命令mycommand,只要在system/core/toolbox/目錄下面新建一個mycommand.c文件,並在裡面實現一個mycommand_main函數,然後在system/core/toolbox/Android.mk中添加mycommand.c即可。 Android.mk會自動把它編譯進toolbox程序,並在編譯生成的Android系統/system/bin目錄下為這個命令生成一個指向toolbox的連接。