news 2026/6/10 23:07:57

MTK芯片平台开机脚本适配,non_plat策略添加

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MTK芯片平台开机脚本适配,non_plat策略添加

MTK芯片平台开机脚本适配,non_plat策略添加

1. 引言

在嵌入式Android系统开发中,实现自定义功能的开机自动执行是一项常见需求。尤其是在MTK(联发科)芯片平台上进行定制化开发时,往往需要通过添加开机启动脚本完成硬件初始化、服务拉起或调试信息设置等任务。

然而,仅仅编写一个Shell脚本并放入系统并不足以确保其在开机阶段被正确执行。由于Android系统的安全机制(特别是SELinux策略),若未正确配置权限和上下文,脚本将无法运行甚至导致系统启动异常。

本文基于实际工程经验,详细介绍如何在MTK平台Android 8.0及以上版本中,通过non_plat策略方式安全地添加开机启动脚本,涵盖脚本编写、init.rc配置、SELinux策略定义与te文件管理等关键步骤,帮助开发者规避常见陷阱,提升适配效率。

2. 开机启动脚本的核心流程

2.1 整体实现路径

要在MTK平台上成功实现开机脚本启动,需遵循以下五个核心步骤:

  • 编写可执行的Shell脚本
  • 将脚本放置于系统指定目录(如/vendor/bin
  • init.<platform>.rc文件中注册服务
  • 定义SELinux类型与执行上下文
  • 添加non_plat域策略以允许执行

其中,non_plat策略的使用是MTK推荐的安全扩展方式,避免直接修改平台级sepolicy带来的兼容性问题。

2.2 环境前提说明

本文适用于以下环境条件:

  • 芯片平台:MTK(MediaTek)系列SoC
  • Android版本:Android 8.0 及以上(已启用SELinux enforcing模式)
  • 构建系统:AOSP源码编译环境
  • 权限要求:具备完整源码访问权限及build权限

注意:所有操作均应在源码环境下完成,不建议仅通过adb push方式进行测试,否则难以验证SELinux策略是否生效。

3. 实现步骤详解

3.1 编写开机启动Shell脚本

首先创建一个简单的Shell脚本用于测试,命名为init.test.sh,内容如下:

#!/system/bin/sh # 设置测试属性,便于验证脚本是否执行 setprop sys.boot.test_script executed # 输出日志到dmesg(可用于串口或logcat查看) log -t "InitTest" -p i "Test boot script is running" # 示例:可在此处添加其他初始化命令 # mkdir /data/test_dir # chmod 755 /data/test_dir
注意事项:
  • 脚本首行必须为#!/system/bin/sh#!/system/xbin/sh,不可使用/bin/sh
  • 建议先手动push至设备并chmod +x后执行,确认语法无误
  • 避免在脚本中创建复杂文件结构或涉及敏感路径操作,防止SELinux拒绝访问

将该脚本放入源码中的vendor/mediatek/proprietary/scripts/目录下,并在后续编译过程中将其打包进/vendor/bin/

3.2 将脚本集成到系统镜像

为了确保脚本随系统镜像一起烧录,需在Android.mk或Android.bp中声明安装规则。

假设使用Android.mk,可在对应模块中添加:

# Copy init.test.sh to vendor/bin include $(CLEAR_VARS) LOCAL_MODULE := init.test.sh LOCAL_SRC_FILES := $(LOCAL_PATH)/init.test.sh LOCAL_MODULE_CLASS := ETC LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_EXECUTABLES) LOCAL_MODULE_TAGS := optional LOCAL_MODULE_OWNER := mtk include $(BUILD_PREBUILT)

这样,在编译完成后,脚本会被自动复制到/vendor/bin/init.test.sh

3.3 在init.rc中注册启动服务

MTK平台通常提供专用的init配置文件用于客户自定义服务,例如init.mt67xx.rc(具体名称依平台而定)。不建议直接修改根目录下的init.rc

device/mediatek/<platform>/rootdir/etc/init.mt67xx.rc中添加以下service定义:

service test_service /vendor/bin/init.test.sh class main user root group root oneshot disabled seclabel u:r:test_service:s0
参数解释:
  • class main:表示该服务属于主启动类,在boot触发时运行
  • user/group root:以root权限执行(根据需求可降权)
  • oneshot:只执行一次,适合初始化脚本
  • disabled:默认不启用,便于控制启动时机;可通过start test_service手动触发
  • seclabel:指定SELinux安全上下文,需与后续te文件一致

若希望开机自动运行,可去掉disabled,并在适当位置添加on property:sys.boot_completed=1 start test_service等触发条件。

3.4 创建SELinux策略文件(TE)

由于Android启用了SELinux强制模式,任何新进程都必须有明确的域(domain)和类型(type)定义,否则会被拒绝执行。

MTK平台推荐使用non_plat机制扩展SELinux策略,即在device/mediatek/sepolicy/basic/non_plat/下添加客户专属策略,避免污染原生plat策略。

步骤一:创建.te策略文件

新建文件device/mediatek/sepolicy/basic/non_plat/test_service.te,内容如下:

# 定义服务类型 type test_service, coredomain; # 定义可执行文件类型 type test_service_exec, exec_type, file_type, vendor_file_type; # 允许init域转换到test_service域 init_daemon_domain(test_service) # 可选:临时放宽策略用于调试(发布前务必移除) # permissive test_service;
步骤二:绑定文件上下文

编辑device/mediatek/sepolicy/basic/non_plat/file_contexts文件,添加以下行:

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

这表示:当系统加载/vendor/bin/init.test.sh时,应赋予它test_service_exec类型,从而允许init进程依据seclabel启动对应domain。

正则表达式注意:文件名中的点需转义为\.,否则匹配失败。

3.5 验证non_plat策略是否生效

MTK的non_plat机制依赖于编译系统自动合并策略。可通过以下方式验证:

  1. 检查最终生成的sepolicy文件:bash out/target/product/<product>/root/file_contexts.bin使用sefcontext工具反编译验证是否存在/vendor/bin/init.test.sh条目。

  2. 查看dmesg日志:bash adb shell dmesg | grep avc如果出现类似avc: denied { execute } for comm="init"的报错,则说明SELinux拦截了执行,需检查te文件配置。

  3. 使用ls -Z查看文件上下文:bash adb shell ls -Z /vendor/bin/init.test.sh正常输出应包含u:object_r:test_service_exec:s0

4. 常见问题与解决方案

4.1 脚本未执行但无明显错误

现象:系统正常启动,但getprop sys.boot.test_script为空,log中无相关输出。

排查方向: - 检查init.rc语法是否正确(缩进必须为空格,不能用tab) - 确认脚本是否真的存在于/vendor/bin/- 查看init日志:adb logcat -b init是否有starting service 'test_service'记录 - 若服务被标记为disabled,需显式调用start test_service

4.2 SELinux拒绝执行(AVC Denied)

典型日志

avc: denied { execute } for pid=1 comm="init" name="init.test.sh" dev="mmcblk0pXX" scontext=u:r:init:s0 tcontext=u:object_r:vendor_file:s0 tclass=file

解决方法: - 确保file_contexts中已正确声明文件类型映射 - 检查.te文件中是否定义了test_service_exec类型并关联exec_type- 使用permissive test_service;临时放行以便调试(仅限开发阶段)

4.3 脚本执行失败或中途退出

可能原因: - 脚本首行解释器路径错误(如写成/bin/sh) - 脚本缺少可执行权限(需在Android.mk中确保安装为可执行) - 脚本内部命令访问受限路径(如/system、/data等),触发SELinux deny

建议做法: - 在脚本开头加入log命令输出调试信息 - 使用ps | grep test_service确认进程是否短暂存在 - 利用串口日志获取更完整的启动过程信息

5. 最佳实践建议

5.1 使用non_plat策略的优势

  • 隔离性好:客户自定义策略与平台策略分离,便于维护和升级
  • 安全性高:避免误改核心sepolicy造成系统不稳定
  • 可移植性强:策略文件集中管理,易于迁移到其他项目

5.2 推荐的工程化组织方式

建议在项目中建立如下目录结构:

device/mediatek/<project>/ ├── rootdir/ │ └── etc/init.<project>.rc # 自定义init配置 ├── scripts/ │ └── init.test.sh # 启动脚本源码 └── sepolicy/ └── non_plat/ ├── test_service.te └── file_contexts # 或合并到主file_contexts

并通过统一的Android.mk或Android.bp进行构建集成。

5.3 调试技巧汇总

方法工具/命令用途
查看init日志adb logcat -b init观察服务启动时间点
检查SELinux拒绝adb shell dmesg \| grep avc发现权限拦截
验证文件上下文adb shell ls -Z <file>确认SELinux标签
手动触发服务adb shell start <service_name>快速测试脚本逻辑
输出调试日志log -t TAG -p i "msg"在脚本中插入跟踪点

获取更多AI镜像

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

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

用NotaGen生成古典音乐|基于LLM的AI作曲实战

用NotaGen生成古典音乐&#xff5c;基于LLM的AI作曲实战 1. 概述 1.1 AI作曲的技术演进 随着深度学习与大语言模型&#xff08;Large Language Models, LLMs&#xff09;的发展&#xff0c;人工智能在创意领域的应用不断深化。从早期的规则驱动式音乐生成&#xff0c;到基于…

作者头像 李华
网站建设 2026/6/10 19:42:05

这模型太强了!1.5B参数竟搞定复杂动态规划题

这模型太强了&#xff01;1.5B参数竟搞定复杂动态规划题 在大模型参数规模不断膨胀的今天&#xff0c;一个仅15亿参数的开源模型却悄然崭露头角——微博推出的 VibeThinker-1.5B 在多个高难度算法与数学推理任务中表现惊人。它不仅在 LiveCodeBench v5 上取得 55.9 的高分&…

作者头像 李华
网站建设 2026/6/10 14:33:37

Hunyuan MT1.5多场景落地:民族语言翻译系统部署完整指南

Hunyuan MT1.5多场景落地&#xff1a;民族语言翻译系统部署完整指南 1. 引言&#xff1a;轻量级多语翻译模型的现实需求 随着全球化与区域数字化进程加速&#xff0c;跨语言信息流通成为关键基础设施。尤其在多民族、多语言共存的地区&#xff0c;如何实现高效、准确、低成本…

作者头像 李华
网站建设 2026/6/10 12:37:00

告别环境配置!YOLOv13镜像实现5秒快速推理

告别环境配置&#xff01;YOLOv13镜像实现5秒快速推理 在深度学习项目开发中&#xff0c;环境配置往往是阻碍效率的第一道“拦路虎”。Python版本冲突、CUDA驱动不匹配、依赖库缺失……这些问题不仅消耗大量时间&#xff0c;还可能导致模型训练中断或推理失败。尤其对于YOLO系…

作者头像 李华
网站建设 2026/6/10 12:38:49

Qwen-Image-2512-ComfyUI成本控制:闲置资源自动释放策略

Qwen-Image-2512-ComfyUI成本控制&#xff1a;闲置资源自动释放策略 1. 背景与挑战&#xff1a;高算力模型的资源消耗痛点 随着生成式AI技术的快速发展&#xff0c;图像生成模型在分辨率、细节表现和推理速度方面持续提升。阿里开源的Qwen-Image-2512-ComfyUI作为最新一代高分…

作者头像 李华
网站建设 2026/6/10 12:33:57

Whisper语音识别性能优化:提升转录速度3倍技巧

Whisper语音识别性能优化&#xff1a;提升转录速度3倍技巧 1. 引言 1.1 业务场景与性能瓶颈 在基于 OpenAI Whisper Large v3 的多语言语音识别 Web 服务中&#xff0c;尽管模型具备强大的跨语言转录能力&#xff08;支持99种语言&#xff09;&#xff0c;但在实际部署过程中…

作者头像 李华