Android Q版本中,许多Linux命令以及Android自带的命令并不是都有自身的二进制文件存在/system/bin/目录下,而是集成在toybox这个二进制文件中,通过toybox来执行对应的命令;可以看到下面的命令很多都是软链接到toybox上。
lrwxr-xr-x 1 root shell 6 2009-01-01 08:00 ln -> toybox
lrwxr-xr-x 1 root shell 6 2009-01-01 08:00 load_policy -> toybox
lrwxr-xr-x 1 root shell 6 2009-01-01 08:00 log -> toybox
在该工具对应源码下的README中,首行就是其用途的介绍,是一个集成多个Linux命令行的工具。
Toybox: all-in-one Linux command line. //多合一Linux命令行。
源码在AOSP中的此目录下。
android/external/toybox/
接下来简单介绍下toybox是如何调起其他命令来执行的。首先看下对应的Android.bp文件,看下是如何编译的,需要什么依赖。
cc_binary {
name: "toybox",
defaults: ["toybox-defaults"],
host_supported: true,
recovery_available: true,
shared_libs: toybox_libraries,
target: {
darwin: {
enabled: false,
},
},
}
从中可以看到依赖toybox-defaults,而这个依赖是在bp文件的开头,由于篇幅过长,这里不再列举,我们从这边看起只是为了找到入口函数,其依赖中有main.c文件,并且有main函数,所以从这里面看起。
int main(int argc, char *argv[])
{
if (!*argv) return 127;
else {
int stack;
toys.stacktop = &stack;
}
if (CFG_TOYBOX_ON_ANDROID) signal(SIGPIPE, SIG_DFL);
if (!CFG_TOYBOX_FORK) {
if (0x80 & **argv) {
**argv &= 0x7f