news 2026/4/16 12:30:02

亲测有效的Android开机启动shell脚本配置方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
亲测有效的Android开机启动shell脚本配置方法

亲测有效的Android开机启动shell脚本配置方法

在定制化Android系统开发过程中,经常需要实现某些功能在设备开机时自动执行。比如自启服务、初始化环境变量、设置系统属性或运行诊断脚本等。虽然Android本身对后台行为有严格限制,但通过原生系统级方式——init机制 + SELinux权限配置,我们可以在系统启动早期阶段运行自定义的shell脚本。

本文将基于实际项目经验,详细介绍如何在Android 8.0及以上版本中,安全、稳定地配置一个可在开机时自动执行的shell脚本。所有步骤均经过真机测试验证(MTK平台 Android 8.0),适用于大多数基于AOSP的定制ROM开发场景。


1. 整体流程概览

实现Android开机启动shell脚本的核心流程如下:

  • 编写可执行的shell脚本
  • 将脚本放置到系统镜像中的指定路径
  • 在init.rc或其扩展rc文件中注册service
  • 配置SELinux策略(te文件和file_contexts)
  • 编译并刷机验证

整个过程涉及系统构建、权限控制与init机制的理解,任何一个环节出错都可能导致脚本无法执行甚至系统无法正常启动。因此建议每一步都进行充分验证。


2. 编写开机启动shell脚本

2.1 创建脚本文件

首先创建一个名为init.test.sh的shell脚本,内容如下:

#!/system/bin/sh # 设置一个测试属性,用于验证脚本是否成功执行 setprop sys.boot.test_script_executed 1 # 可选:输出日志便于调试 log -t "InitScript" -p i "Test init script executed successfully" # 示例:挂载临时目录或修改权限(根据实际需求添加) # mkdir /data/local/test_dir 2>/dev/null || true

注意点说明

  • 脚本首行必须为#!/system/bin/sh#!/system/xbin/sh,不能使用/bin/sh,否则在Android环境中会因路径不存在而失败。
  • 建议初期仅设置系统属性或打印日志,避免操作文件系统引发权限问题。
  • 文件保存时确保换行符为LF(Unix格式),Windows下的CRLF会导致解析错误。

2.2 手动测试脚本可用性

在正式集成进系统前,先手动push到设备测试:

adb push init.test.sh /data/local/tmp/ adb shell chmod 755 /data/local/tmp/init.test.sh adb shell sh /data/local/tmp/init.test.sh adb shell getprop sys.boot.test_script_executed

如果返回值为1,说明脚本逻辑正确,可以进入下一步。


3. 将脚本纳入系统镜像

为了让脚本在每次开机都能被访问,需将其编译进system.imgvendor.img

3.1 放置脚本源文件

init.test.sh放入以下目录(以MTK平台为例):

device/mediatek/common/bin/init.test.sh

并赋予可执行权限:

chmod 755 device/mediatek/common/bin/init.test.sh

3.2 添加编译规则

在对应产品的Android.mk或AndroidProducts.mk中添加该脚本的拷贝规则。例如,在device/mediatek/common/Android.mk中加入:

# Copy init test script PRODUCT_COPY_FILES += \ device/mediatek/common/bin/init.test.sh:system/bin/init.test.sh

这样在编译系统镜像时,脚本会被自动复制到/system/bin/init.test.sh,并在后续由init进程调用。


4. 在init.rc中注册启动服务

Android系统的启动服务由init进程管理,通过.rc文件定义。不建议直接修改根目录下的init.rc,应使用厂商提供的扩展rc文件。

4.1 确定使用的rc文件

对于MTK平台,通常使用:

device/mediatek/common/rootdir/init.mtXXX.rc

或者查看当前系统加载的是哪个rc文件:

adb shell cat /proc/cmdline | grep androidboot.init_rc

若无特殊指定,则默认加载init.<hardware>.rc

4.2 添加service定义

在目标.rc文件中添加如下内容:

service test_boot_script /system/bin/init.test.sh class main user root group root oneshot disabled seclabel u:r:test_service:s0

字段解释

  • class main:表示属于主启动类,随系统一起启动
  • user/group root:以root权限运行(谨慎使用)
  • oneshot:只执行一次,适合初始化脚本
  • disabled:防止在init.rc中立即启动,便于手动控制时机
  • seclabel:指定SELinux上下文,需与te策略匹配

⚠️ 注意:不要省略disabled,否则可能在错误时机触发导致异常。

4.3 控制启动时机(可选)

如需在特定阶段启动,可通过trigger控制。例如在on property:sys.boot_completed=1之后运行:

on property:sys.boot_completed=1 start test_boot_script

或将disabled改为enabled并去掉trigger,使其在class main启动时立即执行。


5. 配置SELinux权限策略

SELinux是Android安全模型的重要组成部分。即使关闭了SELinux enforcing模式,init仍会检查上下文标签。缺少正确的策略会导致脚本无法执行。

5.1 创建TE策略文件

新建文件device/mediatek/sepolicy/basic/non_plat/test_service.te,内容如下:

# 定义域类型 type test_service, coredomain; # 定义可执行文件类型 type test_service_exec, exec_type, file_type; # 允许init域启动该服务 init_daemon_domain(test_service) # 可选:允许读取和执行脚本文件 allow init test_service_exec:file { read open execute getattr }; allow init test_service:process { transition };

5.2 关联file_contexts

编辑device/mediatek/sepolicy/basic/non_plat/file_contexts,添加以下行:

/system/bin/init\.test\.sh u:object_r:test_service_exec:s0

这行的作用是告诉系统:当加载/system/bin/init.test.sh时,应赋予它test_service_exec的安全上下文。

🔍 提示:正则表达式中.要转义为\.,否则匹配不准确。


6. 编译与烧录验证

完成上述配置后,重新编译系统镜像:

mka systemimage vendorimage

烧录到设备后重启,并通过以下命令验证脚本是否执行:

adb reboot adb shell getprop sys.boot.test_script_executed

预期输出:

1

同时查看日志:

adb logcat -s InitScript

应能看到类似输出:

I InitScript: Test init script executed successfully

如果未生效,请按以下顺序排查:

  1. 检查脚本是否存在于/system/bin/init.test.sh
  2. 查看dmesg是否有SELinux拒绝记录:
    adb shell dmesg | grep avc
  3. 检查init是否尝试启动服务:
    adb shell ps | grep init.test.sh

7. 常见问题与解决方案

7.1 脚本未执行,无任何输出

  • 原因:最常见为SELinux权限不足或file_contexts未正确配置
  • 解决方法
    • 检查dmesg | grep avc是否有denied日志
    • 若有,根据提示补充allow规则
    • 确保file_contexts中路径拼写正确且已编译进sepolicy

7.2 提示“Permission denied”即使chmod 755

  • 原因:可能是分区挂载为只读,或SEPolicy阻止执行
  • 解决方法
    • 使用ls -Z /system/bin/init.test.sh检查SELinux标签是否为预期值
    • 若显示u:object_r:system_file:s0而非test_service_exec,说明file_contexts未生效

7.3 脚本执行但setprop无效

  • 原因:Android对系统属性有命名空间限制
  • 解决方法
    • 属性名必须以sys.ctl.persist.开头才可被普通进程设置
    • 推荐使用sys.boot.xxxdebug.xxx

8. 最佳实践建议

8.1 权限最小化原则

  • 尽量避免使用root用户运行脚本,优先使用shell或专用用户
  • 如非必要,不要赋予过多SELinux权限

8.2 日志先行,逐步迭代

  • 初期只做logsetprop,确认机制可行后再增加复杂逻辑
  • 使用log -t "Tag" -p i "message"输出调试信息

8.3 使用vendor分区更灵活

  • 将脚本放入/vendor/bin/而非/system/bin/,便于OTA升级时不覆盖
  • 对应更新file_contexts和PRODUCT_COPY_FILES路径

8.4 避免阻塞系统启动

  • 脚本执行时间不宜过长,避免影响用户体验
  • 若需后台持续任务,应在脚本中fork或启动独立service

9. 总结

通过本文介绍的方法,你可以成功在Android系统中实现shell脚本的开机自启动。关键步骤包括:

  1. 正确编写并部署shell脚本
  2. .rc文件中注册为init service
  3. 配置完整的SELinux策略(te + file_contexts)
  4. 编译烧录并验证执行结果

这套方案已在多个Android 8.0+项目中稳定运行,适用于自动化测试、硬件初始化、系统监控等多种场景。

只要遵循“先小步验证,再逐步扩展”的原则,即使面对复杂的权限和启动机制,也能高效定位问题并顺利完成集成。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 15:19:27

百度网盘解析工具:3步实现高速下载的终极方案

百度网盘解析工具&#xff1a;3步实现高速下载的终极方案 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的下载限速而苦恼吗&#xff1f;&#x1f62b; 今天我…

作者头像 李华
网站建设 2026/4/12 23:58:10

Chatbox桌面AI客户端:从新手到高手的实战使用指南

Chatbox桌面AI客户端&#xff1a;从新手到高手的实战使用指南 【免费下载链接】chatbox Chatbox是一款开源的AI桌面客户端&#xff0c;它提供简单易用的界面&#xff0c;助用户高效与AI交互。可以有效提升工作效率&#xff0c;同时确保数据安全。源项目地址&#xff1a;https:/…

作者头像 李华
网站建设 2026/4/16 12:21:19

Midscene.js实战宝典:3步构建企业级AI自动化测试系统

Midscene.js实战宝典&#xff1a;3步构建企业级AI自动化测试系统 【免费下载链接】midscene Let AI be your browser operator. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 在数字化转型浪潮中&#xff0c;如何让AI真正成为你的浏览器操作员&#xff…

作者头像 李华
网站建设 2026/4/16 11:03:57

ScreenTranslator:开源免费的屏幕翻译神器,让外语障碍瞬间消失

ScreenTranslator&#xff1a;开源免费的屏幕翻译神器&#xff0c;让外语障碍瞬间消失 【免费下载链接】ScreenTranslator Screen capture, OCR and translation tool. 项目地址: https://gitcode.com/gh_mirrors/sc/ScreenTranslator 还在为看不懂外文内容而苦恼吗&…

作者头像 李华
网站建设 2026/4/3 20:35:14

Unity游戏翻译神器:从零开始掌握自动翻译插件配置

Unity游戏翻译神器&#xff1a;从零开始掌握自动翻译插件配置 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 你是否曾经因为语言障碍而错过了优秀的Unity游戏&#xff1f;XUnity Auto Translator正是为解…

作者头像 李华
网站建设 2026/4/14 15:48:00

OpenAPI Generator:5分钟掌握多语言API开发自动化的完整方案

OpenAPI Generator&#xff1a;5分钟掌握多语言API开发自动化的完整方案 【免费下载链接】openapi-generator OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI…

作者头像 李华