news 2026/5/2 13:57:41

亲测有效的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/5/1 2:11:17

Qwen3-1.7B踩坑记录:这些错误千万别再犯

Qwen3-1.7B踩坑记录&#xff1a;这些错误千万别再犯 1. 引言&#xff1a;为什么这份踩坑指南值得你花5分钟读完 如果你正在尝试部署或调用Qwen3-1.7B模型&#xff0c;却卡在了“连接失败”、“返回空内容”或者“流式输出不生效”这类问题上——别急&#xff0c;你不是一个人…

作者头像 李华
网站建设 2026/5/1 16:47:58

Z-Image-Turbo快速生成横版风景图,适配PPT背景

Z-Image-Turbo快速生成横版风景图&#xff0c;适配PPT背景 1. 为什么你需要一张专属的PPT背景图&#xff1f; 做汇报时&#xff0c;你是否也遇到过这些尴尬时刻&#xff1f; 花几十块买的模板被同事认出“撞款”&#xff0c;网上搜的免费图片模糊得像打了马赛克&#xff0c;或…

作者头像 李华
网站建设 2026/5/1 7:46:42

PyTorch-2.x镜像实战:科学计算Scipy预装带来的便利性

PyTorch-2.x镜像实战&#xff1a;科学计算Scipy预装带来的便利性 你有没有遇到过这样的情况&#xff1a;刚搭好PyTorch环境&#xff0c;准备跑一个科学计算任务&#xff0c;结果一导入scipy就报错&#xff1f;或者在做模型训练前的数据预处理时&#xff0c;发现缺少插值、优化…

作者头像 李华
网站建设 2026/4/24 0:48:12

eSpeak NG终极指南:5分钟掌握文本转语音核心技术

eSpeak NG终极指南&#xff1a;5分钟掌握文本转语音核心技术 【免费下载链接】espeak-ng espeak-ng: 是一个文本到语音的合成器&#xff0c;支持多种语言和口音&#xff0c;适用于Linux、Windows、Android等操作系统。 项目地址: https://gitcode.com/GitHub_Trending/es/esp…

作者头像 李华
网站建设 2026/5/1 11:30:05

MusicNN终极指南:用深度神经网络快速识别音乐风格标签

MusicNN终极指南&#xff1a;用深度神经网络快速识别音乐风格标签 【免费下载链接】musicnn Pronounced as "musician", musicnn is a set of pre-trained deep convolutional neural networks for music audio tagging. 项目地址: https://gitcode.com/gh_mirrors…

作者头像 李华