折腾了几天,被Android那点儿少得可怜的shell命令折磨的死去活来,终于下定了革命的决心。看一下怎么把渺小的toolbox替换成伟大的busybox吧。先大致描述一下Android系统中的shell程序部分。
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的连接。
接下来翻译一下网上的一篇文章,借助它,可以把Android自带的toolbox替换成busybox。
Installing Busybox command line tools
英文原文地址:
https://gforge.ti.com/gf/project/omapandroid/wiki/?pagename=Installing+Busybox+command+line+tools
在Android系统中安装busybox命令行工具
本文简单地介绍了怎么把busybox安装到Android的文件系统中去。如果你想直接安装,可以从下面的地址下载我已经预编译好并在Android2.1系统上试验成功的busybox,然后直接跳过下面的安装步骤。
http://download.csdn.net/source/3093680
一、编译busybox
1、下载busybox的最新版本,本文写作时最新版本是1.13.3。
2、解压源码:
tar jxf busybox-1.13.3.tar.bz2
3、运行menuconfig对busybox进行配置
cd busybox-1.13.3/
make menuconfig
4、在menuconfig中设置以下选项
Busybox Settings --> Build Options --> Build Busybox as a static binary (no shared libs) - Enable this option by pressing "Y"
Busybox Settings --> Build Options --> Cross compiler prefix - Set this option equal to "arm-none-linux-gnueabi-"
Busybox Settings --> Installation Options --> Don't use /usr - Enable this option by pressing "Y"
5、把交叉编译器的地址导入到环境变量:
export PATH=/opt/arm/arm-2007q3/bin:$PATH
6、编译busybox
make
二、安装busybox
把busybox安装到Android系统中去,做这几步:
1、在Android系统根目录下创建一个/bin目录。
mkdir /
2、把编译出来的busybox复制到/bin目录下
cp busybox /
3、把busybox安装到Android机器中
cd /bin
./busybox --install
三、把busybox作为默认shell
需要像下面这样编辑一下init.rc
1、编辑console服务,让它默认运行busybox
service console /system/bin/sh -> service console /bin/sh
2、把busybox路径加入到环境变量中
export PATH /sbin:/system/sbin:/system/bin:/system/xbin --> export PATH /bin:/sbin:/system/sbin:/system/bin:/system/xbin
注:
我使用busybox时,只是想简单地增加一些命令,把toolbox一些功能不是很全的命令替换掉,所以操作上没有上面说的那么复杂。下面是我的替代方案,可以试一下:
1、把busybox复制到/system/bin目录下。
adb push busybox /system/bin
2、把要添加的命令通过ln建立到busybox的连接。
比如,Android自带的toolbox是没有test这个命令的。我们要添加test命令就可以:
cd /system/bin
ln -s busybox test
这样,用户通过机器上的shell执行test命令时,就会调用busybox中实现test功能的applet。
对于一些原有的命令,如ls、chown等,如果不想用toolbox,也可以把它们的连接目标指向toolbox,拿chown来举例。
cd /system/bin
rm chown
ln -s busybox chown
这样做,最大的好处就是保证对系统的改动最少,又可以最大限度的扩展shell功能。
参考文档:
为Android加入busybox工具
http://blog.csdn.net/liaoshengjiong/archive/2009/03/04/3957725.aspx
什么是交叉编译
http://www.linuxeden.com/doc/article.php/21264
加入 busybox source
http://cwhuang.info/2010/03/ad-busybox-source