如何让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
相关产品推荐
相关产品推荐

