Android Toybox简述

本文简要介绍了Android Q中的Toybox,它是一个集成多种Linux命令行工具的二进制文件。通过toybox,系统可以执行各种命令,而这些命令在/toys列表中通过二分查找定位并由相应的函数指针调用执行。Toybox的main函数处理参数,然后调用toybox_main()执行命令,其核心在于通过toy_exec_which找到并执行特定命令的入口函数,如df的df_main。整个过程简单高效,实现了命令的统一管理和执行。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值