Android Vendor / init.rc

init.svc Daemon 一直 restarting:从退出点而不是权限猜测开始

Vendor Native Daemon 循环重启时,最有效的方法是先证明进程在哪一步退出,再判断是构建依赖、资源时序、SELinux 还是程序错误。

Vendor Daemoninit.rcinit.svc restartingSELinuxMTK Android

先判断进程为什么退出

init.svc.<service>=restarting 只是 init 的结果状态,不是根因。第一步应找到进程退出码、signal、linker 错误或最后一个初始化步骤,而不是立即增加 SELinux allow。

四类高频根因

二进制与依赖

安装路径错误、缺少 Vendor 动态库、ABI 不一致或 linker namespace 不允许加载。

启动参数与资源

配置文件不存在、设备节点尚未出现、Socket / 端口冲突或必要属性未准备。

SELinux / DAC

执行转换、设备节点、Property、文件或 Unix Socket 权限被拒绝。

程序自身退出

未处理初始化失败、空指针、线程异常、SIGPIPE 或把临时错误当成致命错误。

推荐排查流程

  1. 查看 init 和 linker 日志,确认是否进入 main()。
  2. 在每个初始化阶段增加明确日志和错误码。
  3. 临时手工启动同一二进制,比较环境与参数差异。
  4. 检查 ps -AZls -lZ 和 AVC,确认 Domain 与 Type。
  5. 对尚未准备的设备和服务使用有限退避重试,而不是立即退出。

量产配置目标

最终服务应由 init.rc 开机启动,运行在独立 Vendor Domain,使用最小 user / group,Socket 由 init 自动创建,临时资源缺失时可恢复,真正不可恢复的错误才退出并留下完整证据。