分享

Android模拟器中安装busybox的最简方法

 降伏其心 2016-05-18
Android自带的命令集相对于busybox还是简陋很多。为了提高开发效率,在模拟器中安装busybox是个不错的选择。

网络上已经有两种安装busybox的攻略:

本文将记录了通过apk包安装busybox的方法。
  1. 下载apk包及相关工具
    安装busybox需要超级用户权限,在http:///superuser/下载su可执行文件和Superuser.apk包文件。
    下载用于生成Yaffs2的工具,http://code.google.com/p/android-group-korea/downloads/detail?name=mkfs.yaffs2.arm
    下载busybox的安装APK包,https://market./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.
    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带给我们的方便了。。。。。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多