默认情况下,android使用的是精简的toolbox工具,相对习惯了busybox的朋友来说,使用toolbox
简直无法忍受。网上介绍了一些移植busybox到android平台的文章,但是用起来总感觉有些不顺手,比如有
网友将busybox放在了/data目录,这可是ram目录啊,掉电后busybox也会根着消失。还有些网友直接将
toolbox给替换了,要知道toolbox有一些命令是android所特有的,如果直接干掉toolbox,会有很大的
隐患,比如setprop,am等将无法使用了。下面给出多种移植方法,并给出各自的优缺点比较。


方法一:使用adb工具


第一步:下载 busybox 源码,编译生成 busybox 工具


这里使用 busybox-1.13.3。
解压 busybox-1.13.3-mini6410.tar.gz,在 busybox-1.13.3 目录下修改 makefile 文件,修
改的内容如下:
ARCH ?= arm
CROSS_COMPILE ?= arm-fsl-linux-gnueabi-
注意,这里交叉编译工具使用的和内核相同的工具,arm-fsl-linux-gnueabi-所在路径需
在 bashrc 中声明。
执行 make menuconfig 配置 busybox:
在 Busybox Settings -> Build Options 中:
在 Busybox Settings -> Busybox Library Tuning 中,确保选中 Tab completion 选项,支持
Tab 扩展键:
在 Busybox Settings ---> Installation Options 中:
然后执行 make,make install,这时将会在 busybox-1.13.3 目录生成 busybox 工具,同
时在_install\bin 目录会生成很多指令工具。


第二步:将busybox以及指令工具拷贝到开发板上


启动开发板,进入android文件系统,通过USB电缆连接开发板和PC机,在PC端打
开MS-DOS工具,使用 adb devices 查询 PC 机是否与开发板通信正常。
在开发板的 android 终端新建/data/busybox 目录:
mkdir -p /data/busybox
使用 adb push 指令将上一步生成的文件拷贝到开发板的/data/busybox 目录:
adb push \\192.168.254.128\share\tools\busybox-1.13.3\_install\bin /data/busybox/bin
由于文件比较大,这一步需要拷贝几分钟。
由于 mx53 开发板的文件系统全放在 SD 卡上,因此拷贝完后,一定要使用 sync 指令
同步文件系统,确保数据全写到 SD 卡上。


第三步:其它参数的设置


在开发板 android 终端进入/data/busybox/bin 目录,将包括 busybox 在内的所有文件的
权限全改为 777
cd /data/busybox/bin
chmod 777 *
到这一步,执行 busybox 时,仍然会提示找不到 busybox,必须做如下声明:
export PATH=$PATH:/data/busybox/bin
这时,已经可以使用 busybox 的各种指令,包括 find,cp 了,但是仍然无法使用 TAB
命令。执行如下指令:
busybox sh
再试试 TAB 命令,已经正常工作了。注意,TAB 键正常工作的先决条件是在 busybox
中添加了 Tab completion 支持。
我们不妨使用 ls 命令列出当前目录存在的文件,发现它的排列仍然是一长条,看起来
很不习惯,远不像我们使用的 busybox 那样整齐。事实上这时候 ls 仍然为 android 默认的
toolbox 带的 ls。解决方法很简单,使用 busybox 强大的 find 功能找到 toolbox 的 ls 所在:
cd /
find . –name ls
我们发现它在/system/bin 目录下,直接进入该目录,将 ls 删除即可。还有很多其他的
指令,像 rm 等,都可以一并删除。但是我们发现它并不能轻而易举的被删掉,提示如下
信息:
rm failed for rm, Read-only file system
原来/system 目录是只读的。在开发板的 andrid 终端使用下面的命令将它强行切换为可
读写目录:
mount -o remount,rw -t ext4 /dev/block/mmcblk0p2 /system
注意,mx53 开发板的文件系统存在 SD 卡的第二分区,即 mmcblk0p2,且该分区已被
格式化为 ext4。如果使用其他分区或是使用其他格式,需修改相应的参数。
这时我们就可以删除/system/bin 下的文件了,如下图:
再执行 ls 指令,这次排列已经相当整齐了。
值得注意的是,将数据保存在/data 目录下,断电后数据就丢失了,因为/data 保存在
ram 中。它的优点就是不用重新制作系统映像。


方法二:直接替换toolbox


android 源码编译完成后,会在源码的根目录生成 out 目录,在里面找到 mx53_loco 目
录,找到/system/bin 目录,删除里面的 toolbox 文件,然后将前面生成的 busybox 下的
_install/bin 目录下的所有文件全部拷贝到/system/bin 目录,然后重新编译 android 源码,注
意千万不要将 out 下的文件删除了,否则编译源码需要好几个小时。重新编译只用几分钟
时间。将新生成的 system.img 映像文件下载到 SD 卡中,重启开发板,就能正常的使用
busybox 了。
由于这样直接替换了toolbox的大部分命令,会破坏toolbox的完整性,部分功能将不能正常使用了,如
am等。它的优点是移植简单。


方法三:在toolbox的基础上增加busybox


方法二将busybox的各种链接都覆盖到/system/bin目录了,事实上,我们可以只将busybox这个文件
拷贝到/system/bin目录,如果需要用到busybox,只需在前面添加busybox就可以了,比如列出当前
目录的文件:
busybox ls
这种方法移植简单,但是使用起来每次都需要在前面添加一个busybox,比较繁琐,而且不具备指令补全功能,
一旦敲错了,意味着要重敲一遍命令。优点就是不会破坏android的功能,如am等都能正常使用。


方法四:在toolbox的基础上新增busybox脚本,支持两个脚本切换


该方法基本上能够弥补上面的一些方法的不足,推荐大家使用。移植起来也不复杂。


第一步:交叉编译busybox,生成需要的文件


第二步:在android的生成目录/out/target/product/imx53_loco/system下新建目录busybox,并将
第一步生成的busybox以及所有链接文件全拷贝到该目录;


第三步:修改/out/target/product/imx53_loco/root/init.rc文件,
export PATH /sbin:/system/sbin:/system/bin:/system/xbin:/system/busybox
上面添加了busybox的声明路径。


第四步:重新编译生成映像文件,更新uramdisk.img,system.img两个文件,注意init.rc文件存放在uramdisk.img
中,因此必须更新!


第五步:重启开发板,这时应该能使用busybox了,只不过需要在前面添加busybox指令。如:
busybox cp
但是使用ls命令时,仍然排列很不规范,明显是toolbox的杰作。使用busybox ls就没有问题了,但是每次都需要
加busybox,很不方便,直接将/system/bin下的ls删掉,再使用ls指令,就不会有问题了。类似其他的指令也可以
使用相同的方法。注意造成不要破坏toolbox。


第六步:尽管这时已能使用busybox,但是命令行的提示符仍然只有一个#号,而且命令不具备补全功能,因为这时我们使用
的仍然是android的脚本。执行以下命令:
busybox sh
再试试,功能补全功能已经正常,而且提示符前面不再单单一个#号,而是所在路径了。不过,这时am指令已经无法使用了,
要知道am指令在android上起着非常大的作用。当需要使用am指令时,我们只需要执行下/system/bin的sh即可,执行完
之后,再使用busybox sh命令切换到busybox的shell,二者互不影响。

更多相关文章

  1. Android轮播图的实现
  2. Android(安卓)Studio官方文档之添加多种密度的矢量图形
  3. Android下的数据储存方式( 二)
  4. Android调用so文件(C代码库)方法详解
  5. Android应用程序“.R文件”消失怎么办
  6. android 文件夹的命名和作用,屏幕适配很有用!
  7. android之ListPreference的用法_PreferenceActivity用法
  8. Android(安卓)AIDL介绍
  9. Android(安卓)Fragment 解析

随机推荐

  1. Android开发周报:Android(安卓)Studio2.0
  2. java获取页面输入的值
  3. EditText 的setKeyListener()方法的用法
  4. Android(安卓)JNI 学习笔记
  5. 电脑导出文件到手机 adb push
  6. Android(安卓)使用NDK R5开发JNI应用详解
  7. Android(安卓)Studio基础:USB联调App
  8. SAX解析 android sdk与jdk 有点区别
  9. Handler部分原理
  10. JavaOne 2009 - Day 0