news 2026/8/16 11:09:38

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/7/31 8:12:55

SQLite浏览器工具:在浏览器中零配置管理数据库文件

SQLite浏览器工具&#xff1a;在浏览器中零配置管理数据库文件 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 还在为查看SQLite数据库而烦恼吗&#xff1f;每次都要安装复杂的软件&#xff0c;配…

作者头像 李华
网站建设 2026/8/9 16:55:05

客服质检升级:用SenseVoiceSmall自动发现投诉情绪

客服质检升级&#xff1a;用SenseVoiceSmall自动发现投诉情绪 1. 背景与挑战&#xff1a;传统客服质检的局限性 在客户服务领域&#xff0c;通话质量评估是保障用户体验和提升服务质量的关键环节。传统的客服质检主要依赖人工抽检或基于关键词的自动化系统&#xff0c;存在明…

作者头像 李华
网站建设 2026/8/8 11:26:55

终极指南:Vite-Vue3低代码平台零基础快速上手实战教程

终极指南&#xff1a;Vite-Vue3低代码平台零基础快速上手实战教程 【免费下载链接】vite-vue3-lowcode vue3.x vite2.x vant element-plus H5移动端低代码平台 lowcode 可视化拖拽 可视化编辑器 visual editor 类似易企秀的H5制作、建站工具、可视化搭建工具 项目地址: ht…

作者头像 李华
网站建设 2026/8/9 12:04:03

树莓派Python开发环境搭建:手把手入门必看

树莓派Python开发环境搭建&#xff1a;从零开始点亮你的第一个LED 你有没有想过&#xff0c;用一块信用卡大小的电脑控制灯、读取传感器、甚至做一个人脸识别门禁系统&#xff1f;这并不是科幻电影里的场景——它就发生在无数创客、学生和工程师的书桌上。主角&#xff0c;正是…

作者头像 李华
网站建设 2026/8/14 14:35:09

浏览器SQLite查看:零安装的数据库管理新体验

浏览器SQLite查看&#xff1a;零安装的数据库管理新体验 【免费下载链接】sqlite-viewer View SQLite file online 项目地址: https://gitcode.com/gh_mirrors/sq/sqlite-viewer 还在为查看SQLite数据库而安装笨重软件吗&#xff1f;遇到客户发来的数据库文件却束手无策…

作者头像 李华
网站建设 2026/8/9 19:56:54

Qwen2.5-0.5B如何用于教学?学生AI助教搭建实例

Qwen2.5-0.5B如何用于教学&#xff1f;学生AI助教搭建实例 1. 引言&#xff1a;轻量级大模型在教育场景的潜力 随着人工智能技术的发展&#xff0c;大模型正逐步从云端走向本地化、边缘化部署。尤其在教育资源不均衡或硬件条件受限的环境中&#xff0c;如何利用低算力设备实现…

作者头像 李华