跨进程协同
功能介绍
当 NavigationService 与 EHService 不在同一进程(甚至不在同一 App)时,可通过“导航内容同步地址”实现跨进程协同。
Android 侧对应入口是:
- 导航侧:
NavigationServiceOptions.Builder.setNavigationSyncAddress(address)
- EH 侧:
EHServiceOption.Builder.setNavigationSyncAddress(address)
两侧使用同一个地址字符串(tcp://<IPv4>:<port>),即可建立导航内容同步通道。
适用场景
- 导航主进程与 ADAS/EH 进程拆分部署
- 两个独立应用分别承载导航与 EH 能力
- 需要在不共享
NavigationService 实例的情况下复用导航上下文
接入前提
- 两侧都已完成
SDK.getInstance().initialize(...)
- 两侧地图数据与区域配置可正常工作
- 两侧约定统一的同步地址(建议先用
127.0.0.1 回环地址)
接入步骤
1) 约定同步地址
2) 导航进程配置
| val navigationService = NavigationService.Factory.createInstance(
NavigationServiceOptions.Builder()
.setNavigationSyncAddress("tcp://127.0.0.1:1234")
.build()
)
|
3) EH 进程配置
| val ehDataService = EHService.Factory.createEHDataService(
EHServiceOption.Builder()
.setServiceMode(EHServiceMode.AFFILIATE)
.setNavigationSyncAddress("tcp://127.0.0.1:1234")
.build()
)
|
或消息形态:
| val ehMessageService = EHService.Factory.createEHMessageService(
EHServiceOption.Builder()
.setServiceMode(EHServiceMode.AFFILIATE)
.setNavigationSyncAddress("tcp://127.0.0.1:1234")
.build()
)
|
4) 正常启动各自能力
- 导航侧按常规
startNavigation(...)
- EH 侧按常规注册
EHDataListener 或 EHMessageListener
与同进程联动的区别
| 场景 |
推荐方式 |
| 同进程(同 App 内) |
EHServiceMode.AFFILIATE + navigationService.addExtension(ehService) |
| 跨进程(双进程/双 App) |
两侧都设置 setNavigationSyncAddress(...),地址一致 |
跨进程场景通常不依赖直接共享 NavigationService 实例。
常见问题与排查
地址不一致
- 症状:EH 输出无法体现导航上下文联动
- 排查:确认导航侧与 EH 侧地址字符串完全一致(含端口)
地址为空或非法
- EH 侧如果地址为空会导致内部绑定失败,服务创建可能抛出
EHServiceException
- 建议统一封装地址配置并做参数校验
生命周期不一致
- EH 侧
dispose() 会解除内部 broker 绑定
- 如果 EH 进程提前销毁,跨进程同步会中断
端口冲突
- 同一设备上多个实例占用同端口会导致绑定/启动失败
- 建议固定一个业务端口并集中管理
注意事项
- 该机制用于“导航内容同步”,不替代定位输入链路;定位注入仍使用
injectLocationProvider(...)。
- 生产环境建议将地址配置下沉到统一配置中心,避免版本分叉造成地址漂移。