Chinaunix首页 | 论坛 | 博客
  • 博客访问: 166017
  • 博文数量: 47
  • 博客积分: 1032
  • 博客等级: 少尉
  • 技术积分: 759
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-19 15:47
文章分类
文章存档

2012年(26)

2011年(21)

分类: 嵌入式

2011-12-13 15:13:19

busybox是一个集成了一百多个最常用linux命令和工具的软件,集成了一个http服务器和一个telnet服务器,Android系 统中自带的toolbox工具(/system/bin)比较简单,对于一些命令如find等支持的不好,可以Android系统中加入busybox,就可以使用常见的Linux命令,同时通过busybox可以定制Android的根文件系统。

具体步骤:

1)下载busybox源码,我用的版本是busybox-1.16.0

2)下载交叉编译工具并配置环境变量,这里要注意版本的选择问题:

我开始使用的是arm-linux-gcc-3.4.1和arm-linux-tools-20061213,编译成功后发现将busybox加入到Android系统,在Android终端内对busybox无法操作,提示busybox命令不合法,查阅相关资料发现可能是交叉编译工具的选择有问题,Android内核支持EABI,所以需要重新下载交叉编译工具arm-2007q3-51-arm-none-linux-gnueabi-i686-pc-linux-gnu,这个版本是基于EABI的,增加了对浮点运算等方面的支持。

3)编译busybox,在busybox目录下执行make menuconfig命令对编译过程进行配置. 过程如下:

     Busybox Settings -> Build Options ->         [*] Build BusyBox as a static binary (no shared libs) 这个要选上,因上这样子编译出来的busyBox才是可以独立运行的。         (/home/weiwei/embedded/arm-2007q3/bin/arm-none-linux-gnueabi-) Cross Compiler prefex 这是交叉编译器的"路径+前缀",要根据具体的情况来设置。         Busybox Settings -> Installation Options->         [*] Dont use /usr        这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。

执行make ,期间可能会报错,根据编译的错误不同可以在menuconfig中对相应的内容进行设置,比如我编译的时候会报错显示:

make error route.o * 1

可以进入menuconfig 设置

 Networking Utilities  --->    关闭 编译route 的选项

make 结束后,会生成busybox的可执行文件。

3)制作新的ramdisk.img

ramdisk.img中存放了Android的根文件系统,为了在Android终端中使用busybox工具而不要每次配置环境变量,需要对Android根文件系统下的启动脚本init.rc进行改写,将busybox的存放路径放入全局环境变量中。

由于Android模拟器系统每次启动时都会自动加载ramdisk.img作为根文件系统,加载system.img和userdata.img作为主文件系统和用户数据文件系统,所以更改了启动脚本后,需要重新对ramdisk.img打包,生成新的根文件映像。

具体步骤如下:

ramdisk.img复制到其他目录,名称改为ramdisk.img.gz,解压到当前目录  gunzip ramdisk.img.gz     新建文件夹ramdisk,进入该文件夹  执行 cpio -i -F ../ramdisk.img  此时在ramdisk文件夹下可以看到从ramdisk.img中解包出来的根文件系统目录和相关内容  修改init.rc的相关内容  # setup the global environment      export PATH /data/busybox/bin:/sbin:/system/sbin:/system/bin:/system/xbin      export LD_LIBRARY_PATH /system/lib      export ANDROID_BOOTLOGO 1      export ANDROID_ROOT /system      export ANDROID_ASSETS /system/app      export ANDROID_DATA /data      export EXTERNAL_STORAGE /sdcard      export BOOTCLASSPATH /system/framework/core.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/android.policy.jar:/system/framework/services.jar      export HOME /  这里在PATH中添加了busyboxAndroid下的存放路径data/busybox/bin,同时增加变量HOME作为测试,看启动脚本是否成功修改。    重新生成新的映像  执行 cpio --i -t -F ../ramdisk.img > list      cpio -o -H newc -O rd_busybox.img < list  现在可以看到生成了新的映像rd_busybox.img    用模拟器挂载新的映像  执行 emulator -ramdisk rd_busybox.img @weiAVD01 & 其中-ramdisk参数表示指定映像文件,后面是模拟器的名称

4)启动模拟器后,装载busybox到Android中去

执行 adb push busybox /data/busybox/bin  busybox安装目录下将busybox可执行文件加入到Android系统的data/busybox/bin    adb shell   进入Android终端    cd data/busybox/bin  ls -l   -rwxrwxrwx root     root      1809684 2010-03-17 00:44 busybox  发现busybox已经放在该目录下    更改busybox权限为可执行  chmod 777 busybox    执行busybox,可以查看版本信息和相关的命令  # busybox  BusyBox v1.16.0 (2010-03-17 00:42:04 CST) multi-call binary.  Copyright (C) 1998-2009 Erik Andersen, Rob Landley, Denys Vlasenko  and others. Licensed under GPLv2.  See source distribution for full notice.  .......... 省略相关内容    可以查看启动脚本的环境变量是否被修改了  执行 export   # export  ANDROID_ASSETS  ANDROID_BOOTLOGO  ANDROID_DATA  ANDROID_PROPERTY_WORKSPACE  ANDROID_ROOT  BOOTCLASSPATH  EXTERNAL_STORAGE  HOME  LD_LIBRARY_PATH  PATH  PWD  发现测试的HOME变量已经存在

现在可以使用busybox的相关命令和功能了

例如 进入根目录下查找init.rc文件

# busybox find . -name init.rc  ./init.rc

存在问题:不能执行./busybox --install -s 命令安装常见的命令,因为Android系统中的的根目录和/sbin目录权限是只读的

对于如何利用busybox定制Android的文件系统,还需要进一步的研究
阅读(2627) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~