Android自帶的toolbox分析及擴展

轉自: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



發佈了24 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章