初识Android下的busybox与toolbox

2020-03-25

关键字:



原来 Android 中的 busybox 与 toolbox 是两套程序。

busybox 是一个嵌入式领域常用的软件。它是一个命令集工具,像传统的PC端的Linux系统上的大多数命令的实现都被封装在 busybox 程序中。在嵌入式平台上就可以将这些命令以参数的形式传递给 busybox 工具集,进而实现相应的功能。

那为什么嵌入式平台不能直接像PC端那样,直接将各个命令所对应的程序预置在板端,而非要包装在一个 busybox 中呢?其最主要的原因还是因为这些命令所对应的程序加起来太过庞大,嵌入式平台的存储资源通常是比较有限的,为了节约存储空间,就将这些命令集合在一个程序中。那集合以后的程序又凭什么能比PC端那种分散开来的形式体积要小呢?一个主要的原因是因为这些命令中,有不少命令的实现都是相同的。busybox 就将这些相同的部分提取出来让多个命令共用。如此一来随着命令数量的增多,就能比较大程度地缩减程序体积了。

Android平台是基于嵌入式Linux的。通过串口或者 adb shell 可以像在嵌入式Linux平台上那样敲击命令以实现某些目的。

Android平台的命令系统一般而言可以认为分为两类:

1、busybox 实现的命令系统

2、toolbox 实现的命令系统

toolbox 命令系统是Android平台默认的命令系统。

例如,我们可以像在PC端的Linux系统shell上那样直接敲击常见Linux命令:

[email protected]:/ # ll
drwxr-xr-x root     root              1970-01-01 08:00 acct
drwxrwx--- system   cache             1970-01-01 16:00 cache
-rwxr-x--- root     root       264120 1970-01-01 08:00 charger
dr-x------ root     root              1970-01-01 08:00 config

[email protected]:/ # pwd
/
[email protected]:/ # cd
[email protected]:/data #
[email protected]:/data # grep -nr "yes" /system/bin/
Binary file /system/bin/busybox matches
Binary file /system/bin/cat matches
Binary file /system/bin/chcon matches

这里的每一条命令,其实都对应着一个应用程序,它们位于 /system/bin 目录下:

[email protected]:/ # ll /system/bin/
lrwxr-xr-x root     shell             2020-03-21 18:10 cat -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:10 chcon -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:10 chmod -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:10 chown -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 clear -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 cmp -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 cp -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 date -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 dd -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 df -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 dmesg -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 du -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 getenforce -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 getevent -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 getprop -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 getsebool -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 grep -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 hd -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 id -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 ifconfig -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 iftop -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 insmod -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 ioctl -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 ionice -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 kill -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 ln -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 load_policy -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 log -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 ls -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 lsmod -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 lsof -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 md5 -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 mkdir -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 mkswap -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 mount -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 mv -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 nandread -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 netstat -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 newfs_msdos -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 notify -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 printenv -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 ps -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 r -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 readlink -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 renice -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 restorecon -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 rm -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 rmdir -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 rmmod -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 route -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 runcon -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 schedtop -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 sendevent -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 setconsole -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 setenforce -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 setprop -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 setsebool -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 sleep -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 smd -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 start -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 stop -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 swapoff -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 swapon -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 sync -> toolbox
-rwxr-xr-x root     root       139048 2020-03-25 22:18 toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 top -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 touch -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 umount -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 uptime -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 vmstat -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 watchprops -> toolbox
lrwxr-xr-x root     shell             2020-03-21 18:05 wipe -> toolbox

只是每一条命令都只是 /system/bin/toolbox 程序的“影分身”而已。

由此可见,这个 Android 平台的 toolbox 与嵌入式Linux平台下的 busybox 一样,是一个命令工具集。我们在串口控制台或 adb shell 上敲命令的时候其实就是在执行这些程序。而这些程序又由于是 toolbox 的分身,就会将这些程序名称,也即命令内容作为程序启动参数传递给 toolbox 的 main(int argc, char **argv) 函数,随后 toolbox 再根据不同的命令执行不一样的动作。

toolbox 的源码位于Android工程源码的以下目录:

./system/core/toolbox

toolbox 程序的入口函数位于 toolbox.c 中:

这份源码本质上并不复杂,有兴趣的同学可以自行去研究研究。同样的,如果你有特殊需求,也完全可以在这里添加自己的命令程序。

busybox 一般来说都是直接预置可执行程序在Android系统源码中的,并不像 toolbox 那样会有源代码。

不过 busybox 有官方网站,上面刊载了各版本的源码与文档等资料:

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

在 Android 中,busybox 并不像 toolbox 那样将各命令都以软链接的形式释放出来。

如果想使用 busybox 的命令系统,则必须将命令以启动参数的形式传递给 busybox 程序:

busybox ls -al
busybox pwd
busybox find -name "*.apk"

我们也可以通过下面这条命令列出 busybox 支持的所有命令:

busybox --list

busybox 命令系统与 toolbox 命令系统在表现形式上可能是不一样的,例如,同样是 ls -al 命令,二者所列举的信息却是有所不同的:

[email protected]:/sdcard # ls -al
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 .android_secure
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 Alarms
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 DCIM
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 Download
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 LOST.DIR
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 Movies
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 Music
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 Notifications
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 Pictures
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 Podcasts
drwxrwxr-x system   sdcard_rw          1980-01-01 00:00 Ringtones
[email protected]:/sdcard #
[email protected]:/sdcard # busybox ls -al
total 96
drwxrwxr-x   13 system   sdcard_r      8192 Jan  1 08:00 .
drwxrwxr-x    9 root     system           0 Jan  1 08:00 ..
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 .android_secure
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 Alarms
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 DCIM
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 Download
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 LOST.DIR
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 Movies
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 Music
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 Notifications
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 Pictures
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 Podcasts
drwxrwxr-x    2 system   sdcard_r      8192 Jan  1  1980 Ringtones

因此,如果我们发现某个命令不太能符合需求,则可以尝试一下使用另一套命令系统。同时,两套命令系统所包含的命令也会有差异。如,toolbox 就不包含 find 命令,而 busybox 却支持 find 命令。

最后再额外提一点:在Android平台,无论是串口控制台还是adb的shell,其本质都是在一个登录了的shell程序中运行。就像PC端Linux的 shell 机制一样。Android平台上默认的shell程序是 /system/bin/sh 程序。在 init.rc 中可以发现串口控制台其实就是一个 /system/bin/sh 程序的别名:

而 adb 的 shell 就更不用说了。



初识Android下的busybox与toolbox

原文地址:https://www.cnblogs.com/chorm590/p/12562588.html

时间: 2024-10-13 15:21:32

初识Android下的busybox与toolbox的相关文章

初识 Android

创建博客有一年的时间了,一直没把它用起来,颇感惭愧.近日突感有写博客的冲动,更可怕的是这种冲动似乎比我体内的洪荒之力更为凶猛.于是乎,这篇博客悄然诞生.废话不多说,进入正题--初识Android. 这篇博客从最基本的知识讲起 .. View(视窗):View分很多种,展示文字的TextView.展示图片的ImageView.显示按钮的Button 等等(内容太多了,不一一列举了). Layout(布局): 由屏幕上所有View组成.分为LinearLayout(线性布局)和RelativeLay

Android手机添加BusyBox&超级终端打造linux工具箱

在Android下可以添加BusyBox&超级终端打造一个linux工具箱环境 可以执行很多linux下的命令方便调试.测试应用 1.手机需要Root 2.现在安装BusyBox 与 超级终端 APK 程序(下载地址:http://pan.baidu.com/s/1o60rL4Q) 3.打开安装好的“终端模拟器",这是个DOS命令行输入窗口,在这个窗口里就可以输入 BusyBox pro”工具中的命令.首次打开“终端模拟器"窗口使用先输入"su"得到手机的R

Android下将图片载入到内存中

Android的系统的标准默认每一个应用程序分配的内存是16M.所以来说是很宝贵的,在创建应用的时候要尽可能的去节省内存,可是在载入一些大的文件的时候,比方图片是相当耗内存的,一个1.3M的图片,分辨率是2560X1920(宽X高)图片当载入到手机内存的时候就会请求19M的一块内存,这是远远超出了系统自带的内存空间,这时候应用程序就会挂掉,所以我们要进行图片的缩放处理,以下我就来带大家创建一个用来图片缩放的应用: 应用效果图例如以下: 核心代码的实现: package com.examp.loa

fiddler Android下https抓包全攻略

fiddler Android下https抓包全攻略 fiddler的http.https的抓包功能非常强大,可非常便捷得对包进行断点跟踪和回放,但是普通的配置对于像招商银行.支付宝.陌陌这样的APP是抓不到包的,需要一些特殊的配置,本文把fiddler Android下https抓包的详细配置都罗列出来,供大家参考. 一.普通https抓包设置 先对Fiddler进行设置: 勾选“CaptureHTTPS CONNECTs”,接着勾选“Decrypt HTTPS traffic”.同时,由于我

Android下pm 命令详解

Sam在看相关PackageManager代码时,无意中发现Android 下提供一个pm命令,通常放在/system/bin/下.这个命令与Package有关,且非常实用.所以研究之.0. Usage: usage: pm [list|path|install|uninstall] pm list packages [-f] pm list permission-groups pm list permissions [-g] [-f] [-d] [-u] [GROUP] pm list ins

android下的单元测试

android下的单元测试 在AndroidManifest.xml文件中配置以下信息: 在manifest节点下添加: <!-- 指定测试信息和要测试的包 --> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.jxn.junittest" /> 在application节点下添加: <!

cocos搭建android下的开发环境

没想到cocos3.2也出现了一点bug,还要经过一周晚上的努力,全部搞定.可以在android下使用啦 上个截图庆祝下 有需要的可以看http://item.taobao.com/item.htm?id=40745006457 cocos搭建android下的开发环境,布布扣,bubuko.com

Android下EditText的hint的一种显示效果------FloatLabelLayout

效果: 此为EditText的一种细节,平时可能用的不多,但是用户体验蛮好的,特别是当注册页面的项目很多的时候,加上这种效果,体验更好 仅以此记录,仅供学习参考. 参考地址:https://gist.github.com/chrisbanes/11247418 采用的是Android 3.0的动画,所以有版本限制,可以用  nineoldandroids  做向下兼容 ,当然上面的网址也给了另一种方式做向下兼容. demo地址:http://download.csdn.net/detail/ab

初识android中的动画

动画效果可以大大提高界面的交互效果,因此,动画在移动开发中的应用场景较为普遍.掌握基本的动画效果在成熟的软件开发中不可或缺.除此之外,用户对于动画的接受程度远高于文字和图片,利用动画效果可以加深用户对于产品的印象.因此本文给出安卓设计中几种常见的动画效果. 基础知识 在介绍安卓中的动画效果之前,有必要介绍一下安卓中的图片处理机制.图片的特效包括图形的缩放.镜面.倒影.旋转.平移等.图片的特效处理方式是将原图的图形矩阵乘以一个特效矩阵,形成一个新的图形矩阵来实现的.矩阵Matrix 类,维护了一个