Android模擬器中安裝busybox的最簡方法

Android自帶的命令集相對於busybox還是簡陋很多。為了提高開發效率,在模擬器中安裝busybox是個不錯的選擇。網路上已經有兩種安裝busybox的攻略:

  • 通過已經編譯好的可執行文件安裝,詳見http://hi.baidu.com/mcu99/blog/item/ee9bf43887e02e2cb9998f0a.html
  • 通過源碼來安裝,詳見http://hi.baidu.com/btb368/blog/item/25dd4122d60acb5a9922ede4.html
  • 本文將記錄了通過apk包安裝busybox的方法。

    1. 下載apk包及相關工具安裝busybox需要超級用戶許可權,在http://androidsu.com/superuser/下載su可執行文件和Superuser.apk包文件。下載用於生成Yaffs2的工具,http://code.google.com/p/android-group-korea/downloads/detail?name=mkfs.yaffs2.arm下載busybox的安裝APK包,https://market.android.com/details?id=stericson.busybox
    2. 開啟終端,輸入如下命令啟動Android模擬器
      1. $ emulator-arm -avd google_v7 -partition-size 256 &

      注意:一定要添加參數partition-size來指定system分區的大小。如果不指定system分區大小,系統將以sdk/platforms/android-7/images/system.img文件的大小來掛載分區

      如上圖所示,system分區的可用空間為0kb,如果向system分區拷貝文件,將會得到如下出錯信息:failed to copy "su" to "/system/bin/su": Out of memory

    3. 安裝busybox
      1. $ adb install BusyBox_installer.apk
      2. 2239 KB/s (4723603 bytes in 2.059s)
      3. pkg: /data/local/tmp/BusyBox_installer.apk
      4. Success
      5. $ adb shell
      6. # ls /data/app/
      7. stericson.busybox.apk

      安裝成功後,你可以在模擬器中運行Busybox Installer,但是由於沒有授予它超級用戶的許可權,會彈出對話框提示安裝失敗:

    4. 安裝superuser包和su工具首先,拷貝下載的可執行文件su到system分區
      1. $ adb push su /system/bin
      2. 542 KB/s (22364 bytes in 0.040s)

      注意:在拷貝之前,需要以讀寫許可權重新掛載system分區

      1. $ adb remount
      2. remount succeeded

      否則在向system拷貝文件時,系統會提示如下錯誤failed to copy "su" to "/system/bin/su": Read-only file system然後,賦予su正確的許可權

      1. # chmod 4755 /system/bin/su
      2. # ls -l /system/bin/su
      3. -rwsr-xr-x root root 22364 2008-02-29 02:33 su

      最後,安裝superuser包

      1. $ adb install Superuser.apk
      2. 2251 KB/s (843503 bytes in 0.365s)
      3. pkg: /data/local/tmp/Superuser.apk
      4. Success
      5. $ adb shell
      6. # ls /data/app
      7. com.noshufou.android.su.apk
    5. 在模擬器中運行Busybox Installer,完成busybox的安裝首先,會彈出超級用戶授予的提示對話框,毫無疑問選擇"Allow"

      接著,提示選擇需要安裝Busybox的版本,選完點擊繼續

      然後,選擇Busybox的安裝目錄

      最後,選擇,完成安裝

      安裝完畢後,可以通過shell驗證busybox安裝後的效果,我們熟悉的shell又回來了

    6. 由於前面修改了system.img的內容,這部分修改在模擬器關閉後,並不會主動寫回到system.img上,所以,一旦模擬器關閉,之前做的修改全部功虧一簣。但是,可以通過工具mkfs生成我們自己的system鏡像。
      1. $ adb push mkfs.yaffs2.arm /data/misc
      2. 1832 KB/s (463072 bytes in 0.246s)
      3. ~$ adb shell
      4. # cd /data/misc
      5. # ./mkfs.yaffs2.arm /system /data/misc/my_system.img
      6. mkfs.yaffs2: Android YAFFS2 Tool,Build by PowerGUI
      7. at http://www.openhandsetalliance.org.cn
      8. Building...
      9. Build Ok.
      10. # ls -l my_system.img
      11. -rw------- root root 81935040 2012-01-04 16:00 my_system.img
      12. # exit
      13. ~$adb pull /data/misc/my_system.img .
      14. 3165 KB/s (81935040 bytes in 25.274s)

      然後,關閉模擬器,將生成的my_system.img拷貝到sdk/platforms/android-7/images目錄下替換system.img,重啟模擬器。

    7. 不爽的是,每次都要在命令前,加上busybox,這是由於shell在查找命令時,按照PATH變數的順序來查找,目前的順序依次是/sbin、/system/sbin、/system/bin、/system/xbin,顯而易見,busybox的命令最後被找到,所以可以把/system/xbin放到PATH變數的第一位解決這個問題。可是,PATH變數是在/init.rc中定義,而根目錄是只讀的rootfs文件系統,可以通過如下命令查看
      1. $ adb shell
      2. # mount
      3. rootfs / rootfs ro 0 0
      4. tmpfs /dev tmpfs rw,mode=755 0 0
      5. devpts /dev/pts devpts rw,mode=600 0 0
      6. proc /proc proc rw 0 0
      7. sysfs /sys sysfs rw 0 0
      8. tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
      9. none /dev/cpuctl cgroup rw,cpu 0 0
      10. /dev/block/mtdblock0 /system yaffs2 ro 0 0
      11. /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0
      12. /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0
      13. /dev/block//vold/179:0 /sdcard vfat rw,dirsync,nosuid,nodev,noexec,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0

      將sdk/platforms/android-7/images目錄下的ramdisk.img改名為ramdisk.img.gz,並用gunzip解壓。

      1. $ file ramdisk.img
      2. ramdisk.img: gzip compressed data, from Unix
      3. $ mv ramdisk.img ramdisk.img.gz
      4. $ gunzip ramdisk.img.gz

      檢查解壓後的文件,發現其文件格式已經變成cpio格式。新建臨時文件夾my_ramdisk,並將ramdisk.img備份文件還原到my_ramdisk目錄中

      1. $ file ramdisk.img
      2. ramdisk.img: ASCII cpio archive (SVR4 with no CRC)
      3. $ mkdir my_ramdisk
      4. $ cd my_ramdisk
      5. $ cpio -i -F ../ramdisk.img
      6. $ ls
      7. total 148
      8. drwxrwx--x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 data
      9. -rw-r--r-- 1 liuyuyu liuyuyu 118 2012-01-04 16:55 default.prop
      10. drwxr-xr-x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 dev
      11. -rwxr-x--- 1 liuyuyu liuyuyu 103092 2012-01-04 16:55 init
      12. -rwxr-x--- 1 liuyuyu liuyuyu 1677 2012-01-04 16:55 init.goldfish.rc
      13. -rwxr-x--- 1 liuyuyu liuyuyu 12215 2012-01-04 16:55 init.rc
      14. drwxr-xr-x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 proc
      15. drwxr-x--- 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 sbin
      16. drwxr-xr-x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 sys
      17. drwxr-xr-x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 system

      然後,修改init.rc文件,將/system/xbin/移到PATH變數定義的最前面

      1. export PATH /system/xbin:/sbin:/system/sbin:/system/bin

      重新打包ramdisk

      1. $ cpio -i -t -F ../ramdisk.img > list
      2. $ cpio -o -H newc -O my_ramdisk.img <>

      最後,將my_ramdisk.img替換sdk/platforms/android-7/images/目錄下的ramdisk.img,重啟模擬器,就可以體驗busybox帶給我們的方便了。。。。。

    推薦閱讀:

    TAG:Android | 模擬 | 方法 | 模擬器 | 安裝 | Android模擬器 |