Android模擬器中安裝busybox的最簡方法
本文將記錄了通過apk包安裝busybox的方法。
- 下載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
- 開啟終端,輸入如下命令啟動Android模擬器
- $ 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
- 安裝busybox
- $ adb install BusyBox_installer.apk
- 2239 KB/s (4723603 bytes in 2.059s)
- pkg: /data/local/tmp/BusyBox_installer.apk
- Success
- $ adb shell
- # ls /data/app/
- stericson.busybox.apk
安裝成功後,你可以在模擬器中運行Busybox Installer,但是由於沒有授予它超級用戶的許可權,會彈出對話框提示安裝失敗:
- 安裝superuser包和su工具首先,拷貝下載的可執行文件su到system分區
- $ adb push su /system/bin
- 542 KB/s (22364 bytes in 0.040s)
注意:在拷貝之前,需要以讀寫許可權重新掛載system分區
- $ adb remount
- remount succeeded
否則在向system拷貝文件時,系統會提示如下錯誤failed to copy "su" to "/system/bin/su": Read-only file system然後,賦予su正確的許可權
- # chmod 4755 /system/bin/su
- # ls -l /system/bin/su
- -rwsr-xr-x root root 22364 2008-02-29 02:33 su
最後,安裝superuser包
- $ adb install Superuser.apk
- 2251 KB/s (843503 bytes in 0.365s)
- pkg: /data/local/tmp/Superuser.apk
- Success
- $ adb shell
- # ls /data/app
- com.noshufou.android.su.apk
- 在模擬器中運行Busybox Installer,完成busybox的安裝首先,會彈出超級用戶授予的提示對話框,毫無疑問選擇"Allow"
接著,提示選擇需要安裝Busybox的版本,選完點擊
繼續 然後,選擇Busybox的安裝目錄
最後,選擇,完成安裝
安裝完畢後,可以通過shell驗證busybox安裝後的效果,我們熟悉的shell又回來了
- 由於前面修改了system.img的內容,這部分修改在模擬器關閉後,並不會主動寫回到system.img上,所以,一旦模擬器關閉,之前做的修改全部功虧一簣。但是,可以通過工具mkfs生成我們自己的system鏡像。
- $ adb push mkfs.yaffs2.arm /data/misc
- 1832 KB/s (463072 bytes in 0.246s)
- ~$ adb shell
- # cd /data/misc
- # ./mkfs.yaffs2.arm /system /data/misc/my_system.img
- mkfs.yaffs2: Android YAFFS2 Tool,Build by PowerGUI
- at http://www.openhandsetalliance.org.cn
- Building...
- Build Ok.
- # ls -l my_system.img
- -rw------- root root 81935040 2012-01-04 16:00 my_system.img
- # exit
- ~$adb pull /data/misc/my_system.img .
- 3165 KB/s (81935040 bytes in 25.274s)
然後,關閉模擬器,將生成的my_system.img拷貝到sdk/platforms/android-7/images目錄下替換system.img,重啟模擬器。
- 不爽的是,每次都要在命令前,加上busybox,這是由於shell在查找命令時,按照PATH變數的順序來查找,目前的順序依次是/sbin、/system/sbin、/system/bin、/system/xbin,顯而易見,busybox的命令最後被找到,所以可以把/system/xbin放到PATH變數的第一位解決這個問題。可是,PATH變數是在/init.rc中定義,而根目錄是只讀的rootfs文件系統,可以通過如下命令查看
- $ adb shell
- # mount
- rootfs / rootfs ro 0 0
- tmpfs /dev tmpfs rw,mode=755 0 0
- devpts /dev/pts devpts rw,mode=600 0 0
- proc /proc proc rw 0 0
- sysfs /sys sysfs rw 0 0
- tmpfs /sqlite_stmt_journals tmpfs rw,size=4096k 0 0
- none /dev/cpuctl cgroup rw,cpu 0 0
- /dev/block/mtdblock0 /system yaffs2 ro 0 0
- /dev/block/mtdblock1 /data yaffs2 rw,nosuid,nodev 0 0
- /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev 0 0
- /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解壓。
- $ file ramdisk.img
- ramdisk.img: gzip compressed data, from Unix
- $ mv ramdisk.img ramdisk.img.gz
- $ gunzip ramdisk.img.gz
檢查解壓後的文件,發現其文件格式已經變成cpio格式。新建臨時文件夾my_ramdisk,並將ramdisk.img備份文件還原到my_ramdisk目錄中
- $ file ramdisk.img
- ramdisk.img: ASCII cpio archive (SVR4 with no CRC)
- $ mkdir my_ramdisk
- $ cd my_ramdisk
- $ cpio -i -F ../ramdisk.img
- $ ls
- total 148
- drwxrwx--x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 data
- -rw-r--r-- 1 liuyuyu liuyuyu 118 2012-01-04 16:55 default.prop
- drwxr-xr-x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 dev
- -rwxr-x--- 1 liuyuyu liuyuyu 103092 2012-01-04 16:55 init
- -rwxr-x--- 1 liuyuyu liuyuyu 1677 2012-01-04 16:55 init.goldfish.rc
- -rwxr-x--- 1 liuyuyu liuyuyu 12215 2012-01-04 16:55 init.rc
- drwxr-xr-x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 proc
- drwxr-x--- 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 sbin
- drwxr-xr-x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 sys
- drwxr-xr-x 2 liuyuyu liuyuyu 4096 2012-01-04 16:55 system
然後,修改init.rc文件,將/system/xbin/移到PATH變數定義的最前面
- export PATH /system/xbin:/sbin:/system/sbin:/system/bin
重新打包ramdisk
- $ cpio -i -t -F ../ramdisk.img > list
- $ cpio -o -H newc -O my_ramdisk.img <>
最後,將my_ramdisk.img替換sdk/platforms/android-7/images/目錄下的ramdisk.img,重啟模擬器,就可以體驗busybox帶給我們的方便了。。。。。
推薦閱讀: