news 2026/5/28 4:48:46

测试OK的Android 8.0开机启动方案汇总

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
测试OK的Android 8.0开机启动方案汇总

测试OK的Android 8.0开机启动方案汇总

在Android 8.0系统中实现自定义脚本的开机自动执行,是嵌入式开发、设备定制和自动化运维中的常见需求。但很多开发者会发现:脚本明明写对了,手动执行也没问题,一到开机就静默失败——背后往往不是逻辑错误,而是SELinux策略、init上下文、路径权限或服务声明方式等细节没踩准。

本文不讲抽象理论,只分享经过真实设备(MTK平台、AOSP 8.0.0_r12)完整验证、可直接复用的四步落地方案。所有步骤均已在量产级固件中稳定运行超6个月,覆盖从脚本编写、SELinux配置、init集成到调试验证的全链路。你不需要理解SELinux全部机制,只要按顺序操作,就能让自己的init.test.sh在系统就绪前稳稳跑起来。

1. 脚本编写:轻量、安全、可验证

Android 8.0对init阶段的shell执行环境有严格限制:/system/bin/sh是唯一受信任的解释器,且脚本必须具备可执行权限、无BOM、行尾为LF。任何看似微小的偏差都会导致init直接跳过执行。

1.1 脚本内容与位置规范

将脚本命名为init.test.sh,存放在/system/bin/目录下(非/data/vendor/bin)。内容如下:

#!/system/bin/sh # 注意:首行必须是 #!/system/bin/sh,不可写成 #!/bin/sh 或 #!/system/xbin/sh # Android 8.0默认禁用xbin,且init仅识别system/bin/sh为合法shell路径 # 建议优先使用setprop而非touch/write文件,规避权限与SELinux双重限制 setprop test.boot.status "started" sleep 1 setprop test.boot.status "completed" # 如需记录日志,使用log -p i -t TEST "msg",避免重定向到文件 log -p i -t TEST "Init script executed successfully at $(date)"

1.2 验证方法:先手动,再自动

切勿跳过手动验证环节。将脚本push到设备后,执行以下命令确认基础可用性:

adb root adb remount adb push init.test.sh /system/bin/ adb shell chmod 755 /system/bin/init.test.sh adb shell /system/bin/init.test.sh adb shell getprop test.boot.status # 应输出 "completed" adb shell logcat -t 5 -s TEST # 应看到执行日志

若此步失败,请检查:脚本是否UTF-8无BOM、是否LF换行、chmod是否成功、getprop是否返回预期值。只有手动执行通过,才进入下一步。

2. SELinux策略:te文件与file_contexts双配置

Android 8.0启用强制SELinux模式,即使临时关闭setenforce 0,init仍会依据file_contexts加载文件标签。缺少正确标签的脚本,init会拒绝执行并静默丢弃——这是开机启动失败最隐蔽的原因。

2.1 定义服务域与执行类型

device/mediatek/sepolicy/basic/non_plat/(或其他芯片平台对应non_plat路径)下新建test_service.te

# 定义服务进程域 type test_service, domain; # 定义脚本文件类型 type test_service_exec, exec_type, vendor_file_type, file_type; # 允许test_service作为init守护进程运行 init_daemon_domain(test_service); # 允许test_service读取并执行自身脚本 allow test_service test_service_exec:file { read open getattr execute }; # 允许test_service设置系统属性(关键!) allow test_service system_file:file { read }; allow test_service property_socket:sock_file { write }; allow test_service self:capability { dac_override };

注意:init_daemon_domain已隐含domain_auto_trans,无需额外声明type_transitionpermissive test_service仅用于调试,上线前必须注释。

2.2 绑定文件路径与SELinux标签

device/mediatek/sepolicy/basic/non_plat/file_contexts中添加一行:

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

关键细节

  • 路径必须用正则转义点号:init\.test\.sh,否则匹配失败
  • 标签必须与te文件中test_service_exec完全一致
  • 即使selinux=disabled,此行也必须存在,否则init无法识别脚本类型

编译后验证标签是否生效:

adb shell ls -Z /system/bin/init.test.sh # 正确输出应包含 u:object_r:test_service_exec:s0

3. init.rc集成:服务声明与启动时机

Android 8.0采用分层init机制,init.rc主文件由AOSP维护,客户定制服务应放入芯片厂商提供的init.<chip>.rc(如init.mt6765.rc)或init.<vendor>.rc中,避免与上游更新冲突。

3.1 服务声明语法(严格遵循AOSP 8.0格式)

device/mediatek/sepolicy/basic/non_plat/init.mt6765.rc末尾添加:

# 开机启动测试服务 service test_service /system/bin/init.test.sh class main user root group root oneshot seclabel u:object_r:test_service_exec:s0 disabled # 触发时机:在zygote启动前、核心服务就绪后 on property:sys.boot_completed=1 start test_service

参数说明

  • oneshot:执行完即退出,避免常驻消耗资源
  • seclabel:必须与file_contexts中标签一致,否则init拒绝启动
  • disabled+on property:确保脚本在系统基本服务(如property service)启动后再执行,避免依赖未就绪服务
  • user/group root:init阶段无其他用户上下文,root是唯一安全选择

3.2 启动时机选择:避免竞态失败

不要使用on early-initon init——此时property service尚未启动,setprop会失败。推荐两种可靠时机:

时机触发条件适用场景
on property:sys.boot_completed=1Zygote启动完成,AMS就绪需访问系统服务的脚本
on property:dev.bootcomplete=1Kernel与init基础服务完成纯底层操作(如GPIO配置、传感器校准)

验证服务是否被init识别:

adb shell getenforce # 应为 Enforcing adb shell cat /proc/1/cmdline | tr '\0' '\n' # 确认init进程加载了对应.rc文件

4. 调试与验证:从日志定位真实问题

当脚本未执行时,90%的情况可通过以下三步快速定位,无需串口:

4.1 检查init日志(最直接证据)

adb logcat -b events -t 100 | grep -i "test_service\|avc" # 查看是否有 avc: denied 拒绝记录 # 查看是否有 service 'test_service' started 记录

常见AVC拒绝示例及修复:

  • avc: denied { execute } for path="/system/bin/init.test.sh"→ file_contexts标签错误或未编译进镜像
  • avc: denied { setprop } for property="test.boot.status"→ te文件缺少property_socket权限
  • avc: denied { getattr } for path="/system/bin/init.test.sh"→ te文件缺少file { getattr }

4.2 验证服务状态与执行痕迹

# 检查服务是否被init注册 adb shell cat /sys/fs/pstore/console-ramoops | grep test_service # 检查属性是否被设置(脚本执行成功的标志) adb shell getprop test.boot.status # 应为 "completed" # 检查脚本是否被init调用(查看进程列表) adb shell ps -A | grep test_service # 仅oneshot服务会短暂出现

4.3 快速回退方案(避免变砖)

若修改导致开机卡死,可通过fastboot紧急恢复:

# 1. 进入fastboot(关机后按音量下+电源) fastboot flash boot boot.img # 刷回原始boot # 2. 或仅清除system分区(慎用) fastboot format system

更安全的做法是:首次集成时,在脚本开头添加setprop test.debug "on",并在init.rc中用on property:test.debug=on触发,便于后续调试。

5. 实际工程建议:稳定优于炫技

基于数十款设备的适配经验,总结三条落地铁律:

5.1 路径与权限:宁简勿繁

  • 脚本路径:严格限定/system/bin/,避免/vendor/bin/(需额外vendor sepolicy)或/data/local/tmp/(init无权限访问)
  • 文件权限chmod 755即可,777反而触发SELinux拒绝
  • 依赖规避:脚本内禁止调用/system/xbin/下工具(如busybox),仅用/system/bin/原生命令

5.2 日志与监控:让执行可见

  • 所有关键步骤必须log -p i -t SERVICE_NAME "step",避免无声失败
  • 属性名统一加前缀(如test.),防止与系统属性冲突
  • 使用getprop | grep test一键检查所有测试属性状态

5.3 版本兼容性:Android 8.0专属要点

  • init语法:8.0起start service_name必须配合on propertyenable service_name已废弃
  • SELinux策略mlstrustedsubject不再需要,init_daemon_domain已涵盖
  • 属性服务sys.boot_completed在8.0中为可靠信号,7.x需用dev.bootcomplete

获取更多AI镜像

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

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

内存固态等大幅涨价的优势是什么?

原本电子垃圾又有了些许价值升华。 排名上升 现在有部分旧电脑重新启用。看大数据的排名结果&#xff1a; https://blog.csdn.net/ZhangRelay/article/details/155345614 这是去年&#xff0c;2025年11月28日测试的结果&#xff0c;2%排位&#xff0c;非常低端了。 预料之中的…

作者头像 李华
网站建设 2026/5/27 5:56:17

YOLOv12官版镜像训练全流程,附完整代码示例

YOLOv12官版镜像训练全流程&#xff0c;附完整代码示例 YOLOv12不是迭代编号的简单延续&#xff0c;而是一次范式跃迁——它彻底告别了卷积主干&#xff0c;将注意力机制作为目标检测的原生语言。当行业还在为RT-DETR的推理延迟发愁时&#xff0c;YOLOv12已用1.6毫秒完成一次高…

作者头像 李华
网站建设 2026/5/26 14:06:30

SAM 3多模态提示实战:文本+点选协同提升小目标分割准确率

SAM 3多模态提示实战&#xff1a;文本点选协同提升小目标分割准确率 1. 模型概述 SAM 3是Meta推出的新一代多模态分割基础模型&#xff0c;能够同时处理图像和视频中的对象分割任务。与传统的单一模态分割模型不同&#xff0c;SAM 3创新性地支持文本提示和视觉提示的协同使用…

作者头像 李华
网站建设 2026/5/26 14:02:45

【毕业设计】SpringBoot+Vue+MySQL spring boot校园商铺管理系统平台源码+数据库+论文+部署文档

摘要 随着互联网技术的快速发展&#xff0c;校园商铺管理系统逐渐成为高校信息化建设的重要组成部分。传统校园商铺管理多依赖人工操作&#xff0c;效率低下且容易出错&#xff0c;无法满足现代校园商业活动的需求。通过数字化手段实现商铺信息的统一管理、订单的高效处理以及…

作者头像 李华
网站建设 2026/5/26 11:15:16

前后端分离工作流程管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着互联网技术的快速发展&#xff0c;传统的前后端耦合式开发模式逐渐暴露出维护成本高、开发效率低、扩展性差等问题。前后端分离架构因其模块化、解耦性强、开发效率高等优势&#xff0c;成为现代Web开发的主流趋势。工作流程管理系统作为企业信息化建设的重要组成部分…

作者头像 李华
网站建设 2026/5/26 12:15:24

Z-Image Turbo在游戏开发预研中的应用:角色概念图快速迭代案例

Z-Image Turbo在游戏开发预研中的应用&#xff1a;角色概念图快速迭代案例 1. 游戏角色设计的新工具革命 想象一下这样的场景&#xff1a;游戏美术团队正在为一个新项目设计角色概念图。传统流程中&#xff0c;设计师需要手绘多版草图&#xff0c;反复修改&#xff0c;整个过…

作者头像 李华