init.rc 启动 shell 脚本 开机执行脚本 init.rc执行shell脚本

2023-05-16

Android 重启时执行 shell 脚本 init.rc 执行 shell 脚本

最近有个需求,需要生成系统的默认配置,使得在系统开机后,直接读取已经配置好的文件。当时想的解决方案是,在编译时,先将系统默认配置拷贝到 /system 目录,然后在 init.rc 文件添加语句,将文件直接拷贝到 /data 目录。
但在实际操作过程中发现,只要系统重启后,配置会被覆盖。想通过判断文件是否存在来决定是否拷贝,但是 init.rc 无条件判断语句,所以想到通过执行 shell 脚本来进行判断。说了这么多,总结一句话是

init.rc 无条件判断语句,借助 shell 进行判断。

init.rc 重启时 执行 shell 脚本

该案例基于 rockchip 芯片开发,在 PX30 Android 10上进行的测试,在其他设备上大同小异,请自行查找或替换为对应的路径。

1. 编写脚本 test.sh

#!/system/bin/sh
# 该脚本只是演示,请根据自己需求编写脚本
if [ -f /data/system/test.xml ]; then
    echo "test already set"
else
    cp /system/test.xml /data/system/test.xml
    chmod 0600 /data/system/test.xml
    chown system:system /data/system/test.xml

fi

具体到我的工程,我在 AOSP_DIR/device/rockchip/rk3326/PX30_indpx30a/test 目录下新建了该test.sh

2.修改 .mk 配置文件,将创建的 test.sh 编译到系统分区

# copy test.sh to dir vendor/bin/test.sh
PRODUCT_COPY_FILES +=device/rockchip/rk3288/test.sh:vendor/bin/test.sh

将 工程中device/rockchip/rk3288/test.sh 拷贝到 /vendor/bin/test.sh 目录下。

具体到我的工程,target 对应的 mk 文件为 AOSP_DIR/device/rockchip/rk3326/PX30_indpx30a/device-common.mk

3. 配置 SELinux 权限

3.1 创建 test.te

service.te 文件所在的目录下创建 test.te

type testshell, domain;
type testshell_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(testshell)


allow testshell vendor_shell_exec:file { execute_no_trans };
allow testshell device:chr_file { ioctl };
#allow testshell system_file:file { execute };
#allow testshell toolbox_exec:file { map };
allow testshell storage_file:dir { search };
allow testshell storage_file:lnk_file { read };
allow testshell mnt_user_file:lnk_file { read };
allow testshell mnt_user_file:dir { search };
allow testshell sdcardfs:dir { search write add_name create };
#allow testshell media_rw_data_file:dir { read open search write };
allow testshell system_data_file:file { getattr };

3.2 配置 service.te

service.te 中增加一行

...
type test_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
...

3.3 配置 file_context

file_contexts 中增加一行


#test
/vendor/bin/test.sh                               u:object_r:testshell_exec:s0

具体到我的工程,SELinux 配置所在的路径为 AOSP_DIR/device/rockchip/common/sepolicy/vendor , test.teservice.tefile_context 都在该目录下。

4. 配置 init.rc

init.rc 文件中找到 on boot,在其中增加一行 exec -- /vendor/bin/test.sh,如下

on boot

    ...
    ...
    # execute test.sh 
    exec -- /vendor/bin/test.sh

具体到我的工程,target 对应的 init.rc 文件为 AOSP_DIR/device/rockchip/rk3326/PX30_indpx30a/init.rk30board.rc

5. 重新生成固件并刷入

重新生成固件并刷入,查看文件是否成功被复制,从而验证 test.sh 脚本是否被执行,可以通过 adb shell dmesg >julian.log 命令查看开机日志

6. 注意事项

案例中的路径可能和你工程路径不一致,请自行查找或替换为对应的路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

init.rc 启动 shell 脚本 开机执行脚本 init.rc执行shell脚本 的相关文章

随机推荐

  • iOS APP测试方法和测试工具 大揭秘

    随着移动互联网的发展 xff0c 以及智能手机的普及 xff0c 各种各样的 APP 层出不穷 xff0c 大家可以数一数自己手机上安装的 APP xff0c 随随便便几十个 xff0c 上百个 xff0c 所以现在 APP 测试的需求也越
  • oracle sql loader命令与ctl写法

    xfeff xfeff sql loader 的特点 oracle自己带了很多的工具可以用来进行数据的迁移 备份和恢复等工作 但是每个工具都有自己的特点 比如说exp和imp可以对数据库中的数据进行导出和导出的工作 xff0c 是一种很好的
  • 史上最全的字符串格式化方法,学这些就够用了

    一 思考 1 什么是字符串格式化 将变量 xff08 对象 xff09 的值填充到字符串中 在字符串中解析Python表达式 对字符串进行格式化显示 左对齐 右对齐 居中对齐保留数字有效位数 2 你学过的字符串格式化方式有哪些 字符串格式化
  • Linux实现黑客帝国效果,超级简单

    MATRIX是Linux的环境下黑客帝国风格的屏保 xff0c 绿色的字母在屏幕上刷刷如雨水落下 xff0c 偶尔看看能回忆起程序猿的黑客梦 首先要在网上找到CMATRIX安装包 xff0c 然后安装 xff0c 需要的话找柠檬班小米 xf
  • 10年互联网职场过来人给测试专业大学生的学习建议

    改进学习方法 xff0c 就如改进你的测试方法一样 不管你面临的是什么环境和挑战 xff0c 值得期许的 就值得去尝试 1 关于学习 在学校期间以专业课为主 xff0c 专业理论知识越扎实 xff0c 后期实践才越容易深入理解且上手更快 对
  • 使用 GitHub Copilot 自动化测试

    代码完成并不是什么新鲜事 像 IntelliSense 这样的工具已经允许开发人员通过尝试自动完成他们正在编写的函数或语句的名称来提高工作效率 xff0c 但是可用的工具只有一定程度的实际 智能 可用 随着 GitHub 的 Copilot
  • 想让你的接口自动化测试更加有效? 这个统计方法必须掌握

    覆盖率概念 接口自动化测试是现代软件开发中不可或缺的一环 xff0c 它能够帮助开发团队自动化执行测试用例 xff0c 以快速而准确地发现并修复软件缺陷 而覆盖率统计则是在测试执行完成后 xff0c 帮助测试团队了解哪些代码路径被覆盖了 x
  • 大小端字节序详解

    目录 引文 大小端介绍 xff08 1 xff09 什么是大端小端 xff08 2 xff09 为什么有大端和小端 xff08 3 xff09 笔试题讲解 引文 在开始正文之前 xff0c 我想先问一下大家 xff0c 内存中是怎样存放一个
  • 【C库函数】strcat函数详解

    目录 strcat 函数原型 参数讲解 返回值详解 函数讲解 xff08 1 xff09 源字符串和目标字符串都必须以 39 0 39 结束 xff08 2 xff09 目标空间必须足够大 xff0c 能容纳下源字符串的内容 xff08 3
  • CAN协议

    CAN xff08 Controller Area Network xff09 是一种常见的串行总线通信协议 xff0c 用于在汽车 工业控制和其他应用中传输数据 它是一种高效 可靠 安全的通信协议 xff0c 具有广泛的应用 下面是CAN
  • 串口协议简介

    串口协议是一种基于串行通信的数据传输协议 它通过串口接口将数据以串行的方式传输 串口协议通常包括物理层 数据链路层和应用层三个部分 xff0c 其中物理层主要定义了串口接口的电气特性 xff0c 数据链路层定义了数据的传输方式和错误检测机制
  • CAN协议总线仲裁原理:数据发送权争夺

    CAN总线仲裁原理是指在多个CAN节点同时发送数据时 xff0c 如何避免冲突 并选择一个节点作为发送者 CAN总线的仲裁原理基于一个分布式仲裁机制 xff0c 它可以快速而可靠地确定哪个节点可以获得总线控制权 xff0c 从而发送数据 C
  • Spring整合JMS(一)——基于ActiveMQ实现

    1 1 JMS简介 JMS的全称是Java Message Service xff0c 即Java消息服务 它主要用于在生产者和消费者之间进行消息传递 xff0c 生产者负责产生消息 xff0c 而消费者负责接收消息 把它应用到实际的业务需
  • getopt函数详解

    getopt 函数是C语言中一个常用的命令行参数解析函数 xff0c 它可以方便地解析命令行输入的参数 xff0c 以便程序对不同参数进行不同的处理 本文将详细讲解getopt 函数的使用方法和注意事项 xff0c 分点阐述如下 xff1a
  • UCOSIII

    UCOSIII简介 xff1a UCOSIII是MicroC OS III的改编版本 xff0c 主要是用于实时系统中的任务调度 xff0c 它是嵌入式系统中应用最广泛的操作系统之一 用函数说明 xff1a 1 OSInit 用于初始化UC
  • UCOSIII-任务创建-库函数

    创建任务 xff1a OSTaskCreate OS TCB amp StartTaskTCB 任务控制块 xff08 amp 传地址 xff09 CPU CHAR 34 start task 34 任务名字 xff08 可以随便写 xff
  • ucosiii-常用api

    uC OS III 提供了许多 API 函数 xff0c 可以根据需要选择使用 以下是一些常用的 uC OS III API 函数 xff1a 任务管理 API OSTaskCreate xff1a 创建一个新任务 xff1b OSTask
  • windows 清除 .git 文件夹

    有时我们需要将 git 管理项目中的 git文件夹删除 xff0c 但是如果项目太多 xff0c 一个一个手动删除太麻烦 xff0c 这时候可以用 bat 批处理文件删除 xff0c 具体操作如下 桌面 右击 新建文本文档 xff0c 此时
  • Your anti-virus program might be impacting your build performance.解决方案

    Your anti virus program might be impacting your build performance 解决方案 在使用 AndroidStudio 时 xff0c 经常会弹出框提示 xff1a Your ant
  • init.rc 启动 shell 脚本 开机执行脚本 init.rc执行shell脚本

    Android 重启时执行 shell 脚本 init rc 执行 shell 脚本 最近有个需求 xff0c 需要生成系统的默认配置 xff0c 使得在系统开机后 xff0c 直接读取已经配置好的文件 当时想的解决方案是 xff0c 在编