Android系统中toybox/busybox使用

在Android系统中使用toybox
Views: 507
2 0
Read Time:2 Minute, 6 Second

我们已经知道Android系统基于Linux,很多Linux命令如pwd/cd/ifconfig等都可以在Android中使用。不过我们仔细观察就会发现两者的差异,比如针对pwd命令,我们在Ubuntu 20中的/usr/bin目录下可以找到它:

btcd@btcd-OptiPlex-7090:/usr/bin$ ls -la | grep pwd
-rwxr-xr-x  1 root   root       43352 9月   5  2019 pwd
-rwxr-xr-x  1 root   root       14568 9月   9  2021 pwdx

但是在Android系统中,所有的可执行command都位于/system/bin目录下,事实上我关注到在/vendor/bin内也有相应的cmd命令存在。但不管是/system/bin 还是/vendor/bin,我们查看pwd命令的信息,我们会观察到如下内容:

trout_x86:/system/bin # ls -lah pwd
lrwxr-xr-x 1 root shell 6 2009-01-01 00:00 pwd -> toybox
trout_x86:/system/bin #

是的,我们可以清晰地看到,在/system/bin中pwd属于一个软链接,而该软链接指向了toybox,在/vendor/bin中也类似,不过指向的是toybox_vendor。这说明这些命令都是通过toybox来执行的,我们可以统计一下有多少命令是通过toybox来实现的:

trout_x86:/system/bin # ls -la | grep toybox | wc -l                                                                                                                                                       
175
trout_x86:/system/bin #

这说明在Android12中,除去toybox命令本身,共有174个命令通过toybox执行。那么具体有哪些命令是通过toybox进行支持的呢,我们运行toybox命令,可以看到其详细的命令列表:

trout_x86:/system/bin # toybox
[ acpi base64 basename blkdiscard blkid blockdev cal cat chattr chcon chgrp chmod chown chroot chrt cksum clear cmp comm cp cpio cut date dd devmem df diff dirname dmesg dos2unix du echo egrep
env expand expr fallocate false fgrep file find flock fmt free freeramdisk fsfreeze fsync getconf getenforce getfattr getopt grep groups gunzip gzip head help hostname hwclock i2cdetect i2cdump
i2cget i2cset iconv id ifconfig inotifyd insmod install ionice iorenice iotop kill killall ln load_policy log logname losetup ls lsattr lsmod lsof lspci lsusb makedevs md5sum microcom mkdir
mkfifo mknod mkswap mktemp modinfo modprobe more mount mountpoint mv nbd-client nc netcat netstat nice nl nohup nproc nsenter od partprobe paste patch pgrep pidof ping ping6 pivot_root pkill
pmap printenv printf prlimit ps pwd pwdx readelf readlink realpath renice restorecon rev rfkill rm rmdir rmmod rtcwake runcon sed sendevent seq setenforce setfattr setsid sha1sum sha224sum sha256sum
sha384sum sha512sum sleep sort split stat strings stty swapoff swapon sync sysctl tac tail tar taskset tee test time timeout top touch tr traceroute traceroute6 true truncate tty tunctl ulimit
umount uname uniq unix2dos unlink unshare uptime usleep uudecode uuencode uuidgen vconfig vi vmstat watch wc which whoami xargs xxd yes zcat 
trout_x86:/system/bin #

这里可以提一点,如果我们要在安卓里使用vi怎么办呢,如果我们直接使用vi命令来编辑文件,我们大概会得到如下错误提示:

trout_x86:/system/etc/automotive/evs # vi con
config.json           config_override.json
trout_x86:/system/etc/automotive/evs # vi config.json                                                                                                                                                      
/system/bin/sh: vi: inaccessible or not found
127|trout_x86:/system/etc/automotive/evs # 

那么正确的用法其实是是通过toybox,通过toybox来使用vi编辑文本内容应该使用如下命令:

trout_x86:toybox vi config.json

toybox本身不属于Google官方维护的内容,其官方仓库托管于Github。但是我们可以在AOSP的源码中找到相关的源码,其位于/external/toybox目录内。此时我们可以通过mmm命令来手动编译可以直接在Android环境内运行的binary。如果我们没有AOSP的源码环境,我们也可以基于官方仓库的指导结合NDK环境交叉编译来获得可以分发的binary。

除了toybox,我们还可以使用busybox,busybox也被称之为“瑞士军刀”。事实上在很多嵌入式Linux系统中,许多命令都由buysbox提供。而在早期的Android中,也是集成的busybox而非toybox。关于busybox与toybox的差别,这里简单列举如下:

1.License许可差异:busybox基于GPL许可,而toybox基于BSD许可。

2.相对于busybox,toybox体积更小,效率更高,但相对的支持的命令也会少一些

3.toybox聚焦于POSIX-2008 and LSB 4.1,对于GNU标准及其拓展则缺少兼容性

如果我们想在Android系统中使用busybox,我们可以通过这个链接下载对应架构的busybox程序:https://busybox.net/source.html,将其推入Android系统进行使用。

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %
FranzKafka95
FranzKafka95

极客,文学爱好者。如果你也喜欢我,那你大可不必害羞。

文章: 83

留下评论

您的电子邮箱地址不会被公开。 必填项已用*标注

zh_CNCN