当前位置: 首页 > article >正文

[Android]init中添加新的command

在Android的init进程中,command是用于定义启动时要执行的具体命令行指令的关键部分。init进程是Android系统启动的第一个进程,它负责初始化系统的各个组件,并启动必要的服务。command可以在init.rc文件及其包含的其他.rc文件中找到,通常作为on操作块或service定义的一部分。

1. command的基本概念

command是一条或多条具体的命令行指令,它们在特定条件下由init进程执行。这些命令可以用来创建目录、设置权限、启动服务、写入系统属性等。每个命令必须以空格分隔,并且在同一行上执行。如果需要多行命令,可以使用反斜杠(\)进行换行。

2. 常见的command类型

以下是一些常见的command及其用途:

2.1 创建和管理文件系统
  • mkdir <path> [mode] [user] [group]:创建一个目录,并设置其权限、用户和组。

     rc 

    深色版本

    mkdir /data/myapp 0755 root root
  • chmod <mode> <path>:更改文件或目录的权限。

     rc 

    深色版本

    chmod 0755 /data/myapp
  • chown <user>:<group> <path>:更改文件或目录的所有者和组。

     rc 

    深色版本

    chown system:system /data/myapp
  • mount <type> <device> <dir> [flags]:挂载文件系统。

     rc 

    深色版本

    mount ext4 /dev/block/mmcblk0p1 /data
  • umount <dir>:卸载文件系统。

     rc 

    深色版本

    umount /data
2.2 设置环境变量和系统属性
  • export <variable> [value]:设置环境变量。

     rc 

    深色版本

    export PATH=/system/bin:$PATH
  • write <path> <text>:将文本写入文件。

     rc 

    深色版本

    write /sys/class/leds/led1/brightness 1
  • setprop <property> <value>:设置系统属性。

     rc 

    深色版本

    setprop sys.boot_completed 1
  • getprop <property>:获取系统属性的值(通常用于条件判断)。

     rc 

    深色版本

    on property:getprop(sys.boot_completed)=1
        start myservice
2.3 启动和管理服务
  • start <service>:启动指定的服务。

     rc 

    深色版本

    start adbd
  • stop <service>:停止指定的服务。

     rc 

    深色版本

    stop adbd
  • restart <service>:重启指定的服务。

     rc 

    深色版本

    restart adbd
  • class_start <class>:启动属于指定类的所有服务。

     rc 

    深色版本

    class_start main
  • class_stop <class>:停止属于指定类的所有服务。

     rc 

    深色版本

    class_stop main
2.4 日志和调试
  • log <message>:将消息写入系统日志。

     rc 

    深色版本

    log "Starting my custom service"
  • exec <command> [args...]:执行外部命令,并等待其完成。

     rc 

    深色版本

    exec -- /system/bin/log -t "myapp" "Custom initialization completed"
2.5 其他命令
  • trigger <event>:触发自定义事件。

     rc 

    深色版本

    trigger custom_event
  • wait <path> [timeout]:等待指定路径存在,直到超时。

     rc 

    深色版本

    wait /dev/block/mmcblk0p1 10
  • symlink <target> <link>:创建符号链接。

     rc 

    深色版本

    symlink /data/myapp /mnt/myapp
  • insmod <module> [args...]:加载内核模块。

     rc 

    深色版本

    insmod /system/lib/modules/wlan.ko
  • rm <path>:删除文件或目录。

     rc 

    深色版本

    rm /data/myapp/tmp/*
  • rmdir <path>:删除空目录。

     rc 

    深色版本

    rmdir /data/myapp/tmp

3. 怎样添加新的命令command

查看command定义的地方,

system/core/init/builtins.cpp


1029// Builtin-function-map start
1030const BuiltinFunctionMap::Map& BuiltinFunctionMap::map() const {
1031    constexpr std::size_t kMax = std::numeric_limits<std::size_t>::max();
1032    // clang-format off
1033    static const Map builtin_functions = {
1034        {"bootchart",               {1,     1,    {false,  do_bootchart}}},
1035        {"chmod",                   {2,     2,    {true,   do_chmod}}},
1036        {"chown",                   {2,     3,    {true,   do_chown}}},
1037        {"class_reset",             {1,     1,    {false,  do_class_reset}}},
1038        {"class_restart",           {1,     1,    {false,  do_class_restart}}},
1039        {"class_start",             {1,     1,    {false,  do_class_start}}},
1040        {"class_stop",              {1,     1,    {false,  do_class_stop}}},
1041        {"copy",                    {2,     2,    {true,   do_copy}}},
1042        {"domainname",              {1,     1,    {true,   do_domainname}}},
1043        {"enable",                  {1,     1,    {false,  do_enable}}},
1044        {"exec",                    {1,     kMax, {false,  do_exec}}},
1045        {"exec_background",         {1,     kMax, {false,  do_exec_background}}},
1046        {"exec_start",              {1,     1,    {false,  do_exec_start}}},
1047        {"export",                  {2,     2,    {false,  do_export}}},
1048        {"hostname",                {1,     1,    {true,   do_hostname}}},
1049        {"ifup",                    {1,     1,    {true,   do_ifup}}},
1050        {"init_user0",              {0,     0,    {false,  do_init_user0}}},
1051        {"insmod",                  {1,     kMax, {true,   do_insmod}}},
1052        {"installkey",              {1,     1,    {false,  do_installkey}}},
1053        {"load_persist_props",      {0,     0,    {false,  do_load_persist_props}}},
1054        {"load_system_props",       {0,     0,    {false,  do_load_system_props}}},
1055        {"loglevel",                {1,     1,    {false,  do_loglevel}}},
1056        {"mkdir",                   {1,     4,    {true,   do_mkdir}}},
1057        // TODO: Do mount operations in vendor_init.
1058        // mount_all is currently too complex to run in vendor_init as it queues action triggers,
1059        // imports rc scripts, etc.  It should be simplified and run in vendor_init context.
1060        // mount and umount are run in the same context as mount_all for symmetry.
1061        {"mount_all",               {1,     kMax, {false,  do_mount_all}}},
1062        {"mount",                   {3,     kMax, {false,  do_mount}}},
1063        {"umount",                  {1,     1,    {false,  do_umount}}},
1064        {"readahead",               {1,     2,    {true,   do_readahead}}},
1065        {"restart",                 {1,     1,    {false,  do_restart}}},
1066        {"restorecon",              {1,     kMax, {true,   do_restorecon}}},
1067        {"restorecon_recursive",    {1,     kMax, {true,   do_restorecon_recursive}}},
1068        {"rm",                      {1,     1,    {true,   do_rm}}},
1069        {"rmdir",                   {1,     1,    {true,   do_rmdir}}},
1070        {"setprop",                 {2,     2,    {true,   do_setprop}}},
1071        {"setrlimit",               {3,     3,    {false,  do_setrlimit}}},
1072        {"start",                   {1,     1,    {false,  do_start}}},
1073        {"stop",                    {1,     1,    {false,  do_stop}}},
1074        {"swapon_all",              {1,     1,    {false,  do_swapon_all}}},
1075        {"symlink",                 {2,     2,    {true,   do_symlink}}},
1076        {"sysclktz",                {1,     1,    {false,  do_sysclktz}}},
1077        {"trigger",                 {1,     1,    {false,  do_trigger}}},
1078        {"verity_load_state",       {0,     0,    {false,  do_verity_load_state}}},
1079        {"verity_update_state",     {0,     0,    {false,  do_verity_update_state}}},
1080        {"wait",                    {1,     2,    {true,   do_wait}}},
1081        {"wait_for_prop",           {2,     2,    {false,  do_wait_for_prop}}},
1082        {"write",                   {2,     2,    {true,   do_write}}},
1083    };
1084    // clang-format on
1085    return builtin_functions;
1086}

参考这里的实现,在这里添加命令,并进行相关的实现即可

4. 其他方法

添加命令笔记麻烦,可以在init.rc里调用程序或者脚本文件来实现类似的功能,

参考

init.rc 启动 shell 脚本 开机执行脚本 init.rc执行shell脚本_init.rc执行sh脚本内容需要权限吗-CSDN博客

android 系统rc添加 shell运行脚本_android13 在rc文件中执行脚本-CSDN博客

init execute_no_trans avc报错-CSDN博客


http://www.kler.cn/a/455930.html

相关文章:

  • 基于 Ragflow 搭建知识库-初步实践
  • 0039__屏幕帧缓冲机制
  • C语言简单测试总结
  • 【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity
  • UE(虚幻)学习(三) UnrealSharp插件中调用非托管DLL
  • 电子电气架构 --- 什么是自动驾驶技术中的域控制单元(DCU)?
  • 高中数学刷题版:函数奇偶性[干货]
  • GaussDB典型SQL调优点之自诊断和语句下推调优
  • 五模型对比!Transformer-GRU、Transformer、CNN-GRU、GRU、CNN五模型多变量时间序列预测
  • Kafka_2.13-3.6.0 常用命令快速指南
  • .net core 的软件开发流程
  • Springboot关于格式化记录
  • java常用类(下)
  • uniapp使用live-pusher实现模拟人脸识别效果
  • 窗口函数-详细讲解分析
  • vue 集成 webrtc-streamer 播放视频流 - 解决阿里云内外网访问视频流问题
  • 面试知识点汇总_02
  • 【STM32】RTT-Studio中HAL库开发教程十:EC800M-4G模块使用
  • 记录使用uim4的自定义头部
  • 黑马点评——基于Redis
  • Java全栈项目-校园公告管理系统开发实践
  • Kubernetes 安装 Nginx以及配置自动补全
  • SQL 表连接操作
  • 0055. shell命令--useradd
  • 【知识】cuda检测GPU是否支持P2P通信及一些注意事项
  • day20-yum精讲