折腾了几天,被Android那点儿少得可怜的shell命令折磨的死去活来,终于下定了革命的决心。看一下怎么把渺小的toolbox替换成伟大的busybox吧。先大致描述一下Android系统中的shell程序部分。

shell实现分为两部分:

一、shell解释器和内置命令

源码位于system/core/sh目录下,主要完成shell命令的解释查找,对于builtins.c中包含的内置命令,直接执行,对于toolbox的扩展命令,间接调用toolbox程序完成。

二、toolbox扩展命令

主要完成扩展命令的执行,每一个扩展命令对应一个name_main函数,如ls命令,对应ls_main函数。同时,每一个扩展命令都由一个system/core/toolbox/目录下面的.c文件实现。toolbox.c会根据这个目录下面的.c文件生成tools.h头文件,并在system/core/toolbox/Android.mk文件中为每个命令生成指向toolbox的连接。toolbox的实现结构使它扩展一个命令很容易。

假设现在我们自己想手工添加一个shell命令mycommand,只要在system/core/toolbox/目录下面新建一个mycommand.c文件,并在里面实现一个mycommand_main函数,然后在system/core/toolbox/Android.mk中添加mycommand.c即可。Android.mk会自动把它编译进toolbox程序,并在编译生成的Android系统/system/bin目录下为这个命令生成一个指向toolbox的连接。

接下来翻译一下网上的一篇文章,借助它,可以把Android自带的toolbox替换成busybox。

Installing Busybox command line tools

英文原文地址:

https://gforge.ti.com/gf/project/omapandroid/wiki/?pagename=Installing+Busybox+command+line+tools

在Android系统中安装busybox命令行工具

本文简单地介绍了怎么把busybox安装到Android的文件系统中去。如果你想直接安装,可以从下面的地址下载我已经预编译好并在Android2.1系统上试验成功的busybox,然后直接跳过下面的安装步骤。

http://download.csdn.net/source/3093680

一、编译busybox

1、下载busybox的最新版本,本文写作时最新版本是1.13.3。

下载地址:http://www.busybox.net/

2、解压源码:

tar jxf busybox-1.13.3.tar.bz2

3、运行menuconfig对busybox进行配置

cd busybox-1.13.3/

make menuconfig

4、在menuconfig中设置以下选项

Busybox Settings --> Build Options --> Build Busybox as a static binary (no shared libs) - Enable this option by pressing "Y"

Busybox Settings --> Build Options --> Cross compiler prefix - Set this option equal to "arm-none-linux-gnueabi-"

Busybox Settings --> Installation Options --> Don't use /usr - Enable this option by pressing "Y"

5、把交叉编译器的地址导入到环境变量:

export PATH=/opt/arm/arm-2007q3/bin:$PATH

6、编译busybox

make

二、安装busybox

把busybox安装到Android系统中去,做这几步:

1、在Android系统根目录下创建一个/bin目录。

mkdir /<path-to-android-fs>/bin

2、把编译出来的busybox复制到/bin目录下

cp busybox /<path-to-android-fs>/bin

3、把busybox安装到Android机器中

cd /bin

./busybox --install

三、把busybox作为默认shell

需要像下面这样编辑一下init.rc

1、编辑console服务,让它默认运行busybox

service console /system/bin/sh -> service console /bin/sh

2、把busybox路径加入到环境变量中

export PATH /sbin:/system/sbin:/system/bin:/system/xbin --> export PATH /bin:/sbin:/system/sbin:/system/bin:/system/xbin

注:

我使用busybox时,只是想简单地增加一些命令,把toolbox一些功能不是很全的命令替换掉,所以操作上没有上面说的那么复杂。下面是我的替代方案,可以试一下:

1、把busybox复制到/system/bin目录下。

adb push busybox /system/bin

2、把要添加的命令通过ln建立到busybox的连接。

比如,Android自带的toolbox是没有test这个命令的。我们要添加test命令就可以:

cd /system/bin

ln -s busybox test

这样,用户通过机器上的shell执行test命令时,就会调用busybox中实现test功能的applet。

对于一些原有的命令,如ls、chown等,如果不想用toolbox,也可以把它们的连接目标指向toolbox,拿chown来举例。

cd /system/bin

rm chown

ln -s busybox chown

这样做,最大的好处就是保证对系统的改动最少,又可以最大限度的扩展shell功能。

参考文档:

为Android加入busybox工具

http://blog.csdn.net/liaoshengjiong/archive/2009/03/04/3957725.aspx

什么是交叉编译

http://www.linuxeden.com/doc/article.php/21264

加入 busybox source

http://cwhuang.info/2010/03/ad-busybox-source

更多相关文章

  1. GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
  2. 如何在后台运行Linux命令?
  3. 一款常用的 Squid 日志分析工具
  4. No.11 使用firewall配置的防火墙策略的生效模式
  5. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  6. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  7. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  8. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  9. Android(安卓)系统 root 破解原理分析

随机推荐

  1. Android(安卓)N(SDK7.0)新特性
  2. android 保持屏幕长亮及解锁的方法
  3. android使用Intent操作拨打电话和发送短
  4. Android(安卓)Studio gradle插件版本和gr
  5. EXOPlayer居中播放,类似ImageView的CENTER
  6. android 获取进程名字
  7. android按钮main.xm_基础篇
  8. Android之checkbox使用
  9. test
  10. Android WebView图片显示问题