当前位置: 首页 > news >正文

测试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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

http://www.jsqmd.com/news/311095/

相关文章:

  • 熊靖宇领衔极简口腔疑难种植中心的优势有哪些?
  • 智能球机摄像头自带旋转355度视角
  • 2026年高评价原木定制批发商综合评估与精选推荐
  • 答辩现场要顺利通过,最容易说服评审组教授的 10 种回答结构
  • YOLOv12官版镜像训练全流程,附完整代码示例
  • EagleEye部署教程:NVIDIA Container Toolkit配置与GPU容器权限设置
  • 图片旋转判断模型部署教程(4090D):从镜像拉取到output.jpeg输出完整链路
  • Qwen3-VL-4B Pro效果展示:3D渲染图材质/光源/构图的专业级视觉评价生成
  • 30秒以上长语音测试,CAM++特征提取稳定性
  • bge-large-zh-v1.5实战案例:中文会议纪要关键信息向量化提取
  • Qwen视觉模型在医疗影像初筛中的应用:可行性验证案例
  • QWEN-AUDIO惊艳效果展示:四音色+六情感+双语混合语音合集
  • Z-Image-Turbo适合哪些场景?这5个最实用
  • EagleEye实战案例:零售门店人流统计中毫秒级目标检测落地解析
  • 游戏开发中 C++ 枚举的正确用法:必须用 `enum class`
  • C++ 结构体实战:从理论到游戏与业务场景
  • C++ 结构体内存对齐终极指南:嵌套结构体如何“占位”?
  • 2026年快速拿证的威海手动挡驾校优质服务榜
  • 新手必读:STLink在Keil中的配置步骤详解
  • DeerFlow开源镜像:GitHub官方项目+火山引擎FaaS双渠道部署对比
  • SAM 3多模态提示实战:文本+点选协同提升小目标分割准确率
  • 基于SpringBoot+Vue的医药管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • STM32CubeMX安装包操作指南:零基础轻松掌握
  • 亲测Glyph视觉推理:让大模型‘看懂’长文本图像
  • translategemma-27b-it快速部署:Ubuntu/Windows/Mac三平台Ollama兼容方案
  • 【毕业设计】SpringBoot+Vue+MySQL 文理医院预约挂号系统平台源码+数据库+论文+部署文档
  • Z-Image Turbo在游戏开发预研中的应用:角色概念图快速迭代案例
  • 前后端分离工作流程管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 基于SpringBoot+Vue的秒杀系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】
  • 企业级文理医院预约挂号系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】