Android中如何加入busybox

我們可以通過兩種方式進入Android的console:

1. 直接執行命令emulator -shell,我的是emulator -avd MyAVD2.3.1_map -scale 0.77 -shell,用這種方式進入console是普通用戶$,至少2.3的版本是這樣。

2. 在啓動emulator後,通過命令adb shell進入,用這種方式進入console是超級用戶,至少2.3的版本是這樣。當模擬器啓動用用上述命令可能會出現如下錯誤:

derek@derek-ThinkPad-Edge:~$ adb shell
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
error: device offline

沒關係再輸入一遍adb shell 就可以了,這時候就會出現#提示符了。

    之後我們就可以使用一些linux下常用的命令了,如ls,cat等。然而Android自帶的toolbox(位於/system/bin中)也太簡略了點,有些命令如 find,Android並不支持或者支持得不好。下面將介紹如何爲Android加入busybox工具,通過編譯得到一個可以在Android裏面運行的busybox工具,我們就可以使用衆多常見的linux命令了,如find,touch等。

步驟如下:

1. 首先去busybox主頁 下載最新版本的busybox源代碼.

2. 下載交叉編譯工具: GNU Toolchain for ARM Processors 

    下載地址:http://www.codesourcery.com/gnu_toolchains/arm/download.html

    其中第一項選擇ARM EABI或ARM GNU/Linux,第二項選擇IA32 GNU/Linux TAR即可。

    最後得到一個arm-2010.09-50-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2文件,我下的是ARM GNU/Linux中的。

    將壓縮包解壓到linux下某個目錄, 並設置好環境變量(~/.bashrc), export PATH=/home/derek/Android/crosstools/ARMGNULinux/arm-2010.09/bin/:$PATH,使之能找到前綴爲"arm-none-linux-gnueabi-"的交叉編譯工具。如果設置好環境變量之後,那麼在第三步中的Cross Compler prefex只要填上“arm-none-linux-gnueabi-“即可,當然也可以不用在~/.bashrc中設置環境變量,但在Cross Compler prefex中要填上交叉編譯工具的完整路徑名和rm-none-linux-gnueabi-前綴。

    在編譯的時候可能會出錯,請確保所用的busybox和交叉編譯工具的版本是否匹配,建議都用最新的吧。

3. 進入busybox源碼目錄.

     先執行make menuconfig命令對編譯過程進行配置.  過程如下:

     Busybox Settings -> Build Options ->

     [*] Build BusyBox as a static binary (no shared libs) 這個要選上,因上這樣子編譯出來的busyBox纔是可以獨立運行的。
     (
/home/derek/Android/crosstools/ARMGNULinux/arm-2010.09/bin/arm-none-linux-gnueabi-
) Cross Compiler prefex 這是交叉編譯器的"路徑+前綴",要根據具體的情況來設置。               
     Busybox Settings -> Installation Options->
     [*] Don’t use /usr        這樣子編譯出來的busybox纔不會安裝到你主機的/usr目錄下。一定要選上。

4 執行make編譯源碼.  如果編譯過程中產生無法找到頭文件的錯誤, 可指定交叉編譯器用到的頭文件所在路徑. 如

   $make -I./home/derek/Android/crosstools/ARMGNULinux/arm-2010.09/arm-none-linux-gnueabi/libc/usr/include

5 編譯成功後將得到一個名爲busybox的可執行文件,可以執行make install,進行安裝,這時在busybox的目錄下將生成_install目錄,裏面的所有鏈接都是鏈接到_install/bin/busybox。

6 在Android的console下建立目錄/data/busybox, 並使用下面的命令將文件busybox複製該目錄中:

   adb push busybox /data/busybox

7 從Android的console進入/data/busybox目錄, 爲可執行文件busybox加上可執行屬性: chmod +x busybox,我這裏沒加,因爲默認創建完之後就有x權限。

8 這時我們就可以使用busybox工具了, 如果希望在任何目錄下都可以直接使用bosybox,則需要將路徑/data/busybox export到path環境變量中:

   export PATH=$PATH:/data/busybox

9 設置環境變量之後, 在命令行輸入busybox, 即可看到其用法, 如:

   在當前目錄及其子目錄中查找名爲init.rc的文件可使用以下命令:

   $busybox find . -name init.rc 

10 安裝busybox。

   通過執行./busybox --install -s 我們會看到出現一些錯誤, 原因是因爲Android系統的根目錄和/sbin目錄是隻讀的.  因此我們無法把一些常用命令安裝到/bin目錄下, 也不能修改/init.rc文件來設置PATH環境變量. 

   對於如何執行命令busybox --install -s 的默認安裝路徑, 這裏我還不太清楚, 或許跟Makefile和編譯busybox的相關設置有關. 

   儘管我們不可以在Android裏面通過執行busybox --install -s 命令來安裝常用命令, 我們卻可以通過另外一個方法來把常用命令安裝到Android裏面.  

   方法很簡單, 可以先在外面的linux系統中執行make install命令把相關的命令提取出來. 然後再通過命令adb push ./_install/bin /data/busybox/bin 把這些常用命令複製進Android系統中. 注意: make install安裝命令的所在路徑可通過執行make menuconfig進行設置, 默認爲./_install目錄下面.

   這樣,我們就不用每次使用busybox提供的一個命令時, 都要在前面加上busybox了.

11 修改/init.rc文件設置環境變量.

     請參考帖子: 對Android啓動過程的進一步研究

     要提醒的是, 修改PATH環境變量的時候, 應該把busybox常用命令的路徑"/data/busybox/bin"放在Android的常用命令路徑"/system/bin"的前面, 否則, 先查找得到的將不是busybox的命令,  可以這樣設置, 每次運行都要重新執行一下。

     export PATH /data/busybox/bin:/data/busybox/sbin:/data/busybox/usr/bin:/data/busybox/usr/sbin:/sbin:/system/sbin:/system/bin:/system/xbin

參考網址:

https://gforge.ti.com/gf/project/omapandroid/wiki/?pagename=Installing+Busybox+command+line+tools

http://blog.csdn.net/a345017062/archive/2011/03/15/6250619.aspx

http://hi.baidu.com/btb368/blog/item/25dd4122d60acb5a9922ede4.html

http://hi.baidu.com/mcu99/blog/item/ee9bf43887e02e2cb9998f0a.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章