news 2026/4/16 2:08:37

5分钟搞定Android开机启动脚本,测试脚本一键部署实测

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5分钟搞定Android开机启动脚本,测试脚本一键部署实测

5分钟搞定Android开机启动脚本,测试脚本一键部署实测

1. 引言

1.1 业务场景描述

在Android系统开发与测试过程中,经常需要在设备开机时自动执行某些初始化操作,例如设置系统属性、启动调试服务、挂载特殊分区或运行性能监测脚本。手动操作不仅效率低下,还容易遗漏步骤。因此,实现一个稳定可靠的开机启动脚本机制是提升自动化测试和系统定制效率的关键。

本文基于Android 8.0系统环境,结合实际项目经验,介绍如何快速部署一个可在设备启动时自动运行的Shell脚本,并通过CSDN星图镜像“测试开机启动脚本”进行实测验证,确保方案可复用、易迁移。

1.2 痛点分析

传统方式下,开发者常面临以下问题:

  • 脚本无法执行:权限不足或SELinux策略限制导致脚本被阻断
  • 启动时机错误:脚本过早或过晚执行,依赖的服务未就绪
  • 调试困难:无日志输出或报错信息不明确,难以定位问题
  • 平台差异大:不同芯片厂商(如高通、MTK)的init配置路径不一致

1.3 方案预告

本文将围绕以下四个核心步骤展开:

  1. 编写可执行的Shell脚本
  2. 配置init.rc中的service条目
  3. 添加SELinux安全策略(te文件)
  4. 实际部署与调试技巧

整个流程控制在5分钟内完成,适用于MTK等主流平台,已通过真实镜像环境验证。


2. 技术方案选型与实现

2.1 技术方案选型

为实现开机脚本自动执行,Android系统推荐使用init进程管理的service机制。相比其他方法(如修改boot.img或使用第三方工具),该方式具有以下优势:

方案安全性可维护性兼容性是否需root
init.rc + service✅ 高✅ 高✅ 好❌ 否(编译阶段)
修改boot.img⚠️ 中⚠️ 低⚠️ 差✅ 是
第三方自动化工具⚠️ 低⚠️ 中⚠️ 差✅ 是

因此,选择init.rc中注册service + SELinux策略配置作为最终方案。


2.2 实现步骤详解

2.2.1 编写Shell脚本

创建名为init.test.sh的脚本文件,存放于system/vendor/bin/目录下(建议路径)。

#!/system/bin/sh # 设置自定义系统属性,用于标记脚本已执行 setprop test.boot.script.executed 1 # 输出日志便于调试(写入persist分区) echo "Boot script executed at $(date)" > /mnt/vendor/persist/boot_log.txt # 示例:启用某个调试功能 setprop persist.debug.enable true # 可扩展其他操作,如启动守护进程、配置网络等

注意

  • 脚本首行必须为#!/system/bin/sh,不可使用/bin/sh

  • 建议先通过adb push手动推送并执行一次,确认语法无误:

    adb push init.test.sh /data/local/tmp/ adb shell sh /data/local/tmp/init.test.sh adb shell getprop test.boot.script.executed
2.2.2 在init.rc中注册Service

Android系统的初始化由init进程读取.rc文件驱动。应在对应平台的init.<target>.rc文件中添加service定义(避免直接修改init.rc主文件)。

以MTK平台为例,在device/mediatek/init.mt6765.rc中添加:

service test_boot_script /vendor/bin/init.test.sh class main user root group root oneshot disabled seclabel u:object_r:test_service_exec:s0

参数说明

  • oneshot:表示只执行一次,适合初始化任务
  • disabled:默认不启用,便于调试;正式版本可改为enabled
  • seclabel:指定SELinux上下文标签,必须与te文件匹配
2.2.3 创建SELinux策略文件(te)

SELinux是Android安全的核心机制。即使关闭了Enforcing模式,仍需声明文件类型和域权限。

device/mediatek/sepolicy/basic/non_plat/目录下新建两个文件:

test_service.te

type test_service, coredomain; type test_service_exec, exec_type, vendor_file_type, file_type; init_daemon_domain(test_service) # 允许init域执行此脚本 allow init test_service_exec:file { read open getattr execute execute_no_trans }; allow init test_service:process { transition };

file_contexts

/(system\/vendor|vendor)/bin/init\.test\.sh u:object_r:test_service_exec:s0

关键点

  • 文件路径正则表达式要准确匹配脚本位置
  • test_service_exec类型需同时出现在te和file_contexts中
  • 若未添加,即使脚本存在也会因“Permission Denied”而失败
2.2.4 编译与烧录

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

source build/envsetup.sh lunch your_target-userdebug make systemimage -j8

将生成的system.imgvendor.img烧录至设备。


3. 实践问题与优化

3.1 常见问题及解决方案

问题1:脚本未执行,getprop查不到属性

排查思路

  • 检查init日志:adb logcat | grep init
  • 查看是否有类似错误:
    init: Could not find 'init.test.sh' in PATH init: Failed to open selinux policy

解决方法

  • 确认脚本已打包进vendor/bin/
  • 使用adb shell ls /vendor/bin/init.test.sh验证是否存在
  • 检查file_contexts路径是否拼写正确(注意转义)
问题2:SELinux拒绝执行

日志中出现:

avc: denied { execute } for name="init.test.sh" dev="mmcblk0pXX"

解决方法

  • 确保seclabelfile_contexts中的SELinux类型一致
  • 临时调试可用:
    adb shell setenforce 0
    但生产环境必须配置完整策略
问题3:脚本执行时机太早,依赖服务未启动

若脚本需访问/data或网络服务,可能因挂载未完成而失败。

优化建议

  • 使用trigger机制延迟执行:
    on property:sys.boot_completed=1 start test_boot_script
  • 或监听特定事件:
    on fs_mounted /vendor start test_boot_script

3.2 性能优化建议

  1. 最小化脚本内容:仅保留必要操作,避免拖慢开机速度
  2. 异步执行耗时任务
    # 在脚本末尾启动后台任务 (sleep 10; long_running_task) &
  3. 日志分级输出:调试期写入persist分区,量产时关闭
  4. 统一命名规范:所有自定义脚本前缀统一(如init.custom.*),便于维护

4. 实测验证与结果分析

4.1 测试环境说明

  • 设备型号:MTK MT6765 开发板
  • Android版本:8.1 Oreo
  • 镜像来源:CSDN星图镜像广场 —— “测试开机启动脚本”
  • 部署方式:一键刷机包集成脚本与SELinux策略

4.2 验证步骤

  1. 刷入定制镜像
  2. 首次开机后立即执行:
    adb shell getprop test.boot.script.executed
  3. 检查日志文件:
    adb shell cat /mnt/vendor/persist/boot_log.txt
  4. 多次重启验证稳定性

4.3 实测结果

项目结果
脚本是否执行✅ 成功(属性值为1)
日志是否生成✅ 存在于persist分区
SELinux报错❌ 无avc denied日志
开机时间影响⚠️ 增加约0.3秒(可忽略)
多次重启稳定性✅ 连续10次均成功

结论:该方案在真实环境中表现稳定,满足自动化测试需求。


5. 总结

5.1 实践经验总结

通过本次实测,我们验证了Android 8.0环境下开机启动脚本的完整实现路径。关键成功要素包括:

  • 正确的脚本解释器路径(/system/bin/sh
  • 精确的SELinux策略配置(te + file_contexts)
  • 合理的init.rc service定义(含seclabel)
  • 充分的前期手动测试与日志追踪

5.2 最佳实践建议

  1. 开发阶段:保持disabled状态,通过adb shell start <service_name>手动触发调试
  2. 发布前:启用oneshot并绑定合适trigger,确保执行时机正确
  3. 跨平台移植:注意不同SoC厂商的sepolicy目录结构差异(如高通使用qcom/sepolicy
  4. 安全性考虑:避免在脚本中硬编码敏感指令,生产版本应移除调试代码

获取更多AI镜像

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

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

RDP Wrapper终极指南:免费开启Windows远程桌面多会话功能

RDP Wrapper终极指南&#xff1a;免费开启Windows远程桌面多会话功能 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 还在为Windows家庭版无法实现多用户远程桌面而烦恼吗&#xff1f;&#x1f914; RDP Wrapper L…

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

DeepSeek-R1-Distill-Qwen-1.5B入门必看:5分钟快速上手教程

DeepSeek-R1-Distill-Qwen-1.5B入门必看&#xff1a;5分钟快速上手教程 1. 学习目标与前置准备 本文是一篇面向初学者的实践导向型技术指南&#xff0c;旨在帮助开发者在5分钟内完成 DeepSeek-R1-Distill-Qwen-1.5B 模型的本地部署与基础调用。通过本教程&#xff0c;您将掌握…

作者头像 李华
网站建设 2026/4/16 14:28:10

BAAI/bge-m3如何调用API?Python集成实战教程

BAAI/bge-m3如何调用API&#xff1f;Python集成实战教程 1. 引言 1.1 学习目标 本文旨在帮助开发者快速掌握 BAAI/bge-m3 模型的 API 调用方法&#xff0c;并通过 Python 实现本地或远程服务的无缝集成。学完本教程后&#xff0c;你将能够&#xff1a; 理解 bge-m3 模型的核…

作者头像 李华
网站建设 2026/3/24 2:03:04

DeepSeek-R1企业级应用:合规AI解决方案

DeepSeek-R1企业级应用&#xff1a;合规AI解决方案 1. 背景与需求分析 随着人工智能技术在企业场景中的广泛应用&#xff0c;对数据隐私、合规性与本地化部署能力的要求日益提升。尤其在金融、医疗、政务等敏感领域&#xff0c;企业无法接受将业务数据上传至云端公有模型进行…

作者头像 李华
网站建设 2026/4/8 14:11:04

GitHub精准下载利器:DownGit完整使用指南

GitHub精准下载利器&#xff1a;DownGit完整使用指南 【免费下载链接】DownGit github 资源打包下载工具 项目地址: https://gitcode.com/gh_mirrors/dow/DownGit 还在为GitHub庞大的代码仓库而头疼吗&#xff1f;每次想要下载某个特定模块&#xff0c;却不得不克隆整个…

作者头像 李华
网站建设 2026/4/16 14:33:33

OpenDataLab MinerU指南:学术论文图表数据提取

OpenDataLab MinerU指南&#xff1a;学术论文图表数据提取 1. 引言 在科研与工程实践中&#xff0c;大量有价值的信息以非结构化形式存在于PDF文档、扫描件和PPT演示文稿中。尤其是学术论文中的图表、公式和表格&#xff0c;往往承载着研究的核心发现&#xff0c;但手动提取这…

作者头像 李华