news 2026/2/3 7:24:29

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/1/29 11:35:10

Blender批量导入PSA:动画制作效率的革命性提升

Blender批量导入PSA&#xff1a;动画制作效率的革命性提升 【免费下载链接】io_scene_psk_psa A Blender plugin for importing and exporting Unreal PSK and PSA files 项目地址: https://gitcode.com/gh_mirrors/io/io_scene_psk_psa 对于使用Blender进行3D动画制作的…

作者头像 李华
网站建设 2026/2/3 2:32:10

2024大模型趋势入门必看:Llama3开源+弹性GPU部署实战

2024大模型趋势入门必看&#xff1a;Llama3开源弹性GPU部署实战 1. 引言&#xff1a;大模型平民化时代的技术拐点 2024年&#xff0c;大模型技术正加速从“实验室奇观”走向“开发者桌面”。Meta发布的Llama 3系列标志着开源模型在性能与可用性上的又一次飞跃。其中&#xff…

作者头像 李华
网站建设 2026/1/30 15:08:19

终极指南:5个技巧快速掌握MediaPipe TouchDesigner视觉交互开发

终极指南&#xff1a;5个技巧快速掌握MediaPipe TouchDesigner视觉交互开发 【免费下载链接】mediapipe-touchdesigner GPU Accelerated MediaPipe Plugin for TouchDesigner 项目地址: https://gitcode.com/gh_mirrors/me/mediapipe-touchdesigner MediaPipe TouchDesi…

作者头像 李华
网站建设 2026/1/29 17:57:45

通义千问2.5-0.5B显存优化技巧:FP16转GGUF-Q4详细步骤

通义千问2.5-0.5B显存优化技巧&#xff1a;FP16转GGUF-Q4详细步骤 1. 引言 1.1 背景与需求 随着大模型在移动端和边缘设备上的应用日益广泛&#xff0c;如何在资源受限的环境中高效部署轻量级语言模型成为关键挑战。Qwen2.5-0.5B-Instruct 是阿里 Qwen2.5 系列中参数量最小的…

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

华为设备深度解锁秘籍:麒麟芯片Bootloader破解全攻略

华为设备深度解锁秘籍&#xff1a;麒麟芯片Bootloader破解全攻略 【免费下载链接】PotatoNV Unlock bootloader of Huawei devices on Kirin 960/95х/65x/620 项目地址: https://gitcode.com/gh_mirrors/po/PotatoNV &#x1f3af; 还在为华为设备的系统限制而束手无策…

作者头像 李华
网站建设 2026/1/29 22:33:31

隐私敏感用户福音!本地离线AI证件照系统部署实战案例

隐私敏感用户福音&#xff01;本地离线AI证件照系统部署实战案例 1. 引言&#xff1a;为何需要本地化AI证件照解决方案&#xff1f; 在数字化办公和在线身份认证日益普及的今天&#xff0c;证件照已成为简历投递、考试报名、政务办理等场景中的高频刚需。然而&#xff0c;传统…

作者头像 李华