先判断进程为什么退出
init.svc.<service>=restarting 只是 init 的结果状态,不是根因。第一步应找到进程退出码、signal、linker 错误或最后一个初始化步骤,而不是立即增加 SELinux allow。
四类高频根因
二进制与依赖
安装路径错误、缺少 Vendor 动态库、ABI 不一致或 linker namespace 不允许加载。
启动参数与资源
配置文件不存在、设备节点尚未出现、Socket / 端口冲突或必要属性未准备。
SELinux / DAC
执行转换、设备节点、Property、文件或 Unix Socket 权限被拒绝。
程序自身退出
未处理初始化失败、空指针、线程异常、SIGPIPE 或把临时错误当成致命错误。
推荐排查流程
- 查看 init 和 linker 日志,确认是否进入 main()。
- 在每个初始化阶段增加明确日志和错误码。
- 临时手工启动同一二进制,比较环境与参数差异。
- 检查
ps -AZ、ls -lZ和 AVC,确认 Domain 与 Type。 - 对尚未准备的设备和服务使用有限退避重试,而不是立即退出。
量产配置目标
最终服务应由 init.rc 开机启动,运行在独立 Vendor Domain,使用最小 user / group,Socket 由 init 自动创建,临时资源缺失时可恢复,真正不可恢复的错误才退出并留下完整证据。