轉自:http://blog.csdn.net/a345017062/article/details/6250619
折騰了幾天,被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。
下載地址:http://www.busybox.net/
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 /<path-to-android-fs>/bin
2、把編譯出來的busybox複製到/bin目錄下
cp busybox /<path-to-android-fs>/bin
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