TShopping

 找回密碼
 註冊
搜索
查看: 99|回復: 0

[轉帖] [Android]為Android加入busybox工具(三篇)

[複製鏈接]
發表於 2017-12-5 23:50:34 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 
================================================== ===================
第一篇

大家是否有過這樣的經歷,在命令行里輸入adb shell,然後使用命令操作你的手機或模擬器,但是那些命令都是常見Linux命令的閹割縮水版,用起來很不爽。是否想過在Android上使用較完整的shell呢?用BusyBox吧。不論使用adb連接設備使用命令行還是在手機上直接用terminal emulator都可以。

一、什麼是BusyBox ?
BusyBox 是標準Linux 工具的一個單個可執行實現。BusyBox 包含了一些簡單的工具,例如cat 和echo,還包含了一些更大、更複雜的工具,例如grep、find、mount 以及telnet。有些人將BusyBox 稱為Linux 工具裡的瑞士軍刀.簡單的說BusyBox就好像是個大工具箱,它集成壓縮了Linux 的許多工具和命令。(摘自百度百科)

二、在Android上安裝BusyBox
準備:
0. 先要把手機給Root了,具體教程這裡就不提供了,網上有很多。
1.下載BusyBox的binary,打開這個地址  http://www.busybox.net/downloads/binaries,選擇最新版本,然後下載對應你的設備架構的版本,這裡我下載了busybox-armv6l,下面將以這個文件名為示例。
aa.png
2. 需要有一個命令行的環境,在電腦上使用adb或在手機上使用terminal emulator。
3. 連接手機和電腦,手機的USB Mode設置成None(僅充電),並且開啟USB調試模式。

安裝:
1. 將busybox-armv6l重命名為busybox
2. 將busybox傳入手機的SD卡,可以使用下面的命令或自己想其他辦法。
打開terminal(Linux,Mac)或cmd(Windows)
  1. adb push ~/Desktop/busybox /mnt/sdcard
複製代碼


其中的~/Desktop請根據自己的情況替換成正確的路徑
3. 輸入以下命令,為了在/system目錄寫入文件
  1. adb shell
  2. su
  3. mount -o remount,rw /system
複製代碼


使用ls 檢查一下/system 裡是否有xbin 目錄,沒有的話輸入mkdir xbin 創建,因為本示例是要把busybox安裝到/system/xbin 。

4. 複製busybox 文件到/system/xbin,並為其分配“可執行”的權限
  1. cp /mnt/sdcard/busybox /system/xbin
  2. chmod 755 busybox
複製代碼

5. 這時就可以使用busybox 的命令了,例如以前沒有清屏的clear命令,現在只需輸入busybox clear 就可以實現清屏功能,使用完整版的ls 只需輸入busybox ls 。
但是每次前面都加上個busybox太麻煩了,所以我們還要繼續完成安裝。
在/system/xbin 下輸入
  1. busybox --install .
複製代碼


如果想安裝到別的目錄,則把點替換成別的路徑。
至此就安裝完成了,比較一下原來的ls 命令和busybox 裡的ls 命令。
2.png
常見錯誤:
1. 如果安裝時出現這樣的錯誤,
busybox: /bin/zcat: No such file or directory
busybox: /sbin/zcip: Invalid cross-device link
說明沒有輸入安裝路徑,正確的示例  busybox --install /system/xbin

2. 如果出現這樣的錯誤,
cp: /system/xbin/busybox: Read-only file system

說明沒有正確輸入上面第三步的mount命令。

小技巧:
1. busybox 裡有ash 和hush 還有sh 這幾種shell,在命令行輸入ash 或hush,可以像在bash 裡那樣,通過按上下鍵選擇剛才輸入的命令。
2. android系統本身就有ls命令,busybox裡也有ls,輸入ls時調用的是android的ls,那麼想用busybox的ls就要每次都在前面加個busybox嗎?不用,使用alias命令可以搞定。
  1. alias ls='busybox ls'
複製代碼

解除alias
  1. unalias alias-name...
  2. unalias -a
複製代碼

同樣的,cp、mv等二者都有的命令都可以這樣搞定。也可以通過修改/init.rc 來解決。
================================================== ===================

第二篇

1.進入終端

  1.直接執行命令emulator -shell;

  2. 在啟動emulator後,通過命令adb shell進入。

2.下載busybox以及交叉編譯工具

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-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2文件

    將壓縮包解壓到linux下某個目錄, 並設置好環境變量, 使之能找到前綴為"arm-none-linux-gnueabi-"的交叉編譯工具.

3.對busybox進行相應配置

3. 進入busybox源碼目錄.

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

      Busybox設置 - > Build選項 - >


Build BusyBox as a static binary (no shared libs )這個要選上,因上這樣子編譯出來的busyBox才是可以獨立運行的。
     (/home/jo/tool/arm-2008q3/bin/arm-none-linux-gnueabi-) Cross Compiler prefex  這是交叉編譯器的"路徑+前綴",要根據具體的情況來設置。
    Busybox Settings -> Installation Options->
   
Don't use /usr

    這樣子編譯出來的busybox才不會安裝到你主機的/usr目錄下。一定要選上。

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

  1. $make -I ./home/jo/tool/arm-2008q3/arm-none-linux-gnueabi/libc/usr/include/
複製代碼



5 編譯成功後將得到一個名為busybox的可執行文件.

4.把busybox移植入android

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

  1. adb push busybox /data/busybox
複製代碼

7從Android的console進入/data/busybox目錄,為可執行文件busybox加上可執行屬性: chmod 775 busybox

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

  1. export PATH=$PATH:/data/busybox
複製代碼

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

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

  1. $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文件設置環境變量.

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

  1. export PATH /data/busybox/bin:/sbin:/system/sbin:/system/bin:/system/xbin
複製代碼

================================================== ===================


第三篇


android 自帶的toolbox

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的連接。

替換toolbox為busybox
接下來翻譯一下網上的一篇文章,借助它,可以把Android自帶的toolbox替換成busybox。
安裝Busybox命令行工具
在Android系統中安裝busybox命令行工具
本文簡單地介紹了怎麼把busybox安裝到Android的文件系統中去。如果你想直接安裝,可以從下面的地址下載我已經預編譯好並在Android2.1系統上試驗成功的busybox,然後直接跳過下面的安裝步驟。
下載在Linux公社的1號FTP服務器裡,下載地址:
FTP地址:ftp://ip
用戶名:username
密碼:passwd


一、編譯busybox
1、下載busybox的最新版本,本文寫作時最新版本是1.21.1。
2、解壓源碼:
  1. tar jxf busybox-binaries.tar.bz2
複製代碼

3、運行menuconfig對busybox進行配置
cd busybox-1.21.1 /
make menuconfig
4、在menuconfig中設置以下選項
Busybox設置 - > Build選項 - >將Busybox建立為靜態二進製文件(無共享庫) - 按“Y”
Busybox設置 - > Build選項 - >交叉編譯器前綴 - 設置這個選項等於“arm-none-linux-gnueabi-”
Busybox設置 - >安裝選項 - >不要使用/ usr - 按“Y”
5、把交叉編譯器的地址導入到環境變量:
  1. export PATH=/opt/arm/arm-2007q3/bin:$PATH
複製代碼

6、編譯busybox
使
二、安裝busybox
把busybox安裝到Android[/url]系統中去,做這幾步:
1、在Android[/url]系統根目錄下創建一個/bin目錄。
  1. mkdir /<path-to-Android-fs>/bin
複製代碼

2、把編譯出來的busybox複製到/bin目錄下
  1. cp busybox /<path-to-Android-fs>/bin
複製代碼


3、把busybox安裝到Android[/url]機器中
  1. cd /bin
  2. ./busybox --install
複製代碼


三、把busybox作為默認shell
需要像下面這樣編輯一下init.rc
1、編輯console服務,讓它默認運行busybox
  1. service console /system/bin/sh  ->  service console /bin/sh
複製代碼

2、把busybox路徑加入到環境變量中
  1. 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目錄下。
  1. adb push busybox /system/bin
複製代碼

2、把要添加的命令通過ln建立到busybox的連接。
比如,Android[/url]自帶的toolbox是沒有test這個命令的。我們要添加test命令就可以:
  1. cd /system/bin
  2. ln -s busybox test
複製代碼

這樣,用戶通過機器上的shell執行test命令時,就會調用busybox中實現test功能的applet。
對於一些原有的命令,如ls、chown等,如果不想用toolbox,也可以把它們的連接目標指向toolbox,拿chown來舉例。
  1. cd /system/bin
  2. rm chown
  3. ln -s busybox chown
複製代碼

這樣做,最大的好處就是保證對系統的改動最少,又可以最大限度的擴展shell功能。
================================================== ===================
英文文檔
建立busybox
從以下網站下載最新版本的busybox。在撰寫本文時,最新版本是v.1.21.1。
http://www.busybox.net提取busybox來源:

  1. tar jxf busybox-1.21.1.tar.bz2Configure busybox by running menuconfig
  2. cd busybox-1.21.1/
複製代碼

make menuconfigIn menuconfig set the following options
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"Export path to where the cross-compiler is
  1. export PATH=/opt/arm/arm-2007q3/bin:$PATH
  2. Build busybox
  3. make
  4. Installing Busybox
複製代碼


-------------------------------------------------- ------------------------------
To install busybox in the target file-system
Create a /bin directory in the target file-system. For example:
mkdir /<path-to-Android[/url]-fs>/binCopy the busybox binary to the /bin directory in the target file-system
cp busybox /<path-to-Android-fs>/bin Install the busybox command line tools on the target by executing the following commands:
  1. cd /bin
  2. ./busybox --install
複製代碼

使Busybox外殼成為默認外殼

-------------------------------------------------- ------------------------------
Make the Busybox shell the default shell

--------------------------------------------------------------------------------
To make the busybox shell the default shell, edit the file "init.rc" in the target file-system as follows:
Edit the console service so that it runs the busybox shell and not the default shell by replacing:
service console /system/bin/shWith:
service console /bin/shAdd the path of the busybox command line tools to the system path variable by replacing:
export PATH /sbin:/system/sbin:/system/bin:/system/xbinWith
export PATH /bin:/sbin:/system/sbin:/system/bin:/system/xbin

================================================== ===================


文章來源

 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2017-12-16 11:38 , Processed in 0.062379 second(s), 24 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表