You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Android平台C语言编写的守护进程实现开机自动运行

Android 自定义init服务开机启动失败解决方案

1. 验证init.rc修改是否持久生效

  • Android 7.0及以上版本默认启用系统分区验证(AVB),若仅通过adb remount修改/system目录下的init.rc,未关闭验证启动的前提下重启后修改内容会被还原,配置根本没有被init进程读取。
  • 验证方法:设备重启后执行命令adb shell cat /init.rc | grep -A5 mydaemon,确认自定义的service配置和start指令是否仍存在。若不存在,需先关闭AVB验证,或者将修改内容打包进system镜像后重新刷入设备。

2. 修正service配置错误

你当前配置中的disabled参数会标记服务默认不启动,部分Android高版本的init进程会优先识别disabled标记,忽略on boot区段的启动请求,直接删除该参数即可。修改后配置参考:

service mydaemon /system/bin/mydaemon
    user root
    seclabel u:r:su:s0

若你的设备没有root权限或su上下文不存在,可将seclabel改为系统默认可执行文件上下文:seclabel u:object_r:system_file:s0,避免SELinux拦截。

3. 检查执行文件权限与SELinux标签

  • 确认/system/bin/mydaemon权限为755:执行adb shell chmod 755 /system/bin/mydaemon
  • 确认SELinux标签正确:执行adb shell chcon u:object_r:system_file:s0 /system/bin/mydaemon,标签不符合要求时即使手动可执行,init进程也没有权限拉起服务
  • 若修改标签后仍无法启动,可临时执行adb shell setenforce 0关闭SELinux强制模式验证,若此时服务正常启动,说明缺少对应SELinux规则,新增允许init进程启动mydaemon的政策即可。

4. 调整服务启动时机

on boot阶段部分系统服务尚未初始化完成,可能出现程序依赖环境不存在直接闪退的问题,可将start指令移动到更晚的系统启动完成触发点,修改init.rc对应区段:

on property:sys.boot_completed=1
    start mydaemon

5. 查看init进程专属日志定位问题

普通logcat不会输出init进程的服务启动日志,可执行命令adb shell dmesg | grep init查看init进程的运行日志,里面会记录rc文件加载错误、服务启动失败的具体原因(如路径不存在、权限不足、SELinux拦截详情等),可根据报错信息针对性调整。

内容的提问来源于stack exchange,提问作者Jo-Jo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:27:02