Android自带的命令集相对于busybox还是简陋很多。为了提高开发效率,在模拟器中安装busybox是个不错的选择。
网络上已经有两种安装busybox的攻略:
本文将记录了通过apk包安装busybox的方法。
- 下载apk包及相关工具
安装busybox需要超级用户权限,在下载su可执行文件和Superuser.apk包文件。
下载用于生成Yaffs2的工具,
下载busybox的安装APK包, - 开启终端,输入如下命令启动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
-
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 < list
最后,将my_ramdisk.img替换sdk/platforms/android-7/images/目录下的ramdisk.img,重启模拟器,就可以体验busybox带给我们的方便了。。。。。
阅读(7713) | 评论(0) | 转发(0) |