Google AAOS 中 SOME/IP 框架深度解析:从架构到实践
一、引言
1.1 背景
随着软件定义汽车(Software Defined Vehicle, SDV)时代的到来,汽车电子电气架构正从传统的分布式 ECU 向集中式高性能计算平台演进。在这一变革中,面向服务的通信协议成为连接各个功能域的关键纽带。SOME/IP(Scalable service-Oriented MiddlewarE over IP)作为 AUTOSAR 标准中定义的中间件协议,已成为车载以太网通信的事实标准。
Google 在 Android Automotive OS(AAOS)中引入了对 SOME/IP 的全面支持。其中 COVESA vsomeip 协议栈自 Android 14 (2023)起已包含在 AOSP 的 external/sdv/vsomeip 中;完整的 SOME/IP 框架(Broker Agent + AIDL Stack + SDV 集成)作为 AAOS SDV 扩展的核心组件,于 2026 年正式面向 Android 15+ / AAOS 25Qx 版本发布并开源。SOME/IP 被定位为连接 AAOS 与 AUTOSAR 生态的核心通信桥梁。
1.2 汽车 E/E 架构演进
#mermaid-svg-0M68hYtiNIoO8Ixv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-0M68hYtiNIoO8Ixv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-0M68hYtiNIoO8Ixv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-0M68hYtiNIoO8Ixv .error-icon{fill:#552222;}#mermaid-svg-0M68hYtiNIoO8Ixv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-0M68hYtiNIoO8Ixv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-0M68hYtiNIoO8Ixv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-0M68hYtiNIoO8Ixv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-0M68hYtiNIoO8Ixv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-0M68hYtiNIoO8Ixv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-0M68hYtiNIoO8Ixv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-0M68hYtiNIoO8Ixv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-0M68hYtiNIoO8Ixv .marker.cross{stroke:#333333;}#mermaid-svg-0M68hYtiNIoO8Ixv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-0M68hYtiNIoO8Ixv p{margin:0;}#mermaid-svg-0M68hYtiNIoO8Ixv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-0M68hYtiNIoO8Ixv .cluster-label text{fill:#333;}#mermaid-svg-0M68hYtiNIoO8Ixv .cluster-label span{color:#333;}#mermaid-svg-0M68hYtiNIoO8Ixv .cluster-label span p{background-color:transparent;}#mermaid-svg-0M68hYtiNIoO8Ixv .label text,#mermaid-svg-0M68hYtiNIoO8Ixv span{fill:#333;color:#333;}#mermaid-svg-0M68hYtiNIoO8Ixv .node rect,#mermaid-svg-0M68hYtiNIoO8Ixv .node circle,#mermaid-svg-0M68hYtiNIoO8Ixv .node ellipse,#mermaid-svg-0M68hYtiNIoO8Ixv .node polygon,#mermaid-svg-0M68hYtiNIoO8Ixv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-0M68hYtiNIoO8Ixv .rough-node .label text,#mermaid-svg-0M68hYtiNIoO8Ixv .node .label text,#mermaid-svg-0M68hYtiNIoO8Ixv .image-shape .label,#mermaid-svg-0M68hYtiNIoO8Ixv .icon-shape .label{text-anchor:middle;}#mermaid-svg-0M68hYtiNIoO8Ixv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-0M68hYtiNIoO8Ixv .rough-node .label,#mermaid-svg-0M68hYtiNIoO8Ixv .node .label,#mermaid-svg-0M68hYtiNIoO8Ixv .image-shape .label,#mermaid-svg-0M68hYtiNIoO8Ixv .icon-shape .label{text-align:center;}#mermaid-svg-0M68hYtiNIoO8Ixv .node.clickable{cursor:pointer;}#mermaid-svg-0M68hYtiNIoO8Ixv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-0M68hYtiNIoO8Ixv .arrowheadPath{fill:#333333;}#mermaid-svg-0M68hYtiNIoO8Ixv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-0M68hYtiNIoO8Ixv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-0M68hYtiNIoO8Ixv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0M68hYtiNIoO8Ixv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-0M68hYtiNIoO8Ixv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0M68hYtiNIoO8Ixv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-0M68hYtiNIoO8Ixv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-0M68hYtiNIoO8Ixv .cluster text{fill:#333;}#mermaid-svg-0M68hYtiNIoO8Ixv .cluster span{color:#333;}#mermaid-svg-0M68hYtiNIoO8Ixv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-0M68hYtiNIoO8Ixv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-0M68hYtiNIoO8Ixv rect.text{fill:none;stroke-width:0;}#mermaid-svg-0M68hYtiNIoO8Ixv .icon-shape,#mermaid-svg-0M68hYtiNIoO8Ixv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-0M68hYtiNIoO8Ixv .icon-shape p,#mermaid-svg-0M68hYtiNIoO8Ixv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-0M68hYtiNIoO8Ixv .icon-shape .label rect,#mermaid-svg-0M68hYtiNIoO8Ixv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-0M68hYtiNIoO8Ixv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-0M68hYtiNIoO8Ixv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-0M68hYtiNIoO8Ixv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 未来: 中央计算 + 区域网关
中央计算平台
AAOS SDV + IVI
Zone A Gateway
Zone B Gateway
Zone C Gateway
传感器/执行器
传感器/执行器
传感器/执行器
现在: 域集中式
域控制器: 车身
以太网骨干
域控制器: 底盘
域控制器: 智能座舱/AAOS
域控制器: ADAS
过去: 分布式架构
ECU: 车窗
CAN bus
ECU: 门锁
ECU: 灯光
ECU: 雨刮
1.3 本文目标
本文将深入剖析 Google AAOS 中的 SOME/IP 框架,涵盖以下内容:
- SOME/IP 协议基础与核心概念
- AAOS SDV 整体架构概览
- SOME/IP Broker Agent 的设计与原理
- SOME/IP Stack 的实现与 Binder API
- SOME/IP Mapping File 配置详解
- 部署与集成最佳实践
- 实际案例与代码分析
- 安全机制与 SELinux 配置
二、SOME/IP 协议基础
2.1 什么是 SOME/IP
SOME/IP(Scalable service-Oriented MiddlewarE over IP)是 AUTOSAR 定义的一种面向服务的中间件协议,运行于 IP 网络之上。它于 2011 年首次由 BMW 提出,现已成为汽车以太网通信的主流协议。
核心设计目标:
- 面向服务:支持服务发现、远程过程调用(RPC)和事件通知
- 可扩展:从嵌入式 ECU 到高性能计算平台均可适用
- 高带宽:充分利用以太网的吞吐能力
- 低延迟:针对实时场景优化
2.2 SOME/IP 在 OSI 模型中的位置
#mermaid-svg-5rr7JvJn6hX9hMHg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5rr7JvJn6hX9hMHg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5rr7JvJn6hX9hMHg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5rr7JvJn6hX9hMHg .error-icon{fill:#552222;}#mermaid-svg-5rr7JvJn6hX9hMHg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5rr7JvJn6hX9hMHg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5rr7JvJn6hX9hMHg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5rr7JvJn6hX9hMHg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5rr7JvJn6hX9hMHg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5rr7JvJn6hX9hMHg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5rr7JvJn6hX9hMHg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5rr7JvJn6hX9hMHg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5rr7JvJn6hX9hMHg .marker.cross{stroke:#333333;}#mermaid-svg-5rr7JvJn6hX9hMHg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5rr7JvJn6hX9hMHg p{margin:0;}#mermaid-svg-5rr7JvJn6hX9hMHg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5rr7JvJn6hX9hMHg .cluster-label text{fill:#333;}#mermaid-svg-5rr7JvJn6hX9hMHg .cluster-label span{color:#333;}#mermaid-svg-5rr7JvJn6hX9hMHg .cluster-label span p{background-color:transparent;}#mermaid-svg-5rr7JvJn6hX9hMHg .label text,#mermaid-svg-5rr7JvJn6hX9hMHg span{fill:#333;color:#333;}#mermaid-svg-5rr7JvJn6hX9hMHg .node rect,#mermaid-svg-5rr7JvJn6hX9hMHg .node circle,#mermaid-svg-5rr7JvJn6hX9hMHg .node ellipse,#mermaid-svg-5rr7JvJn6hX9hMHg .node polygon,#mermaid-svg-5rr7JvJn6hX9hMHg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5rr7JvJn6hX9hMHg .rough-node .label text,#mermaid-svg-5rr7JvJn6hX9hMHg .node .label text,#mermaid-svg-5rr7JvJn6hX9hMHg .image-shape .label,#mermaid-svg-5rr7JvJn6hX9hMHg .icon-shape .label{text-anchor:middle;}#mermaid-svg-5rr7JvJn6hX9hMHg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5rr7JvJn6hX9hMHg .rough-node .label,#mermaid-svg-5rr7JvJn6hX9hMHg .node .label,#mermaid-svg-5rr7JvJn6hX9hMHg .image-shape .label,#mermaid-svg-5rr7JvJn6hX9hMHg .icon-shape .label{text-align:center;}#mermaid-svg-5rr7JvJn6hX9hMHg .node.clickable{cursor:pointer;}#mermaid-svg-5rr7JvJn6hX9hMHg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5rr7JvJn6hX9hMHg .arrowheadPath{fill:#333333;}#mermaid-svg-5rr7JvJn6hX9hMHg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5rr7JvJn6hX9hMHg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5rr7JvJn6hX9hMHg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5rr7JvJn6hX9hMHg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5rr7JvJn6hX9hMHg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5rr7JvJn6hX9hMHg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5rr7JvJn6hX9hMHg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5rr7JvJn6hX9hMHg .cluster text{fill:#333;}#mermaid-svg-5rr7JvJn6hX9hMHg .cluster span{color:#333;}#mermaid-svg-5rr7JvJn6hX9hMHg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5rr7JvJn6hX9hMHg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5rr7JvJn6hX9hMHg rect.text{fill:none;stroke-width:0;}#mermaid-svg-5rr7JvJn6hX9hMHg .icon-shape,#mermaid-svg-5rr7JvJn6hX9hMHg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5rr7JvJn6hX9hMHg .icon-shape p,#mermaid-svg-5rr7JvJn6hX9hMHg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5rr7JvJn6hX9hMHg .icon-shape .label rect,#mermaid-svg-5rr7JvJn6hX9hMHg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5rr7JvJn6hX9hMHg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5rr7JvJn6hX9hMHg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5rr7JvJn6hX9hMHg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} OSI 模型 vs SOME/IP 协议栈
应用层 (Application Layer)
SDV Services / AUTOSAR SW-C
SOME/IP 序列化
表示层
SOME/IP Protocol
会话层
SOME/IP-SD (服务发现)
传输层
UDP / TCP
网络层
IPv4 / IPv6
数据链路层
Ethernet MAC
物理层
Ethernet PHY
2.3 SOME/IP 核心通信模式
SOME/IP 定义了三种基本的通信模式:
#mermaid-svg-stXye055Q5pmleKW{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-stXye055Q5pmleKW .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-stXye055Q5pmleKW .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-stXye055Q5pmleKW .error-icon{fill:#552222;}#mermaid-svg-stXye055Q5pmleKW .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-stXye055Q5pmleKW .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-stXye055Q5pmleKW .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-stXye055Q5pmleKW .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-stXye055Q5pmleKW .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-stXye055Q5pmleKW .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-stXye055Q5pmleKW .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-stXye055Q5pmleKW .marker{fill:#333333;stroke:#333333;}#mermaid-svg-stXye055Q5pmleKW .marker.cross{stroke:#333333;}#mermaid-svg-stXye055Q5pmleKW svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-stXye055Q5pmleKW p{margin:0;}#mermaid-svg-stXye055Q5pmleKW .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-stXye055Q5pmleKW .cluster-label text{fill:#333;}#mermaid-svg-stXye055Q5pmleKW .cluster-label span{color:#333;}#mermaid-svg-stXye055Q5pmleKW .cluster-label span p{background-color:transparent;}#mermaid-svg-stXye055Q5pmleKW .label text,#mermaid-svg-stXye055Q5pmleKW span{fill:#333;color:#333;}#mermaid-svg-stXye055Q5pmleKW .node rect,#mermaid-svg-stXye055Q5pmleKW .node circle,#mermaid-svg-stXye055Q5pmleKW .node ellipse,#mermaid-svg-stXye055Q5pmleKW .node polygon,#mermaid-svg-stXye055Q5pmleKW .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-stXye055Q5pmleKW .rough-node .label text,#mermaid-svg-stXye055Q5pmleKW .node .label text,#mermaid-svg-stXye055Q5pmleKW .image-shape .label,#mermaid-svg-stXye055Q5pmleKW .icon-shape .label{text-anchor:middle;}#mermaid-svg-stXye055Q5pmleKW .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-stXye055Q5pmleKW .rough-node .label,#mermaid-svg-stXye055Q5pmleKW .node .label,#mermaid-svg-stXye055Q5pmleKW .image-shape .label,#mermaid-svg-stXye055Q5pmleKW .icon-shape .label{text-align:center;}#mermaid-svg-stXye055Q5pmleKW .node.clickable{cursor:pointer;}#mermaid-svg-stXye055Q5pmleKW .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-stXye055Q5pmleKW .arrowheadPath{fill:#333333;}#mermaid-svg-stXye055Q5pmleKW .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-stXye055Q5pmleKW .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-stXye055Q5pmleKW .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-stXye055Q5pmleKW .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-stXye055Q5pmleKW .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-stXye055Q5pmleKW .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-stXye055Q5pmleKW .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-stXye055Q5pmleKW .cluster text{fill:#333;}#mermaid-svg-stXye055Q5pmleKW .cluster span{color:#333;}#mermaid-svg-stXye055Q5pmleKW div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-stXye055Q5pmleKW .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-stXye055Q5pmleKW rect.text{fill:none;stroke-width:0;}#mermaid-svg-stXye055Q5pmleKW .icon-shape,#mermaid-svg-stXye055Q5pmleKW .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-stXye055Q5pmleKW .icon-shape p,#mermaid-svg-stXye055Q5pmleKW .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-stXye055Q5pmleKW .icon-shape .label rect,#mermaid-svg-stXye055Q5pmleKW .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-stXye055Q5pmleKW .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-stXye055Q5pmleKW .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-stXye055Q5pmleKW :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} ④ Field
Getter
Setter
Notifier (push)
Client
Server
③ 事件通知 (Event Notification)
NOTIFICATION (Event)
Server/Publisher
Subscriber
② Fire & Forget
REQUEST (no response)
Client
Server
① RPC (请求/响应)
REQUEST (Method ID)
RESPONSE (Return Code)
Client
Server
1. 远程过程调用(RPC)
方法(Method)调用,支持两种方式:
- 请求/响应(Request/Response):客户端发送请求,服务端返回响应,典型的同步调用
- Fire & Forget:客户端发送请求,不等待响应,适用于无需确认的场景
2. 事件通知(Event Notification)
服务端主动向已订阅的客户端推送事件。事件通过 Event Group 进行逻辑分组,客户端订阅 Event Group 后即可接收组内所有事件。
3. 字段(Field)
结合了 Getter、Setter 和 Notifier 三种操作,可视为对某个状态属性的远程访问抽象。
2.4 SOME/IP 服务发现(SD)
SOME/IP 服务发现(Service Discovery, SOME/IP-SD)是协议的关键组成部分,它通过 UDP 多播实现以下功能:
服务端 (ECU-B) UDP 多播 客户端 (ECU-A) 服务端 (ECU-B) UDP 多播 客户端 (ECU-A) #mermaid-svg-r6QmlE7mbBZx7ghx{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-r6QmlE7mbBZx7ghx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-r6QmlE7mbBZx7ghx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-r6QmlE7mbBZx7ghx .error-icon{fill:#552222;}#mermaid-svg-r6QmlE7mbBZx7ghx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-r6QmlE7mbBZx7ghx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-r6QmlE7mbBZx7ghx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-r6QmlE7mbBZx7ghx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-r6QmlE7mbBZx7ghx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-r6QmlE7mbBZx7ghx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-r6QmlE7mbBZx7ghx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-r6QmlE7mbBZx7ghx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-r6QmlE7mbBZx7ghx .marker.cross{stroke:#333333;}#mermaid-svg-r6QmlE7mbBZx7ghx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-r6QmlE7mbBZx7ghx p{margin:0;}#mermaid-svg-r6QmlE7mbBZx7ghx .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-r6QmlE7mbBZx7ghx text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-r6QmlE7mbBZx7ghx .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-r6QmlE7mbBZx7ghx .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-r6QmlE7mbBZx7ghx .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-r6QmlE7mbBZx7ghx .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-r6QmlE7mbBZx7ghx #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-r6QmlE7mbBZx7ghx .sequenceNumber{fill:white;}#mermaid-svg-r6QmlE7mbBZx7ghx #sequencenumber{fill:#333;}#mermaid-svg-r6QmlE7mbBZx7ghx #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-r6QmlE7mbBZx7ghx .messageText{fill:#333;stroke:none;}#mermaid-svg-r6QmlE7mbBZx7ghx .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-r6QmlE7mbBZx7ghx .labelText,#mermaid-svg-r6QmlE7mbBZx7ghx .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-r6QmlE7mbBZx7ghx .loopText,#mermaid-svg-r6QmlE7mbBZx7ghx .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-r6QmlE7mbBZx7ghx .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-r6QmlE7mbBZx7ghx .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-r6QmlE7mbBZx7ghx .noteText,#mermaid-svg-r6QmlE7mbBZx7ghx .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-r6QmlE7mbBZx7ghx .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-r6QmlE7mbBZx7ghx .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-r6QmlE7mbBZx7ghx .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-r6QmlE7mbBZx7ghx .actorPopupMenu{position:absolute;}#mermaid-svg-r6QmlE7mbBZx7ghx .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-r6QmlE7mbBZx7ghx .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-r6QmlE7mbBZx7ghx .actor-man circle,#mermaid-svg-r6QmlE7mbBZx7ghx line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-r6QmlE7mbBZx7ghx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 阶段1: 服务发现 阶段2: 订阅事件 阶段3: 数据通信 阶段4: 保活监控 OfferService (SID=0x1001, Instance=0x0001) FindService (SID=0x1001) 多播转发 OfferService SubscribeEventGroup (EG=1) SubscribeEventGroupAck Event Notification (车速: 60km/h) Event Notification (车速: 65km/h) OfferService (renew) SubscribeEventGroup (renew)
SD 协议使用以下关键消息类型:
| 消息类型 | 方向 | 用途 |
|---|---|---|
| OfferService | 服务端 -> 多播 | 宣告服务可用 |
| FindService | 客户端 -> 多播 | 查找特定服务 |
| SubscribeEventGroup | 客户端 -> 服务端 | 订阅事件组 |
| SubscribeEventGroupAck | 服务端 -> 客户端 | 确认订阅 |
2.5 SOME/IP 协议格式
SOME/IP 消息头固定为 16 字节:
text
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message ID (Service ID / Method ID) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Length (Payload + Header) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Request ID (Client ID / Session ID) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Protocol Version | Interface Ver | Message Type | Return Code |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
关键字段说明:
- Message ID(32 位):高 16 位为 Service ID,低 16 位为 Method ID/Event ID
- Length(32 位):从下一个字段开始到消息结束的长度
- Request ID(32 位):高 16 位为 Client ID,低 16 位为 Session ID
- Protocol Version(8 位):协议版本,当前为 1
- Interface Version(8 位):服务接口版本
- Message Type(8 位):消息类型(REQUEST=0x00, RESPONSE=0x80, NOTIFICATION=0x02 等)
- Return Code(8 位):返回码
2.6 SOME/IP 协议栈架构
#mermaid-svg-GVTHzOKrWSe9nWXn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-GVTHzOKrWSe9nWXn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-GVTHzOKrWSe9nWXn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-GVTHzOKrWSe9nWXn .error-icon{fill:#552222;}#mermaid-svg-GVTHzOKrWSe9nWXn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-GVTHzOKrWSe9nWXn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-GVTHzOKrWSe9nWXn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-GVTHzOKrWSe9nWXn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-GVTHzOKrWSe9nWXn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-GVTHzOKrWSe9nWXn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-GVTHzOKrWSe9nWXn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-GVTHzOKrWSe9nWXn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-GVTHzOKrWSe9nWXn .marker.cross{stroke:#333333;}#mermaid-svg-GVTHzOKrWSe9nWXn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-GVTHzOKrWSe9nWXn p{margin:0;}#mermaid-svg-GVTHzOKrWSe9nWXn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-GVTHzOKrWSe9nWXn .cluster-label text{fill:#333;}#mermaid-svg-GVTHzOKrWSe9nWXn .cluster-label span{color:#333;}#mermaid-svg-GVTHzOKrWSe9nWXn .cluster-label span p{background-color:transparent;}#mermaid-svg-GVTHzOKrWSe9nWXn .label text,#mermaid-svg-GVTHzOKrWSe9nWXn span{fill:#333;color:#333;}#mermaid-svg-GVTHzOKrWSe9nWXn .node rect,#mermaid-svg-GVTHzOKrWSe9nWXn .node circle,#mermaid-svg-GVTHzOKrWSe9nWXn .node ellipse,#mermaid-svg-GVTHzOKrWSe9nWXn .node polygon,#mermaid-svg-GVTHzOKrWSe9nWXn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-GVTHzOKrWSe9nWXn .rough-node .label text,#mermaid-svg-GVTHzOKrWSe9nWXn .node .label text,#mermaid-svg-GVTHzOKrWSe9nWXn .image-shape .label,#mermaid-svg-GVTHzOKrWSe9nWXn .icon-shape .label{text-anchor:middle;}#mermaid-svg-GVTHzOKrWSe9nWXn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-GVTHzOKrWSe9nWXn .rough-node .label,#mermaid-svg-GVTHzOKrWSe9nWXn .node .label,#mermaid-svg-GVTHzOKrWSe9nWXn .image-shape .label,#mermaid-svg-GVTHzOKrWSe9nWXn .icon-shape .label{text-align:center;}#mermaid-svg-GVTHzOKrWSe9nWXn .node.clickable{cursor:pointer;}#mermaid-svg-GVTHzOKrWSe9nWXn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-GVTHzOKrWSe9nWXn .arrowheadPath{fill:#333333;}#mermaid-svg-GVTHzOKrWSe9nWXn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-GVTHzOKrWSe9nWXn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-GVTHzOKrWSe9nWXn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GVTHzOKrWSe9nWXn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-GVTHzOKrWSe9nWXn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GVTHzOKrWSe9nWXn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-GVTHzOKrWSe9nWXn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-GVTHzOKrWSe9nWXn .cluster text{fill:#333;}#mermaid-svg-GVTHzOKrWSe9nWXn .cluster span{color:#333;}#mermaid-svg-GVTHzOKrWSe9nWXn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-GVTHzOKrWSe9nWXn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-GVTHzOKrWSe9nWXn rect.text{fill:none;stroke-width:0;}#mermaid-svg-GVTHzOKrWSe9nWXn .icon-shape,#mermaid-svg-GVTHzOKrWSe9nWXn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-GVTHzOKrWSe9nWXn .icon-shape p,#mermaid-svg-GVTHzOKrWSe9nWXn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-GVTHzOKrWSe9nWXn .icon-shape .label rect,#mermaid-svg-GVTHzOKrWSe9nWXn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-GVTHzOKrWSe9nWXn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-GVTHzOKrWSe9nWXn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-GVTHzOKrWSe9nWXn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SOME/IP Implementation Layers
Application
(Service Logic)
SOME/IP Serialization
(CommonAPI Skeleton/Proxy)
SOME/IP Runtime
(Message Routing)
SOME/IP Service Discovery
(Offer/Find/Subscribe)
Magic Cookie 0x00000000
(Protocol Validation)
Transport Layer
UDP (MTU ≤ 1400) / TCP (Segmentation)
Network Layer
IP:Port
三、AAOS SDV 整体架构
3.1 AAOS SDV 概述
AAOS SDV 是 Google 在传统 AAOS IVI(Infotainment)基础上扩展的全新架构,旨在将 Android 从车载信息娱乐系统延伸到更广泛的车辆控制域,包括:
- 仪表盘(Instrument Cluster)
- 车身控制(Body Control)
- 底盘控制(Chassis)
- ADAS 集成(QM 级)
3.2 整车架构全景
#mermaid-svg-UqQBImhoRn7eb8bX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-UqQBImhoRn7eb8bX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-UqQBImhoRn7eb8bX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-UqQBImhoRn7eb8bX .error-icon{fill:#552222;}#mermaid-svg-UqQBImhoRn7eb8bX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-UqQBImhoRn7eb8bX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-UqQBImhoRn7eb8bX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-UqQBImhoRn7eb8bX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-UqQBImhoRn7eb8bX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-UqQBImhoRn7eb8bX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-UqQBImhoRn7eb8bX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-UqQBImhoRn7eb8bX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-UqQBImhoRn7eb8bX .marker.cross{stroke:#333333;}#mermaid-svg-UqQBImhoRn7eb8bX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-UqQBImhoRn7eb8bX p{margin:0;}#mermaid-svg-UqQBImhoRn7eb8bX .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-UqQBImhoRn7eb8bX .cluster-label text{fill:#333;}#mermaid-svg-UqQBImhoRn7eb8bX .cluster-label span{color:#333;}#mermaid-svg-UqQBImhoRn7eb8bX .cluster-label span p{background-color:transparent;}#mermaid-svg-UqQBImhoRn7eb8bX .label text,#mermaid-svg-UqQBImhoRn7eb8bX span{fill:#333;color:#333;}#mermaid-svg-UqQBImhoRn7eb8bX .node rect,#mermaid-svg-UqQBImhoRn7eb8bX .node circle,#mermaid-svg-UqQBImhoRn7eb8bX .node ellipse,#mermaid-svg-UqQBImhoRn7eb8bX .node polygon,#mermaid-svg-UqQBImhoRn7eb8bX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-UqQBImhoRn7eb8bX .rough-node .label text,#mermaid-svg-UqQBImhoRn7eb8bX .node .label text,#mermaid-svg-UqQBImhoRn7eb8bX .image-shape .label,#mermaid-svg-UqQBImhoRn7eb8bX .icon-shape .label{text-anchor:middle;}#mermaid-svg-UqQBImhoRn7eb8bX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-UqQBImhoRn7eb8bX .rough-node .label,#mermaid-svg-UqQBImhoRn7eb8bX .node .label,#mermaid-svg-UqQBImhoRn7eb8bX .image-shape .label,#mermaid-svg-UqQBImhoRn7eb8bX .icon-shape .label{text-align:center;}#mermaid-svg-UqQBImhoRn7eb8bX .node.clickable{cursor:pointer;}#mermaid-svg-UqQBImhoRn7eb8bX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-UqQBImhoRn7eb8bX .arrowheadPath{fill:#333333;}#mermaid-svg-UqQBImhoRn7eb8bX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-UqQBImhoRn7eb8bX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-UqQBImhoRn7eb8bX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UqQBImhoRn7eb8bX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-UqQBImhoRn7eb8bX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UqQBImhoRn7eb8bX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-UqQBImhoRn7eb8bX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-UqQBImhoRn7eb8bX .cluster text{fill:#333;}#mermaid-svg-UqQBImhoRn7eb8bX .cluster span{color:#333;}#mermaid-svg-UqQBImhoRn7eb8bX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-UqQBImhoRn7eb8bX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-UqQBImhoRn7eb8bX rect.text{fill:none;stroke-width:0;}#mermaid-svg-UqQBImhoRn7eb8bX .icon-shape,#mermaid-svg-UqQBImhoRn7eb8bX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-UqQBImhoRn7eb8bX .icon-shape p,#mermaid-svg-UqQBImhoRn7eb8bX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-UqQBImhoRn7eb8bX .icon-shape .label rect,#mermaid-svg-UqQBImhoRn7eb8bX .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-UqQBImhoRn7eb8bX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-UqQBImhoRn7eb8bX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-UqQBImhoRn7eb8bX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 车辆网络
车端 SoC 多 VM 环境
云端 (Cloud)
AAOS SDV Core VM
AAOS SDV Cluster VM
SDV Media Engine
Display Safety
(safety-critical rendering)
Telltale/Warning Lights
AAOS IVI VM
IVI 应用
导航/媒体/语音
Vehicle HAL
Android Framework
Cuttlefish 数字孪生
云端虚拟开发环境
Android Studio for Platform
(ASfP) Tooling
SDV Core OS
(headless Android)
SDV CommStack
SOME/IP Broker + Stack
Diagnostics Framework
Telemetry Engine
Hypervisor (VirtIO)
IVI_VM
SDV_VM
CLU_VM
CAN/FlexRay Bus
传统 ECU 网络
Gigabit Ethernet
AUTOSAR SOME/IP ECUs
BCM
(车身控制)
GW
(中央网关)
ADAS
(感知系统)
3.3 多虚拟机架构
AAOS SDV 运行在 SoC 上的多虚拟机环境中:
text
+----------------------------------------------------------+
| Automotive SoC |
| +---------------------------+ +------------------------+|
| | AAOS IVI (VM) | | AAOS SDV (VM) ||
| | - 信息娱乐 | | - 仪表盘 ||
| | - 导航 | | - 车身控制 ||
| | - 语音助手 | | - SDV Core Services ||
| +---------------------------+ +------------------------+|
| | Hypervisor ||
| +--------------------------------------------------------+|
| | Vehicle Network (CAN/Ethernet) ||
| +--------------------------------------------------------+|
+----------------------------------------------------------+
AAOS SDV 是一个 headless(无头)的 Android 实例,没有图形界面,专注于运行核心车辆服务。它通过 VirtIO 驱动与 hypervisor 交互,这种设计使得同一系统镜像既可以运行在云端虚拟环境(Cuttlefish)中,也可以部署在实车硬件上。
3.4 SDV 通信栈层次
AAOS SDV 的通信栈分为清晰的层次:
text
+----------------------------------------------------+
| SDV Application/Services |
+----------------------------------------------------+
| SDV CommStack Primitives |
+---------------------------+------------------------+
| SOME/IP Broker Agent | Other Brokers |
+---------------------------+------------------------+
| SOME/IP Stack (AIDL) | |
+---------------------------+------------------------+
| vsomeip / COVESA | Other Protocols |
+---------------------------+------------------------+
| IP Network (Ethernet) |
+----------------------------------------------------+
关键组件:
- SOME/IP Broker Agent:SDV 与 SOME/IP 网络之间的代理,核心翻译引擎
- SOME/IP Stack:通过 AIDL 抽象的低层 SOME/IP 传输逻辑,实现(如 COVESA vsomeip)
- VSIDL Catalog Provider:提供运行时类型信息(RTTI),管理接口、主题和映射信息
3.5 SDV 核心通信架构
#mermaid-svg-SroT4Nksb2fAMf8b{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SroT4Nksb2fAMf8b .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SroT4Nksb2fAMf8b .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SroT4Nksb2fAMf8b .error-icon{fill:#552222;}#mermaid-svg-SroT4Nksb2fAMf8b .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SroT4Nksb2fAMf8b .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SroT4Nksb2fAMf8b .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SroT4Nksb2fAMf8b .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SroT4Nksb2fAMf8b .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SroT4Nksb2fAMf8b .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SroT4Nksb2fAMf8b .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SroT4Nksb2fAMf8b .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SroT4Nksb2fAMf8b .marker.cross{stroke:#333333;}#mermaid-svg-SroT4Nksb2fAMf8b svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SroT4Nksb2fAMf8b p{margin:0;}#mermaid-svg-SroT4Nksb2fAMf8b .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-SroT4Nksb2fAMf8b .cluster-label text{fill:#333;}#mermaid-svg-SroT4Nksb2fAMf8b .cluster-label span{color:#333;}#mermaid-svg-SroT4Nksb2fAMf8b .cluster-label span p{background-color:transparent;}#mermaid-svg-SroT4Nksb2fAMf8b .label text,#mermaid-svg-SroT4Nksb2fAMf8b span{fill:#333;color:#333;}#mermaid-svg-SroT4Nksb2fAMf8b .node rect,#mermaid-svg-SroT4Nksb2fAMf8b .node circle,#mermaid-svg-SroT4Nksb2fAMf8b .node ellipse,#mermaid-svg-SroT4Nksb2fAMf8b .node polygon,#mermaid-svg-SroT4Nksb2fAMf8b .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-SroT4Nksb2fAMf8b .rough-node .label text,#mermaid-svg-SroT4Nksb2fAMf8b .node .label text,#mermaid-svg-SroT4Nksb2fAMf8b .image-shape .label,#mermaid-svg-SroT4Nksb2fAMf8b .icon-shape .label{text-anchor:middle;}#mermaid-svg-SroT4Nksb2fAMf8b .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-SroT4Nksb2fAMf8b .rough-node .label,#mermaid-svg-SroT4Nksb2fAMf8b .node .label,#mermaid-svg-SroT4Nksb2fAMf8b .image-shape .label,#mermaid-svg-SroT4Nksb2fAMf8b .icon-shape .label{text-align:center;}#mermaid-svg-SroT4Nksb2fAMf8b .node.clickable{cursor:pointer;}#mermaid-svg-SroT4Nksb2fAMf8b .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-SroT4Nksb2fAMf8b .arrowheadPath{fill:#333333;}#mermaid-svg-SroT4Nksb2fAMf8b .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-SroT4Nksb2fAMf8b .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-SroT4Nksb2fAMf8b .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SroT4Nksb2fAMf8b .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-SroT4Nksb2fAMf8b .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SroT4Nksb2fAMf8b .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-SroT4Nksb2fAMf8b .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-SroT4Nksb2fAMf8b .cluster text{fill:#333;}#mermaid-svg-SroT4Nksb2fAMf8b .cluster span{color:#333;}#mermaid-svg-SroT4Nksb2fAMf8b div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-SroT4Nksb2fAMf8b .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-SroT4Nksb2fAMf8b rect.text{fill:none;stroke-width:0;}#mermaid-svg-SroT4Nksb2fAMf8b .icon-shape,#mermaid-svg-SroT4Nksb2fAMf8b .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-SroT4Nksb2fAMf8b .icon-shape p,#mermaid-svg-SroT4Nksb2fAMf8b .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-SroT4Nksb2fAMf8b .icon-shape .label rect,#mermaid-svg-SroT4Nksb2fAMf8b .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-SroT4Nksb2fAMf8b .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-SroT4Nksb2fAMf8b .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-SroT4Nksb2fAMf8b :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 物理网络
传输层
协议代理层
CommStack 中间件层
SDV 服务层
车辆信号服务
(VehicleSignals)
车身控制服务
(BodyControl)
诊断服务
(Diagnostics)
CommStack Primitives
(发布/订阅 / RPC / 服务发现)
SOME/IP Broker Agent
(类型翻译 + 路由)
Diagnostics Broker
(UDS over IP)
SOME/IP Stack (AIDL ISomeIpStack)
(vsomeip wrapper)
Diagnostics Stack
(DoIP)
车载以太网 / CAN
3.6 VSIDL(Vehicle Services Interactive Data Language)
VSIDL 是 AAOS SDV 中用于定义车辆服务接口的语言,类似于 AIDL 但扩展了车辆领域的语义。它使用 Protocol Buffers 作为底层序列化格式。
#mermaid-svg-me1LzrJE7ZqXdO3F{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-me1LzrJE7ZqXdO3F .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-me1LzrJE7ZqXdO3F .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-me1LzrJE7ZqXdO3F .error-icon{fill:#552222;}#mermaid-svg-me1LzrJE7ZqXdO3F .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-me1LzrJE7ZqXdO3F .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-me1LzrJE7ZqXdO3F .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-me1LzrJE7ZqXdO3F .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-me1LzrJE7ZqXdO3F .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-me1LzrJE7ZqXdO3F .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-me1LzrJE7ZqXdO3F .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-me1LzrJE7ZqXdO3F .marker{fill:#333333;stroke:#333333;}#mermaid-svg-me1LzrJE7ZqXdO3F .marker.cross{stroke:#333333;}#mermaid-svg-me1LzrJE7ZqXdO3F svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-me1LzrJE7ZqXdO3F p{margin:0;}#mermaid-svg-me1LzrJE7ZqXdO3F .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-me1LzrJE7ZqXdO3F .cluster-label text{fill:#333;}#mermaid-svg-me1LzrJE7ZqXdO3F .cluster-label span{color:#333;}#mermaid-svg-me1LzrJE7ZqXdO3F .cluster-label span p{background-color:transparent;}#mermaid-svg-me1LzrJE7ZqXdO3F .label text,#mermaid-svg-me1LzrJE7ZqXdO3F span{fill:#333;color:#333;}#mermaid-svg-me1LzrJE7ZqXdO3F .node rect,#mermaid-svg-me1LzrJE7ZqXdO3F .node circle,#mermaid-svg-me1LzrJE7ZqXdO3F .node ellipse,#mermaid-svg-me1LzrJE7ZqXdO3F .node polygon,#mermaid-svg-me1LzrJE7ZqXdO3F .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-me1LzrJE7ZqXdO3F .rough-node .label text,#mermaid-svg-me1LzrJE7ZqXdO3F .node .label text,#mermaid-svg-me1LzrJE7ZqXdO3F .image-shape .label,#mermaid-svg-me1LzrJE7ZqXdO3F .icon-shape .label{text-anchor:middle;}#mermaid-svg-me1LzrJE7ZqXdO3F .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-me1LzrJE7ZqXdO3F .rough-node .label,#mermaid-svg-me1LzrJE7ZqXdO3F .node .label,#mermaid-svg-me1LzrJE7ZqXdO3F .image-shape .label,#mermaid-svg-me1LzrJE7ZqXdO3F .icon-shape .label{text-align:center;}#mermaid-svg-me1LzrJE7ZqXdO3F .node.clickable{cursor:pointer;}#mermaid-svg-me1LzrJE7ZqXdO3F .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-me1LzrJE7ZqXdO3F .arrowheadPath{fill:#333333;}#mermaid-svg-me1LzrJE7ZqXdO3F .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-me1LzrJE7ZqXdO3F .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-me1LzrJE7ZqXdO3F .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-me1LzrJE7ZqXdO3F .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-me1LzrJE7ZqXdO3F .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-me1LzrJE7ZqXdO3F .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-me1LzrJE7ZqXdO3F .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-me1LzrJE7ZqXdO3F .cluster text{fill:#333;}#mermaid-svg-me1LzrJE7ZqXdO3F .cluster span{color:#333;}#mermaid-svg-me1LzrJE7ZqXdO3F div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-me1LzrJE7ZqXdO3F .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-me1LzrJE7ZqXdO3F rect.text{fill:none;stroke-width:0;}#mermaid-svg-me1LzrJE7ZqXdO3F .icon-shape,#mermaid-svg-me1LzrJE7ZqXdO3F .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-me1LzrJE7ZqXdO3F .icon-shape p,#mermaid-svg-me1LzrJE7ZqXdO3F .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-me1LzrJE7ZqXdO3F .icon-shape .label rect,#mermaid-svg-me1LzrJE7ZqXdO3F .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-me1LzrJE7ZqXdO3F .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-me1LzrJE7ZqXdO3F .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-me1LzrJE7ZqXdO3F :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} VSIDL 编译流程
*.vsidl 文件
(服务定义 + SOME/IP 映射)
VSIDL Parser
vsidl_rc_generator
Code Generator
Runtime Config
(Broker 使用的映射表)
Rust Service Stub
Generated Protobuf
VSIDL 的核心概念:
- Service Bundle:一组相关服务的集合
- Service Unit:最小的服务功能单元
- Topic:发布/订阅模式中的通信主题
- RPC Interface:远程过程调用接口
- Type:数据类型定义
四、SOME/IP Broker Agent 深入分析
4.1 Broker 的角色与职责
SOME/IP Broker Agent(以下简称 Broker)是 AAOS SDV 中 SOME/IP 集成的核心组件,它的主要职责包括:
- 协议翻译:在 SDV 通信原语和 SOME/IP 协议之间进行双向翻译
- 服务代理:作为 SDV 服务和 AUTOSAR 服务之间的代理
- 类型映射:基于 RTTI 在运行时处理服务特定的数据翻译
- 路由管理:管理多个 SOME/IP 域之间的消息路由
4.2 Broker 核心架构
#mermaid-svg-ncrmf5j44cDbbCAQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ncrmf5j44cDbbCAQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ncrmf5j44cDbbCAQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ncrmf5j44cDbbCAQ .error-icon{fill:#552222;}#mermaid-svg-ncrmf5j44cDbbCAQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ncrmf5j44cDbbCAQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ncrmf5j44cDbbCAQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ncrmf5j44cDbbCAQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ncrmf5j44cDbbCAQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ncrmf5j44cDbbCAQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ncrmf5j44cDbbCAQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ncrmf5j44cDbbCAQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ncrmf5j44cDbbCAQ .marker.cross{stroke:#333333;}#mermaid-svg-ncrmf5j44cDbbCAQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ncrmf5j44cDbbCAQ p{margin:0;}#mermaid-svg-ncrmf5j44cDbbCAQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ncrmf5j44cDbbCAQ .cluster-label text{fill:#333;}#mermaid-svg-ncrmf5j44cDbbCAQ .cluster-label span{color:#333;}#mermaid-svg-ncrmf5j44cDbbCAQ .cluster-label span p{background-color:transparent;}#mermaid-svg-ncrmf5j44cDbbCAQ .label text,#mermaid-svg-ncrmf5j44cDbbCAQ span{fill:#333;color:#333;}#mermaid-svg-ncrmf5j44cDbbCAQ .node rect,#mermaid-svg-ncrmf5j44cDbbCAQ .node circle,#mermaid-svg-ncrmf5j44cDbbCAQ .node ellipse,#mermaid-svg-ncrmf5j44cDbbCAQ .node polygon,#mermaid-svg-ncrmf5j44cDbbCAQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ncrmf5j44cDbbCAQ .rough-node .label text,#mermaid-svg-ncrmf5j44cDbbCAQ .node .label text,#mermaid-svg-ncrmf5j44cDbbCAQ .image-shape .label,#mermaid-svg-ncrmf5j44cDbbCAQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-ncrmf5j44cDbbCAQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ncrmf5j44cDbbCAQ .rough-node .label,#mermaid-svg-ncrmf5j44cDbbCAQ .node .label,#mermaid-svg-ncrmf5j44cDbbCAQ .image-shape .label,#mermaid-svg-ncrmf5j44cDbbCAQ .icon-shape .label{text-align:center;}#mermaid-svg-ncrmf5j44cDbbCAQ .node.clickable{cursor:pointer;}#mermaid-svg-ncrmf5j44cDbbCAQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ncrmf5j44cDbbCAQ .arrowheadPath{fill:#333333;}#mermaid-svg-ncrmf5j44cDbbCAQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ncrmf5j44cDbbCAQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ncrmf5j44cDbbCAQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ncrmf5j44cDbbCAQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ncrmf5j44cDbbCAQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ncrmf5j44cDbbCAQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ncrmf5j44cDbbCAQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ncrmf5j44cDbbCAQ .cluster text{fill:#333;}#mermaid-svg-ncrmf5j44cDbbCAQ .cluster span{color:#333;}#mermaid-svg-ncrmf5j44cDbbCAQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ncrmf5j44cDbbCAQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ncrmf5j44cDbbCAQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-ncrmf5j44cDbbCAQ .icon-shape,#mermaid-svg-ncrmf5j44cDbbCAQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ncrmf5j44cDbbCAQ .icon-shape p,#mermaid-svg-ncrmf5j44cDbbCAQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ncrmf5j44cDbbCAQ .icon-shape .label rect,#mermaid-svg-ncrmf5j44cDbbCAQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ncrmf5j44cDbbCAQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ncrmf5j44cDbbCAQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ncrmf5j44cDbbCAQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SOME/IP Network Side
SOME/IP Broker Agent
SDV Service Side
Egress Pipeline
Translation Engine
Ingress Pipeline
SDV Application
CommStack Primitives
(Topic/ServiceUnit)
RPC Request Handler
Event Notification Handler
Service Discovery Handler
RTTI Type Engine
(Field-level reflection)
Message Router
(SID-based dispatch)
Archetype Manager
(RPC / Data Tunnel)
RPC Method Invoker
Event Publisher
SD Offer/Subscribe
ISomeIpStack AIDL Binder
SOME/IP Stack (vsomeip)
Ethernet SOME/IP Network
4.3 Broker 的 Archetype(原型)
Broker 使用"原型"(Archetype)来抽象通信模式:
1. RPC Archetype(远程过程调用)
处理请求/响应模式的通信。SDV 侧的方法调用被转换为 SOME/IP 的 Method 调用,反之亦然。
AUTOSAR ECU SOME/IP Stack SOME/IP Broker SDV Service AUTOSAR ECU SOME/IP Stack SOME/IP Broker SDV Service #mermaid-svg-4bAJ1JWDnLa33wJr{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4bAJ1JWDnLa33wJr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4bAJ1JWDnLa33wJr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4bAJ1JWDnLa33wJr .error-icon{fill:#552222;}#mermaid-svg-4bAJ1JWDnLa33wJr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4bAJ1JWDnLa33wJr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4bAJ1JWDnLa33wJr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4bAJ1JWDnLa33wJr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4bAJ1JWDnLa33wJr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4bAJ1JWDnLa33wJr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4bAJ1JWDnLa33wJr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4bAJ1JWDnLa33wJr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4bAJ1JWDnLa33wJr .marker.cross{stroke:#333333;}#mermaid-svg-4bAJ1JWDnLa33wJr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4bAJ1JWDnLa33wJr p{margin:0;}#mermaid-svg-4bAJ1JWDnLa33wJr .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4bAJ1JWDnLa33wJr text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-4bAJ1JWDnLa33wJr .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-4bAJ1JWDnLa33wJr .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-4bAJ1JWDnLa33wJr .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-4bAJ1JWDnLa33wJr .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-4bAJ1JWDnLa33wJr #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-4bAJ1JWDnLa33wJr .sequenceNumber{fill:white;}#mermaid-svg-4bAJ1JWDnLa33wJr #sequencenumber{fill:#333;}#mermaid-svg-4bAJ1JWDnLa33wJr #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-4bAJ1JWDnLa33wJr .messageText{fill:#333;stroke:none;}#mermaid-svg-4bAJ1JWDnLa33wJr .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4bAJ1JWDnLa33wJr .labelText,#mermaid-svg-4bAJ1JWDnLa33wJr .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-4bAJ1JWDnLa33wJr .loopText,#mermaid-svg-4bAJ1JWDnLa33wJr .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-4bAJ1JWDnLa33wJr .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-4bAJ1JWDnLa33wJr .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-4bAJ1JWDnLa33wJr .noteText,#mermaid-svg-4bAJ1JWDnLa33wJr .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-4bAJ1JWDnLa33wJr .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4bAJ1JWDnLa33wJr .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4bAJ1JWDnLa33wJr .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-4bAJ1JWDnLa33wJr .actorPopupMenu{position:absolute;}#mermaid-svg-4bAJ1JWDnLa33wJr .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-4bAJ1JWDnLa33wJr .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-4bAJ1JWDnLa33wJr .actor-man circle,#mermaid-svg-4bAJ1JWDnLa33wJr line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-4bAJ1JWDnLa33wJr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} RPC Archetype 处理 callMethod(LockDoors) 查询 RTTI: DoorControl 映射 构造 SOME/IP 请求头 rpc_transact(SID=0x2001, MethodID=0x0001, payload) SOME/IP REQUEST (UDP/TCP) SOME/IP RESPONSE (return code) SomeIpResponse 解析响应 payload (RTTI) 返回结果
2. Data Tunnel Archetype(数据隧道)
处理发布/订阅模式的数据流,适用于周期性信号或事件通知。
AUTOSAR Sensor ECU SOME/IP Stack SOME/IP Broker SDV Subscriber AUTOSAR Sensor ECU SOME/IP Stack SOME/IP Broker SDV Subscriber #mermaid-svg-1WdPpfFZIGTx5A95{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1WdPpfFZIGTx5A95 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1WdPpfFZIGTx5A95 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1WdPpfFZIGTx5A95 .error-icon{fill:#552222;}#mermaid-svg-1WdPpfFZIGTx5A95 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1WdPpfFZIGTx5A95 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1WdPpfFZIGTx5A95 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1WdPpfFZIGTx5A95 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1WdPpfFZIGTx5A95 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1WdPpfFZIGTx5A95 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1WdPpfFZIGTx5A95 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1WdPpfFZIGTx5A95 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1WdPpfFZIGTx5A95 .marker.cross{stroke:#333333;}#mermaid-svg-1WdPpfFZIGTx5A95 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1WdPpfFZIGTx5A95 p{margin:0;}#mermaid-svg-1WdPpfFZIGTx5A95 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-1WdPpfFZIGTx5A95 text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-1WdPpfFZIGTx5A95 .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-1WdPpfFZIGTx5A95 .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-1WdPpfFZIGTx5A95 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-1WdPpfFZIGTx5A95 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-1WdPpfFZIGTx5A95 #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-1WdPpfFZIGTx5A95 .sequenceNumber{fill:white;}#mermaid-svg-1WdPpfFZIGTx5A95 #sequencenumber{fill:#333;}#mermaid-svg-1WdPpfFZIGTx5A95 #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-1WdPpfFZIGTx5A95 .messageText{fill:#333;stroke:none;}#mermaid-svg-1WdPpfFZIGTx5A95 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-1WdPpfFZIGTx5A95 .labelText,#mermaid-svg-1WdPpfFZIGTx5A95 .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-1WdPpfFZIGTx5A95 .loopText,#mermaid-svg-1WdPpfFZIGTx5A95 .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-1WdPpfFZIGTx5A95 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-1WdPpfFZIGTx5A95 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-1WdPpfFZIGTx5A95 .noteText,#mermaid-svg-1WdPpfFZIGTx5A95 .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-1WdPpfFZIGTx5A95 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-1WdPpfFZIGTx5A95 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-1WdPpfFZIGTx5A95 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-1WdPpfFZIGTx5A95 .actorPopupMenu{position:absolute;}#mermaid-svg-1WdPpfFZIGTx5A95 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-1WdPpfFZIGTx5A95 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-1WdPpfFZIGTx5A95 .actor-man circle,#mermaid-svg-1WdPpfFZIGTx5A95 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-1WdPpfFZIGTx5A95 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 订阅阶段 数据推送阶段 subscribe_topic("vehicle_speed") subscribe(SID=0x1001, EG=1, EventID=0x8001) SOME/IP SubscribeEventGroup SubscribeEventGroupAck SOME/IP NOTIFICATION (车速 60km/h) on_event_notification(SID, EventID, payload) RTTI 反序列化 payload ->> SpeedData proto topic_update("vehicle_speed", SpeedData{speed:60}) SOME/IP NOTIFICATION (车速 65km/h) on_event_notification(...) topic_update("vehicle_speed", SpeedData{speed:65})
4.4 运行时类型信息(RTTI)引擎工作流程
#mermaid-svg-fC8w3BGrTYcCJvzO{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fC8w3BGrTYcCJvzO .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fC8w3BGrTYcCJvzO .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fC8w3BGrTYcCJvzO .error-icon{fill:#552222;}#mermaid-svg-fC8w3BGrTYcCJvzO .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fC8w3BGrTYcCJvzO .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fC8w3BGrTYcCJvzO .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fC8w3BGrTYcCJvzO .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fC8w3BGrTYcCJvzO .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fC8w3BGrTYcCJvzO .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fC8w3BGrTYcCJvzO .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fC8w3BGrTYcCJvzO .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fC8w3BGrTYcCJvzO .marker.cross{stroke:#333333;}#mermaid-svg-fC8w3BGrTYcCJvzO svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fC8w3BGrTYcCJvzO p{margin:0;}#mermaid-svg-fC8w3BGrTYcCJvzO .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fC8w3BGrTYcCJvzO .cluster-label text{fill:#333;}#mermaid-svg-fC8w3BGrTYcCJvzO .cluster-label span{color:#333;}#mermaid-svg-fC8w3BGrTYcCJvzO .cluster-label span p{background-color:transparent;}#mermaid-svg-fC8w3BGrTYcCJvzO .label text,#mermaid-svg-fC8w3BGrTYcCJvzO span{fill:#333;color:#333;}#mermaid-svg-fC8w3BGrTYcCJvzO .node rect,#mermaid-svg-fC8w3BGrTYcCJvzO .node circle,#mermaid-svg-fC8w3BGrTYcCJvzO .node ellipse,#mermaid-svg-fC8w3BGrTYcCJvzO .node polygon,#mermaid-svg-fC8w3BGrTYcCJvzO .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fC8w3BGrTYcCJvzO .rough-node .label text,#mermaid-svg-fC8w3BGrTYcCJvzO .node .label text,#mermaid-svg-fC8w3BGrTYcCJvzO .image-shape .label,#mermaid-svg-fC8w3BGrTYcCJvzO .icon-shape .label{text-anchor:middle;}#mermaid-svg-fC8w3BGrTYcCJvzO .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fC8w3BGrTYcCJvzO .rough-node .label,#mermaid-svg-fC8w3BGrTYcCJvzO .node .label,#mermaid-svg-fC8w3BGrTYcCJvzO .image-shape .label,#mermaid-svg-fC8w3BGrTYcCJvzO .icon-shape .label{text-align:center;}#mermaid-svg-fC8w3BGrTYcCJvzO .node.clickable{cursor:pointer;}#mermaid-svg-fC8w3BGrTYcCJvzO .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fC8w3BGrTYcCJvzO .arrowheadPath{fill:#333333;}#mermaid-svg-fC8w3BGrTYcCJvzO .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fC8w3BGrTYcCJvzO .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fC8w3BGrTYcCJvzO .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fC8w3BGrTYcCJvzO .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fC8w3BGrTYcCJvzO .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fC8w3BGrTYcCJvzO .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fC8w3BGrTYcCJvzO .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fC8w3BGrTYcCJvzO .cluster text{fill:#333;}#mermaid-svg-fC8w3BGrTYcCJvzO .cluster span{color:#333;}#mermaid-svg-fC8w3BGrTYcCJvzO div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fC8w3BGrTYcCJvzO .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fC8w3BGrTYcCJvzO rect.text{fill:none;stroke-width:0;}#mermaid-svg-fC8w3BGrTYcCJvzO .icon-shape,#mermaid-svg-fC8w3BGrTYcCJvzO .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fC8w3BGrTYcCJvzO .icon-shape p,#mermaid-svg-fC8w3BGrTYcCJvzO .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fC8w3BGrTYcCJvzO .icon-shape .label rect,#mermaid-svg-fC8w3BGrTYcCJvzO .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fC8w3BGrTYcCJvzO .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fC8w3BGrTYcCJvzO .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fC8w3BGrTYcCJvzO :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Event Notification
RPC Response
RPC Request
是
否
Broker 接收到网络消息
消息类型?
提取 Service ID + Event ID
提取 Service ID + Method ID
提取 Service ID + Method ID
查询 VSIDL Catalog (RTTI)
RTTI 命中?
获取字段级序列化/反序列化指令
回退到 opaque binary 模式
反射引擎: 在 SDV Proto 和
SOME/IP Binary 之间转换
透传原始 payload
转换完成
交付给上层/下层
RTTI 引擎的工作流程:
- Broker 从 VSIDL Catalog Provider 加载类型信息
- 当收到消息时,Broker 根据服务 ID 和方法/事件 ID 查询 RTTI
- RTTI 提供字段级别的序列化/反序列化指令
- Broker 使用反射机制在 SDV proto 和 SOME/IP 二进制 payload 之间转换
这种设计使得 Broker 无需为每种服务类型重新编译,大大提高了灵活性和可扩展性。
4.5 RTTI 类型翻译示例
#mermaid-svg-RcXM1V1oMxdDsl78{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-RcXM1V1oMxdDsl78 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-RcXM1V1oMxdDsl78 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-RcXM1V1oMxdDsl78 .error-icon{fill:#552222;}#mermaid-svg-RcXM1V1oMxdDsl78 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-RcXM1V1oMxdDsl78 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-RcXM1V1oMxdDsl78 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-RcXM1V1oMxdDsl78 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-RcXM1V1oMxdDsl78 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-RcXM1V1oMxdDsl78 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-RcXM1V1oMxdDsl78 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-RcXM1V1oMxdDsl78 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-RcXM1V1oMxdDsl78 .marker.cross{stroke:#333333;}#mermaid-svg-RcXM1V1oMxdDsl78 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-RcXM1V1oMxdDsl78 p{margin:0;}#mermaid-svg-RcXM1V1oMxdDsl78 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-RcXM1V1oMxdDsl78 .cluster-label text{fill:#333;}#mermaid-svg-RcXM1V1oMxdDsl78 .cluster-label span{color:#333;}#mermaid-svg-RcXM1V1oMxdDsl78 .cluster-label span p{background-color:transparent;}#mermaid-svg-RcXM1V1oMxdDsl78 .label text,#mermaid-svg-RcXM1V1oMxdDsl78 span{fill:#333;color:#333;}#mermaid-svg-RcXM1V1oMxdDsl78 .node rect,#mermaid-svg-RcXM1V1oMxdDsl78 .node circle,#mermaid-svg-RcXM1V1oMxdDsl78 .node ellipse,#mermaid-svg-RcXM1V1oMxdDsl78 .node polygon,#mermaid-svg-RcXM1V1oMxdDsl78 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-RcXM1V1oMxdDsl78 .rough-node .label text,#mermaid-svg-RcXM1V1oMxdDsl78 .node .label text,#mermaid-svg-RcXM1V1oMxdDsl78 .image-shape .label,#mermaid-svg-RcXM1V1oMxdDsl78 .icon-shape .label{text-anchor:middle;}#mermaid-svg-RcXM1V1oMxdDsl78 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-RcXM1V1oMxdDsl78 .rough-node .label,#mermaid-svg-RcXM1V1oMxdDsl78 .node .label,#mermaid-svg-RcXM1V1oMxdDsl78 .image-shape .label,#mermaid-svg-RcXM1V1oMxdDsl78 .icon-shape .label{text-align:center;}#mermaid-svg-RcXM1V1oMxdDsl78 .node.clickable{cursor:pointer;}#mermaid-svg-RcXM1V1oMxdDsl78 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-RcXM1V1oMxdDsl78 .arrowheadPath{fill:#333333;}#mermaid-svg-RcXM1V1oMxdDsl78 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-RcXM1V1oMxdDsl78 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-RcXM1V1oMxdDsl78 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RcXM1V1oMxdDsl78 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-RcXM1V1oMxdDsl78 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RcXM1V1oMxdDsl78 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-RcXM1V1oMxdDsl78 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-RcXM1V1oMxdDsl78 .cluster text{fill:#333;}#mermaid-svg-RcXM1V1oMxdDsl78 .cluster span{color:#333;}#mermaid-svg-RcXM1V1oMxdDsl78 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-RcXM1V1oMxdDsl78 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-RcXM1V1oMxdDsl78 rect.text{fill:none;stroke-width:0;}#mermaid-svg-RcXM1V1oMxdDsl78 .icon-shape,#mermaid-svg-RcXM1V1oMxdDsl78 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-RcXM1V1oMxdDsl78 .icon-shape p,#mermaid-svg-RcXM1V1oMxdDsl78 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-RcXM1V1oMxdDsl78 .icon-shape .label rect,#mermaid-svg-RcXM1V1oMxdDsl78 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-RcXM1V1oMxdDsl78 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-RcXM1V1oMxdDsl78 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-RcXM1V1oMxdDsl78 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SDV Protobuf
RTTI Type Info
SOME/IP Binary Payload
04 00 00 00
42 48 00 00
01
struct SpeedData {
speed_kph: FLOAT32 (offset=0)
quality: UINT8 (offset=4)
}
SpeedData {
speed_kph: 50.0
quality: 1
}
0x42 48 00 00 = 50.0f
0x01 = quality=1
Reflection-based
automatic translation
4.6 多实例部署
Broker 支持部署为单个或多个实例:
单实例模式:一个 Broker 处理所有 SOME/IP 域,配置简单,适合开发测试。
多实例模式:将不同 SOME/IP 域(或子网)隔离到独立的 Broker 实例中:
text
+------------------------------------+
| AAOS SDV Core VM |
| +------------------+ +------------------+
| | Broker Instance 1 | | Broker Instance 2 |
| | Domain: Body/ | | Domain: ADAS/ |
| | Chassis/Signals | | Diagnostics |
| | SID range: 0x0001 | | SID range: 0x4000 |
| | - 0x3FFF | | - 0x7FFF |
| +--------+---------+ +--------+---------+
| | |
+-----------+----------------------+----------+
| |
v v
SOME/IP VLAN 1 SOME/IP VLAN 2
(10.0.1.0/24) (10.0.2.0/24)
多实例模式的好处:
- 负载均衡
- 安全隔离
- 故障隔离
关键限制:每个实例必须处理不重叠的 SOME/IP 和 SDV 端点集合,不支持跨代理的路由或同步。错误的配置可能导致重复发布或不一致的服务发现结果。
五、SOME/IP Stack 实现详解
5.1 架构层次
SOME/IP Stack 是 Broker 之下的低层传输层,负责实际的 SOME/IP 协议处理:
text
+--------------------------------------------------+
| SOME/IP Broker Agent |
+--------------------------------------------------+
| Binder (AIDL) ISomeIpStack Interface |
+---------------------------+----------------------+
| Reference Stack | OEM Custom Stack |
| (vsomeip wrapper) | (production) |
+---------------------------+----------------------+
| UDP/TCP Socket Layer |
+--------------------------------------------------+
5.2 Stack 内部架构
#mermaid-svg-sjTP0cJN68j1h5bC{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-sjTP0cJN68j1h5bC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-sjTP0cJN68j1h5bC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-sjTP0cJN68j1h5bC .error-icon{fill:#552222;}#mermaid-svg-sjTP0cJN68j1h5bC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sjTP0cJN68j1h5bC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-sjTP0cJN68j1h5bC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sjTP0cJN68j1h5bC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sjTP0cJN68j1h5bC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-sjTP0cJN68j1h5bC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sjTP0cJN68j1h5bC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sjTP0cJN68j1h5bC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sjTP0cJN68j1h5bC .marker.cross{stroke:#333333;}#mermaid-svg-sjTP0cJN68j1h5bC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sjTP0cJN68j1h5bC p{margin:0;}#mermaid-svg-sjTP0cJN68j1h5bC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-sjTP0cJN68j1h5bC .cluster-label text{fill:#333;}#mermaid-svg-sjTP0cJN68j1h5bC .cluster-label span{color:#333;}#mermaid-svg-sjTP0cJN68j1h5bC .cluster-label span p{background-color:transparent;}#mermaid-svg-sjTP0cJN68j1h5bC .label text,#mermaid-svg-sjTP0cJN68j1h5bC span{fill:#333;color:#333;}#mermaid-svg-sjTP0cJN68j1h5bC .node rect,#mermaid-svg-sjTP0cJN68j1h5bC .node circle,#mermaid-svg-sjTP0cJN68j1h5bC .node ellipse,#mermaid-svg-sjTP0cJN68j1h5bC .node polygon,#mermaid-svg-sjTP0cJN68j1h5bC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sjTP0cJN68j1h5bC .rough-node .label text,#mermaid-svg-sjTP0cJN68j1h5bC .node .label text,#mermaid-svg-sjTP0cJN68j1h5bC .image-shape .label,#mermaid-svg-sjTP0cJN68j1h5bC .icon-shape .label{text-anchor:middle;}#mermaid-svg-sjTP0cJN68j1h5bC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-sjTP0cJN68j1h5bC .rough-node .label,#mermaid-svg-sjTP0cJN68j1h5bC .node .label,#mermaid-svg-sjTP0cJN68j1h5bC .image-shape .label,#mermaid-svg-sjTP0cJN68j1h5bC .icon-shape .label{text-align:center;}#mermaid-svg-sjTP0cJN68j1h5bC .node.clickable{cursor:pointer;}#mermaid-svg-sjTP0cJN68j1h5bC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-sjTP0cJN68j1h5bC .arrowheadPath{fill:#333333;}#mermaid-svg-sjTP0cJN68j1h5bC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-sjTP0cJN68j1h5bC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-sjTP0cJN68j1h5bC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sjTP0cJN68j1h5bC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-sjTP0cJN68j1h5bC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sjTP0cJN68j1h5bC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-sjTP0cJN68j1h5bC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-sjTP0cJN68j1h5bC .cluster text{fill:#333;}#mermaid-svg-sjTP0cJN68j1h5bC .cluster span{color:#333;}#mermaid-svg-sjTP0cJN68j1h5bC div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-sjTP0cJN68j1h5bC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-sjTP0cJN68j1h5bC rect.text{fill:none;stroke-width:0;}#mermaid-svg-sjTP0cJN68j1h5bC .icon-shape,#mermaid-svg-sjTP0cJN68j1h5bC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-sjTP0cJN68j1h5bC .icon-shape p,#mermaid-svg-sjTP0cJN68j1h5bC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-sjTP0cJN68j1h5bC .icon-shape .label rect,#mermaid-svg-sjTP0cJN68j1h5bC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-sjTP0cJN68j1h5bC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-sjTP0cJN68j1h5bC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-sjTP0cJN68j1h5bC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Kernel / Hardware
SOME/IP Stack Agent Process
AAOS Process Boundary
vsomeip (COVESA)
AIDL Binder Layer
Binder IPC
SELinux Sandbox
Context: sdv_someip_stack_default
Binder: only to broker
Network: port binding restricted
File: /data/vendor/vsomeip/
SOME/IP Broker Agent
(Java/Native)
ISomeIpStack.aidl
AIDL Adapter
(Binder -> Native Call)
vsomeip Application Layer
(sdv_someip_stack_agent)
vsomeip Routing Manager
(routingmanagerd)
vsomeip Service Discovery
(UDP Multicast)
vsomeip Network Layer
(UDP/TCP Sockets)
UDP Socket
Port 30490 (SD)
TCP Socket
Data Transport
5.3 ISomeIpStack AIDL 接口
Google 定义了标准的 ISomeIpStack AIDL 接口,位于 core_services/some_ip/aidl/google/sdv/someip/:
服务可用性管理:
java
interface ISomeIpStack {
// 注册服务可用性变化的回调
void register_availability_callback(ISomeIpAvailabilityCallback callback);
// 取消注册服务可用性回调
void unregister_availability_callback(ISomeIpAvailabilityCallback callback);
// 指示 Stack 监控特定服务的可用性
void monitor_service(in ServiceId serviceId);
// SDV 服务可用性变化通知
void on_sdv_service_availability(in ServiceId serviceId, boolean available);
}
远程过程调用(RPC):
java
interface ISomeIpStack {
// 发送 RPC 请求并等待响应
SomeIpResponse rpc_transact(in SomeIpRequest request);
// 发送 RPC 请求(Fire & Forget,不等待响应)
void rpc_oneway(in SomeIpRequest request);
// 注册传入 RPC 请求的回调
void register_rpc_request_callback(ISomeIpRpcRequestCallback callback);
// 取消注册 RPC 请求回调
void unregister_rpc_request_callback(ISomeIpRpcRequestCallback callback);
}
事件通知:
java
interface ISomeIpStack {
// 注册订阅事件通知的回调
void register_event_notification_callback(ISomeIpEventNotificationCallback callback);
// 取消注册事件通知回调
void unregister_event_notification_callback(ISomeIpEventNotificationCallback callback);
// SDV 主题可用性变化通知
void on_sdv_topic_availability(in String topicName, boolean available);
// 订阅特定事件组中的事件
void subscribe(in ServiceId serviceId, int eventGroupId, int eventId);
// 取消订阅
void unsubscribe(in ServiceId serviceId, int eventGroupId, int eventId);
// 发布事件
void publish(in ServiceId serviceId, int eventId, in byte[] payload);
}
5.4 参考实现:COVESA vsomeip Wrapper
AAOS SDV 提供了一个基于 COVESA vsomeip 的非生产参考实现。这个参考实现是一个薄封装层,将 vsomeip 的原生 C++ API 适配到上述 AIDL 接口。
启动配置(init.rc):
rc
# device/google/sdv/sdv_core_cf/init.sdv_core_cf.rc
service sdv_someip_stack_agent /vendor/bin/sdv_someip_stack_agent
class core
disabled
user system
group system
setenv VSOMEIP_CONFIGURATION /vendor/etc/someip/vsomeip_config.json
setenv VSOMEIP_BASE_PATH /data/vendor/vsomeip/
on property:dev.bootcomplete=1 && property:ro.boot.sdv.someip.enable=true
start sdv_someip_stack_agent
vsomeip 配置文件示例:
json
{
"unicast": "192.168.1.10",
"logging": {
"level": "debug",
"console": true,
"file": {
"enable": true,
"path": "/data/vendor/vsomeip/vsomeip.log"
}
},
"applications": [
{
"name": "sdv_someip_stack_agent",
"id": 0x0001
}
],
"service_discovery": {
"enable": true,
"multicast": "224.224.224.245",
"port": 30490,
"protocol": "udp"
},
"services": {
"local": [],
"remote": []
}
}
5.5 Stack 的职责边界
SOME/IP Stack 的职责有明确的边界:
- 负责:SOME/IP 有线格式的编解码、服务发现协议、UDP/TCP socket 管理
- 不负责:payload 内容的理解和翻译(payload 被视为不透明二进制 blob 转发给 Broker)
这种关注点分离使得 Stack 可以专注于高效的数据传输,而 Broker 处理业务逻辑的翻译。
5.6 AIDL 接口交互流程
Remote AUTOSAR ECU vsomeip Network vsomeip SD vsomeip Wrapper ISomeIpStack AIDL SOME/IP Broker Remote AUTOSAR ECU vsomeip Network vsomeip SD vsomeip Wrapper ISomeIpStack AIDL SOME/IP Broker #mermaid-svg-IjAbjCvRBoQ8FFsv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IjAbjCvRBoQ8FFsv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IjAbjCvRBoQ8FFsv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IjAbjCvRBoQ8FFsv .error-icon{fill:#552222;}#mermaid-svg-IjAbjCvRBoQ8FFsv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IjAbjCvRBoQ8FFsv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IjAbjCvRBoQ8FFsv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IjAbjCvRBoQ8FFsv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IjAbjCvRBoQ8FFsv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IjAbjCvRBoQ8FFsv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IjAbjCvRBoQ8FFsv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IjAbjCvRBoQ8FFsv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IjAbjCvRBoQ8FFsv .marker.cross{stroke:#333333;}#mermaid-svg-IjAbjCvRBoQ8FFsv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IjAbjCvRBoQ8FFsv p{margin:0;}#mermaid-svg-IjAbjCvRBoQ8FFsv .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IjAbjCvRBoQ8FFsv text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-IjAbjCvRBoQ8FFsv .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IjAbjCvRBoQ8FFsv .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-IjAbjCvRBoQ8FFsv .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-IjAbjCvRBoQ8FFsv .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-IjAbjCvRBoQ8FFsv #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-IjAbjCvRBoQ8FFsv .sequenceNumber{fill:white;}#mermaid-svg-IjAbjCvRBoQ8FFsv #sequencenumber{fill:#333;}#mermaid-svg-IjAbjCvRBoQ8FFsv #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-IjAbjCvRBoQ8FFsv .messageText{fill:#333;stroke:none;}#mermaid-svg-IjAbjCvRBoQ8FFsv .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IjAbjCvRBoQ8FFsv .labelText,#mermaid-svg-IjAbjCvRBoQ8FFsv .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-IjAbjCvRBoQ8FFsv .loopText,#mermaid-svg-IjAbjCvRBoQ8FFsv .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-IjAbjCvRBoQ8FFsv .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-IjAbjCvRBoQ8FFsv .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-IjAbjCvRBoQ8FFsv .noteText,#mermaid-svg-IjAbjCvRBoQ8FFsv .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-IjAbjCvRBoQ8FFsv .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IjAbjCvRBoQ8FFsv .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IjAbjCvRBoQ8FFsv .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-IjAbjCvRBoQ8FFsv .actorPopupMenu{position:absolute;}#mermaid-svg-IjAbjCvRBoQ8FFsv .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-IjAbjCvRBoQ8FFsv .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-IjAbjCvRBoQ8FFsv .actor-man circle,#mermaid-svg-IjAbjCvRBoQ8FFsv line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-IjAbjCvRBoQ8FFsv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 初始化阶段 服务发现阶段 数据通信阶段 register_availability_callback(cb) register_event_notification_callback(cb) register_rpc_request_callback(cb) monitor_service(SID=0x1001) monitor_service(0x1001) sd_subscribe(SID=0x1001) Send FindService (UDP Multicast) FindService OfferService SD Message on_availability(0x1001, available=true) on_sdv_service_availability(0x1001, true) on_sdv_service_availability callback subscribe(SID=0x1001, EG=1, EventID=0x8001) subscribe(0x1001, 1, 0x8001) SubscribeEventGroup Send SubscribeEG SubscribeEventGroup SubscribeEventGroupAck Event Notification (车速 payload) on_message(SID, EventID, payload) on_event_notification(SID, EventID, payload) 事件回调
六、SOME/IP 映射文件配置(Mapping File)
6.1 映射文件概述
SOME/IP 映射文件定义了 SDV 服务与 SOME/IP 服务之间的映射关系,是实现跨协议通信的关键配置。
#mermaid-svg-PMmPFf2BVQ4HLLrH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-PMmPFf2BVQ4HLLrH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-PMmPFf2BVQ4HLLrH .error-icon{fill:#552222;}#mermaid-svg-PMmPFf2BVQ4HLLrH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PMmPFf2BVQ4HLLrH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PMmPFf2BVQ4HLLrH .marker.cross{stroke:#333333;}#mermaid-svg-PMmPFf2BVQ4HLLrH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PMmPFf2BVQ4HLLrH p{margin:0;}#mermaid-svg-PMmPFf2BVQ4HLLrH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PMmPFf2BVQ4HLLrH .cluster-label text{fill:#333;}#mermaid-svg-PMmPFf2BVQ4HLLrH .cluster-label span{color:#333;}#mermaid-svg-PMmPFf2BVQ4HLLrH .cluster-label span p{background-color:transparent;}#mermaid-svg-PMmPFf2BVQ4HLLrH .label text,#mermaid-svg-PMmPFf2BVQ4HLLrH span{fill:#333;color:#333;}#mermaid-svg-PMmPFf2BVQ4HLLrH .node rect,#mermaid-svg-PMmPFf2BVQ4HLLrH .node circle,#mermaid-svg-PMmPFf2BVQ4HLLrH .node ellipse,#mermaid-svg-PMmPFf2BVQ4HLLrH .node polygon,#mermaid-svg-PMmPFf2BVQ4HLLrH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PMmPFf2BVQ4HLLrH .rough-node .label text,#mermaid-svg-PMmPFf2BVQ4HLLrH .node .label text,#mermaid-svg-PMmPFf2BVQ4HLLrH .image-shape .label,#mermaid-svg-PMmPFf2BVQ4HLLrH .icon-shape .label{text-anchor:middle;}#mermaid-svg-PMmPFf2BVQ4HLLrH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-PMmPFf2BVQ4HLLrH .rough-node .label,#mermaid-svg-PMmPFf2BVQ4HLLrH .node .label,#mermaid-svg-PMmPFf2BVQ4HLLrH .image-shape .label,#mermaid-svg-PMmPFf2BVQ4HLLrH .icon-shape .label{text-align:center;}#mermaid-svg-PMmPFf2BVQ4HLLrH .node.clickable{cursor:pointer;}#mermaid-svg-PMmPFf2BVQ4HLLrH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-PMmPFf2BVQ4HLLrH .arrowheadPath{fill:#333333;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PMmPFf2BVQ4HLLrH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PMmPFf2BVQ4HLLrH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-PMmPFf2BVQ4HLLrH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PMmPFf2BVQ4HLLrH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-PMmPFf2BVQ4HLLrH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PMmPFf2BVQ4HLLrH .cluster text{fill:#333;}#mermaid-svg-PMmPFf2BVQ4HLLrH .cluster span{color:#333;}#mermaid-svg-PMmPFf2BVQ4HLLrH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PMmPFf2BVQ4HLLrH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-PMmPFf2BVQ4HLLrH rect.text{fill:none;stroke-width:0;}#mermaid-svg-PMmPFf2BVQ4HLLrH .icon-shape,#mermaid-svg-PMmPFf2BVQ4HLLrH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-PMmPFf2BVQ4HLLrH .icon-shape p,#mermaid-svg-PMmPFf2BVQ4HLLrH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-PMmPFf2BVQ4HLLrH .icon-shape .label rect,#mermaid-svg-PMmPFf2BVQ4HLLrH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-PMmPFf2BVQ4HLLrH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-PMmPFf2BVQ4HLLrH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-PMmPFf2BVQ4HLLrH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SOME/IP Network
Mapping File (Protocol Buffers)
SDV Ecosystem
SDV Service
(Rust/Java)
Topic: vehicle_speed
RPC: LockDoors()
SomeIpMapping Proto
sdv_type_mapping
someip_service_mapping
Service ID: 0x1001
Event ID: 0x8001
Method ID: 0x0001
映射信息嵌入在 VSIDL 文件(.vsidl)的 VsidlEntry 消息中,作为一个 repeated 字段 some_ip_mapping:
protobuf
// VSIDL 文件的根消息
message VsidlEntry {
// 必需:文件中实体的包名
string package = 1;
// SDV 服务束列表
repeated ServiceBundle sdv_service_bundle = 2;
// 自定义扩展
repeated google.protobuf.Any extension = 3;
// SOME/IP 映射规则
repeated sdv.someip.v1.SomeIpMapping some_ip_mapping = 4;
// VHAL 映射规则
repeated VhalMapping vhal_mapping = 5;
}
6.2 核心标识符概念
理解映射文件前必须掌握以下标识符:
| 标识符 | 范围 | 说明 |
|---|---|---|
| SDV FQIN | SDV | Fully Qualified Instance Name,标识 SDV 服务实例 |
| SDV Type | SDV | 数据格式的唯一标识,对应 proto message |
| SOME/IP SID | SOME/IP | Service ID (uint16) + Instance ID (uint16) + 版本 (uint8 + uint32) |
| SDV RPC Method | SDV | 方法名 + 所在 Type + Channel 名称 |
| SDV Pub/Sub Topic | SDV | Type + Topic 名称 |
| SOME/IP Method ID | SOME/IP | Service ID + Instance ID + Method ID (uint16) |
| SOME/IP Event | SOME/IP | Service ID + Instance ID + Event ID (uint16) + EventGroup ID (uint16) |
6.3 两种映射方式的对比
#mermaid-svg-5824p9tiG8OXbdWc{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5824p9tiG8OXbdWc .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5824p9tiG8OXbdWc .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5824p9tiG8OXbdWc .error-icon{fill:#552222;}#mermaid-svg-5824p9tiG8OXbdWc .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5824p9tiG8OXbdWc .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5824p9tiG8OXbdWc .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5824p9tiG8OXbdWc .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5824p9tiG8OXbdWc .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5824p9tiG8OXbdWc .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5824p9tiG8OXbdWc .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5824p9tiG8OXbdWc .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5824p9tiG8OXbdWc .marker.cross{stroke:#333333;}#mermaid-svg-5824p9tiG8OXbdWc svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5824p9tiG8OXbdWc p{margin:0;}#mermaid-svg-5824p9tiG8OXbdWc .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-5824p9tiG8OXbdWc .cluster-label text{fill:#333;}#mermaid-svg-5824p9tiG8OXbdWc .cluster-label span{color:#333;}#mermaid-svg-5824p9tiG8OXbdWc .cluster-label span p{background-color:transparent;}#mermaid-svg-5824p9tiG8OXbdWc .label text,#mermaid-svg-5824p9tiG8OXbdWc span{fill:#333;color:#333;}#mermaid-svg-5824p9tiG8OXbdWc .node rect,#mermaid-svg-5824p9tiG8OXbdWc .node circle,#mermaid-svg-5824p9tiG8OXbdWc .node ellipse,#mermaid-svg-5824p9tiG8OXbdWc .node polygon,#mermaid-svg-5824p9tiG8OXbdWc .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5824p9tiG8OXbdWc .rough-node .label text,#mermaid-svg-5824p9tiG8OXbdWc .node .label text,#mermaid-svg-5824p9tiG8OXbdWc .image-shape .label,#mermaid-svg-5824p9tiG8OXbdWc .icon-shape .label{text-anchor:middle;}#mermaid-svg-5824p9tiG8OXbdWc .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-5824p9tiG8OXbdWc .rough-node .label,#mermaid-svg-5824p9tiG8OXbdWc .node .label,#mermaid-svg-5824p9tiG8OXbdWc .image-shape .label,#mermaid-svg-5824p9tiG8OXbdWc .icon-shape .label{text-align:center;}#mermaid-svg-5824p9tiG8OXbdWc .node.clickable{cursor:pointer;}#mermaid-svg-5824p9tiG8OXbdWc .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-5824p9tiG8OXbdWc .arrowheadPath{fill:#333333;}#mermaid-svg-5824p9tiG8OXbdWc .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5824p9tiG8OXbdWc .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5824p9tiG8OXbdWc .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5824p9tiG8OXbdWc .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-5824p9tiG8OXbdWc .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5824p9tiG8OXbdWc .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-5824p9tiG8OXbdWc .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5824p9tiG8OXbdWc .cluster text{fill:#333;}#mermaid-svg-5824p9tiG8OXbdWc .cluster span{color:#333;}#mermaid-svg-5824p9tiG8OXbdWc div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5824p9tiG8OXbdWc .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-5824p9tiG8OXbdWc rect.text{fill:none;stroke-width:0;}#mermaid-svg-5824p9tiG8OXbdWc .icon-shape,#mermaid-svg-5824p9tiG8OXbdWc .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-5824p9tiG8OXbdWc .icon-shape p,#mermaid-svg-5824p9tiG8OXbdWc .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-5824p9tiG8OXbdWc .icon-shape .label rect,#mermaid-svg-5824p9tiG8OXbdWc .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-5824p9tiG8OXbdWc .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-5824p9tiG8OXbdWc .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-5824p9tiG8OXbdWc :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 场景 B: someip_service_mapping
方向: SOME/IP -> SDV
AUTOSAR 网络中已有的
SOME/IP 服务
映射为 SDV 的 Topic/RPC
例: AUTOSAR 0x2001 服务的
Method 映射为 SDV RPC
场景 A: sdv_type_mapping
方向: SDV -> SOME/IP
SDV 已有服务/类型
映射到网络上的 SOME/IP
例: SDV 的 SpeedData 类型
映射为 SOME/IP 0x1001 服务的事件
6.4 SDV Type Mapping(SDV 类型映射)
当已有 SDV 类型需要暴露给 SOME/IP 网络时,使用 sdv_type_mapping。
Publication 映射示例(SDV 主题 -> SOME/IP 事件):
protobuf
sdv_type_mapping {
// 要映射的 SDV 类型
unit_type {
package_name: "com.android.sdv.samples"
type_name: "SpeedData"
}
// 目标 SOME/IP 服务标识
someip_service_id: 0x1001
version_major: 1
version_minor: 0
// 面向服务的映射定义
service_oriented_mapping {
publication_mapping {
// 发布主题配置
offered_topic {
simple_mapping {
group_id: 1
event_id: 0x8001
}
// 类型定义:定义到 SOME/IP payload 的结构映射
type_definition {
// SomeIpStruct 定义
}
}
// 将 SDV 主题名映射到具体的 SOME/IP 实例
topic_mapping {
topic: "vehicle_speed_topic"
instance_id: 0x0001
}
}
}
}
RPC 接口映射示例(SDV 方法 -> SOME/IP Method):
protobuf
sdv_type_mapping {
unit_type {
package_name: "com.android.sdv.samples"
type_name: "DoorControl"
}
someip_service_id: 0x2001
version_major: 1
version_minor: 0
service_oriented_mapping {
rpc_interface_mapping {
// 暴露的接口定义
offered_interface {
method {
procedure: "LockDoors"
method_id: 0x0001
}
method {
procedure: "UnlockDoors"
method_id: 0x0002
}
method {
procedure: "IsDoorLocked"
method_id: 0x0003
}
}
// 通道到实例的映射
rpc_channel_mapping {
channel: "front_doors"
instance_id: 0x0001
}
rpc_channel_mapping {
channel: "rear_doors"
instance_id: 0x0002
}
}
}
}
RPC Type Mapping 数据流:
AUTOSAR ECU SOME/IP Broker SDV Service AUTOSAR ECU SOME/IP Broker SDV Service #mermaid-svg-wBcKnm6jiL4bewjg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-wBcKnm6jiL4bewjg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wBcKnm6jiL4bewjg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wBcKnm6jiL4bewjg .error-icon{fill:#552222;}#mermaid-svg-wBcKnm6jiL4bewjg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wBcKnm6jiL4bewjg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wBcKnm6jiL4bewjg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wBcKnm6jiL4bewjg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wBcKnm6jiL4bewjg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wBcKnm6jiL4bewjg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wBcKnm6jiL4bewjg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wBcKnm6jiL4bewjg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wBcKnm6jiL4bewjg .marker.cross{stroke:#333333;}#mermaid-svg-wBcKnm6jiL4bewjg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wBcKnm6jiL4bewjg p{margin:0;}#mermaid-svg-wBcKnm6jiL4bewjg .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-wBcKnm6jiL4bewjg text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-wBcKnm6jiL4bewjg .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-wBcKnm6jiL4bewjg .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-wBcKnm6jiL4bewjg .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-wBcKnm6jiL4bewjg .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-wBcKnm6jiL4bewjg #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-wBcKnm6jiL4bewjg .sequenceNumber{fill:white;}#mermaid-svg-wBcKnm6jiL4bewjg #sequencenumber{fill:#333;}#mermaid-svg-wBcKnm6jiL4bewjg #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-wBcKnm6jiL4bewjg .messageText{fill:#333;stroke:none;}#mermaid-svg-wBcKnm6jiL4bewjg .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-wBcKnm6jiL4bewjg .labelText,#mermaid-svg-wBcKnm6jiL4bewjg .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-wBcKnm6jiL4bewjg .loopText,#mermaid-svg-wBcKnm6jiL4bewjg .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-wBcKnm6jiL4bewjg .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-wBcKnm6jiL4bewjg .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-wBcKnm6jiL4bewjg .noteText,#mermaid-svg-wBcKnm6jiL4bewjg .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-wBcKnm6jiL4bewjg .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-wBcKnm6jiL4bewjg .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-wBcKnm6jiL4bewjg .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-wBcKnm6jiL4bewjg .actorPopupMenu{position:absolute;}#mermaid-svg-wBcKnm6jiL4bewjg .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-wBcKnm6jiL4bewjg .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-wBcKnm6jiL4bewjg .actor-man circle,#mermaid-svg-wBcKnm6jiL4bewjg line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-wBcKnm6jiL4bewjg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 映射配置: DoorControl <->> SID=0x2001, LockDoors <->> MethodID=0x0001 rpc_invoke("LockDoors", {channel: "front_doors"}) 查询 sdv_type_mapping 找到 DoorControl 映射到 SID=0x2001, LockDoors 映射到 MethodID=0x0001 channel "front_doors" ->> instance_id=0x0001 RTTI 序列化请求 payload SOME/IP REQUEST (SID=0x2001, Instance=0x0001, MethodID=0x0001) SOME/IP RESPONSE RTTI 反序列化响应 payload rpc_result(status="ok")
6.5 SOME/IP Service Mapping(SOME/IP 服务映射)
当需要将外部 SOME/IP 服务引入 SDV 生态时,使用 someip_service_mapping。
事件映射示例:
protobuf
someip_service_mapping {
someip_service_id: 0x1001
version_major: 1
version_minor: 0
// 实例参数化
instance {
instance_id: 0x0001
sdv_service_unit_parameterization {
key: 1
value: "speed_sensor_unit"
}
sdv_topic_parameterization {
key: 1
value {
topic: "speed_topic"
capacity: 10
}
}
}
// 实例实现描述
instance_impl {
offered_event {
group_id: 1
event_id: 0x8001
simple_event {
sdv_unit_type {
package_name: "com.android.sdv.samples"
type_name: "SpeedData"
}
// 引用 sdv_service_unit_parameterization 中的 key 1
service_unit: 1
// 引用 sdv_topic_parameterization 中的 key 1
topic: 1
// 消息翻译模式:基于反射
message_translation_mode: REFLECTION
type_definition {
// SomeIpStruct 定义
}
}
}
}
}
RPC 映射示例:
protobuf
someip_service_mapping {
someip_service_id: 0x2001
version_major: 1
version_minor: 0
instance {
instance_id: 0x0001
sdv_service_unit_parameterization {
key: 1
value: "door_control_unit"
}
}
instance_impl {
offered_interface {
sdv_unit_type {
package_name: "com.android.sdv.samples"
type_name: "DoorControl"
}
// 引用 parameterization,对应 SDV 中的 RPC channel 名称
service_unit: 1
method {
procedure: "LockDoors"
method_id: 0x0001
}
method {
procedure: "UnlockDoors"
method_id: 0x0002
}
}
}
}
6.6 高级特性
组事件(Group Events)
#mermaid-svg-ENQdMo78we35RXQG{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ENQdMo78we35RXQG .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ENQdMo78we35RXQG .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ENQdMo78we35RXQG .error-icon{fill:#552222;}#mermaid-svg-ENQdMo78we35RXQG .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ENQdMo78we35RXQG .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ENQdMo78we35RXQG .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ENQdMo78we35RXQG .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ENQdMo78we35RXQG .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ENQdMo78we35RXQG .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ENQdMo78we35RXQG .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ENQdMo78we35RXQG .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ENQdMo78we35RXQG .marker.cross{stroke:#333333;}#mermaid-svg-ENQdMo78we35RXQG svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ENQdMo78we35RXQG p{margin:0;}#mermaid-svg-ENQdMo78we35RXQG .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ENQdMo78we35RXQG .cluster-label text{fill:#333;}#mermaid-svg-ENQdMo78we35RXQG .cluster-label span{color:#333;}#mermaid-svg-ENQdMo78we35RXQG .cluster-label span p{background-color:transparent;}#mermaid-svg-ENQdMo78we35RXQG .label text,#mermaid-svg-ENQdMo78we35RXQG span{fill:#333;color:#333;}#mermaid-svg-ENQdMo78we35RXQG .node rect,#mermaid-svg-ENQdMo78we35RXQG .node circle,#mermaid-svg-ENQdMo78we35RXQG .node ellipse,#mermaid-svg-ENQdMo78we35RXQG .node polygon,#mermaid-svg-ENQdMo78we35RXQG .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ENQdMo78we35RXQG .rough-node .label text,#mermaid-svg-ENQdMo78we35RXQG .node .label text,#mermaid-svg-ENQdMo78we35RXQG .image-shape .label,#mermaid-svg-ENQdMo78we35RXQG .icon-shape .label{text-anchor:middle;}#mermaid-svg-ENQdMo78we35RXQG .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ENQdMo78we35RXQG .rough-node .label,#mermaid-svg-ENQdMo78we35RXQG .node .label,#mermaid-svg-ENQdMo78we35RXQG .image-shape .label,#mermaid-svg-ENQdMo78we35RXQG .icon-shape .label{text-align:center;}#mermaid-svg-ENQdMo78we35RXQG .node.clickable{cursor:pointer;}#mermaid-svg-ENQdMo78we35RXQG .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ENQdMo78we35RXQG .arrowheadPath{fill:#333333;}#mermaid-svg-ENQdMo78we35RXQG .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ENQdMo78we35RXQG .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ENQdMo78we35RXQG .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ENQdMo78we35RXQG .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ENQdMo78we35RXQG .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ENQdMo78we35RXQG .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ENQdMo78we35RXQG .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ENQdMo78we35RXQG .cluster text{fill:#333;}#mermaid-svg-ENQdMo78we35RXQG .cluster span{color:#333;}#mermaid-svg-ENQdMo78we35RXQG div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ENQdMo78we35RXQG .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ENQdMo78we35RXQG rect.text{fill:none;stroke-width:0;}#mermaid-svg-ENQdMo78we35RXQG .icon-shape,#mermaid-svg-ENQdMo78we35RXQG .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ENQdMo78we35RXQG .icon-shape p,#mermaid-svg-ENQdMo78we35RXQG .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ENQdMo78we35RXQG .icon-shape .label rect,#mermaid-svg-ENQdMo78we35RXQG .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ENQdMo78we35RXQG .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ENQdMo78we35RXQG .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ENQdMo78we35RXQG :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SDV 侧 (三个独立 Topic)
Broker GroupEvent 拆分
SOME/IP 侧
单条 SOME/IP Event
复合数据结构
Field A: 车速 (float32)
Field B: 发动机转速 (float32)
Field C: 油门位置 (uint8)
group_event 拆分引擎
Topic: vehicle_speed
Type: SpeedData
ServiceUnit: 1
Topic: engine_rpm
Type: EngineRpmData
ServiceUnit: 2
Topic: throttle_position
Type: ThrottleData
ServiceUnit: 3
group_event 允许将一个 SOME/IP 事件拆分成多个 SDV 主题。这在 SOME/IP 服务端发送复合数据结构而 SDV 侧需要分别处理各部分时非常有用。
protobuf
offered_event {
group_id: 1
event_id: 0x8002
group_event {
// 完整的 SOME/IP payload 定义
type_definition {
// 完整的复合结构定义
}
// 第一部分
event_part {
sdv_unit_type {
package_name: "com.android.sdv.samples"
type_name: "PartAData"
}
service_unit: 1
topic: 1
// 字段名映射:SOME/IP 字段 -> SDV 字段
field_name_mapping {
key: "someip_field_a"
value: "sdv_field_a"
}
}
// 第二部分
event_part {
sdv_unit_type {
package_name: "com.android.sdv.samples"
type_name: "PartBData"
}
service_unit: 2
topic: 2
field_name_mapping {
key: "someip_field_b"
value: "sdv_field_b"
}
}
}
}
Fire & Forget 映射
AUTOSAR ECU SOME/IP Broker SDV Service AUTOSAR ECU SOME/IP Broker SDV Service #mermaid-svg-nCJ6yv4YstDfdfiX{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nCJ6yv4YstDfdfiX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nCJ6yv4YstDfdfiX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nCJ6yv4YstDfdfiX .error-icon{fill:#552222;}#mermaid-svg-nCJ6yv4YstDfdfiX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nCJ6yv4YstDfdfiX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nCJ6yv4YstDfdfiX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nCJ6yv4YstDfdfiX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nCJ6yv4YstDfdfiX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nCJ6yv4YstDfdfiX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nCJ6yv4YstDfdfiX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nCJ6yv4YstDfdfiX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nCJ6yv4YstDfdfiX .marker.cross{stroke:#333333;}#mermaid-svg-nCJ6yv4YstDfdfiX svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nCJ6yv4YstDfdfiX p{margin:0;}#mermaid-svg-nCJ6yv4YstDfdfiX .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nCJ6yv4YstDfdfiX text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-nCJ6yv4YstDfdfiX .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nCJ6yv4YstDfdfiX .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-nCJ6yv4YstDfdfiX .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-nCJ6yv4YstDfdfiX .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-nCJ6yv4YstDfdfiX #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-nCJ6yv4YstDfdfiX .sequenceNumber{fill:white;}#mermaid-svg-nCJ6yv4YstDfdfiX #sequencenumber{fill:#333;}#mermaid-svg-nCJ6yv4YstDfdfiX #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-nCJ6yv4YstDfdfiX .messageText{fill:#333;stroke:none;}#mermaid-svg-nCJ6yv4YstDfdfiX .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nCJ6yv4YstDfdfiX .labelText,#mermaid-svg-nCJ6yv4YstDfdfiX .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-nCJ6yv4YstDfdfiX .loopText,#mermaid-svg-nCJ6yv4YstDfdfiX .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-nCJ6yv4YstDfdfiX .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nCJ6yv4YstDfdfiX .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-nCJ6yv4YstDfdfiX .noteText,#mermaid-svg-nCJ6yv4YstDfdfiX .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-nCJ6yv4YstDfdfiX .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nCJ6yv4YstDfdfiX .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nCJ6yv4YstDfdfiX .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nCJ6yv4YstDfdfiX .actorPopupMenu{position:absolute;}#mermaid-svg-nCJ6yv4YstDfdfiX .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-nCJ6yv4YstDfdfiX .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nCJ6yv4YstDfdfiX .actor-man circle,#mermaid-svg-nCJ6yv4YstDfdfiX line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-nCJ6yv4YstDfdfiX :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} SDV Topic ->> SOME/IP Fire & Forget 方法 SDV 侧无响应等待,立即返回 publish("counter-load-start-counter", payload) 查询 sdv_type_mapping, 发现 someip_ff_methods=true 构造 F&F 请求 (SID=0x3700, Instance=0x1000, MethodID=0x1000) SOME/IP REQUEST (Fire & Forget, no response expected)
SOME/IP 的 Fire & Forget 方法在 SDV RPC 接口中没有直接等效项。Google 的解决方案是将 SDV topic(publication)映射到 F&F 方法:
protobuf
sdv_type_mapping {
unit_type {
package_name: "com.android.sdv.sample.someip"
type_name: "CounterLoad"
}
someip_service_id: 0x13
version_major: 1
version_minor: 0
service_oriented_mapping {
publication_mapping {
offered_topic {
type_definition {
// SomeIpStruct 定义
}
// 标记为 F&F 方法
someip_ff_methods: true
}
topic_mapping {
topic: "counter-load-start-counter"
instance_id: 0x1
// 配置目标 F&F 方法的路由信息
fire_and_forget_method {
service_id: 0x3700
instance_id: 0x1000
version_major: 1
version_minor: 0
method_id: 0x1000
}
}
}
}
}
当向 counter-load-start-counter topic 发布数据时,Broker 会将其转换为对 0x3700:0x1000 服务的 0x1000 方法的 F&F 调用。
服务发现行为配置
可以配置服务发现的行为策略:
protobuf
someip_service_mapping {
someip_service_id: 0x1001
version_major: 1
version_minor: 0
// 服务发现行为
sd_behavior: EXACT_OR_ANY_MINOR_VERSION
// 或者使用 MINIMUM_MINOR_VERSION
}
EXACT_OR_ANY_MINOR_VERSION(默认):先尝试精确匹配 minor version,失败后接受任意版本MINIMUM_MINOR_VERSION:只接受不低于配置版本的 minor version
七、集成与部署
7.1 部署架构
SOME/IP 集成的完整部署涉及以下组件:
text
+----------------------------------------------------------+
| SDV Core VM |
| +------------------------------------------------------+ |
| | VSIDL Agent (RTTI Provider) | |
| +------------------------------------------------------+ |
| | SOME/IP Broker Agent | |
| +------------------------------------------------------+ |
| | SOME/IP Stack Agent (vsomeip wrapper or custom) | |
| +---------------------------+--------------------------+ |
| | |
| PHYSICAL NETWORK | |
| +--------------------------+--------------------------+ |
| | OTHER ECUs (AUTOSAR SOME/IP) | |
| +-----------------------------------------------------+ |
+----------------------------------------------------------+
7.2 完整启动流程
VSIDL Agent SOME/IP Stack SOME/IP Broker SDV Orchestrator init.rc Linux Kernel Bootloader VSIDL Agent SOME/IP Stack SOME/IP Broker SDV Orchestrator init.rc Linux Kernel Bootloader #mermaid-svg-5yfZPsnTILX1b95a{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-5yfZPsnTILX1b95a .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-5yfZPsnTILX1b95a .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-5yfZPsnTILX1b95a .error-icon{fill:#552222;}#mermaid-svg-5yfZPsnTILX1b95a .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5yfZPsnTILX1b95a .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-5yfZPsnTILX1b95a .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5yfZPsnTILX1b95a .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5yfZPsnTILX1b95a .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-5yfZPsnTILX1b95a .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5yfZPsnTILX1b95a .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5yfZPsnTILX1b95a .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5yfZPsnTILX1b95a .marker.cross{stroke:#333333;}#mermaid-svg-5yfZPsnTILX1b95a svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5yfZPsnTILX1b95a p{margin:0;}#mermaid-svg-5yfZPsnTILX1b95a .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-5yfZPsnTILX1b95a text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-5yfZPsnTILX1b95a .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-5yfZPsnTILX1b95a .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-5yfZPsnTILX1b95a .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-5yfZPsnTILX1b95a .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-5yfZPsnTILX1b95a #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-5yfZPsnTILX1b95a .sequenceNumber{fill:white;}#mermaid-svg-5yfZPsnTILX1b95a #sequencenumber{fill:#333;}#mermaid-svg-5yfZPsnTILX1b95a #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-5yfZPsnTILX1b95a .messageText{fill:#333;stroke:none;}#mermaid-svg-5yfZPsnTILX1b95a .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-5yfZPsnTILX1b95a .labelText,#mermaid-svg-5yfZPsnTILX1b95a .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-5yfZPsnTILX1b95a .loopText,#mermaid-svg-5yfZPsnTILX1b95a .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-5yfZPsnTILX1b95a .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-5yfZPsnTILX1b95a .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-5yfZPsnTILX1b95a .noteText,#mermaid-svg-5yfZPsnTILX1b95a .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-5yfZPsnTILX1b95a .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-5yfZPsnTILX1b95a .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-5yfZPsnTILX1b95a .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-5yfZPsnTILX1b95a .actorPopupMenu{position:absolute;}#mermaid-svg-5yfZPsnTILX1b95a .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-5yfZPsnTILX1b95a .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-5yfZPsnTILX1b95a .actor-man circle,#mermaid-svg-5yfZPsnTILX1b95a line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-5yfZPsnTILX1b95a :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 阶段 1: 基础服务启动 阶段 2: 条件触发启动 vsomeip 初始化 加载配置文件 创建 UDP 多播 socket 阶段 3: VSIDL 与 Broker 启动 Broker 就绪, 开始处理消息 启动 执行 init.rc 声明 service sdv_someip_stack_agent (disabled) 声明 service sdv_someip_broker_agent (disabled) androidboot.sdv.someip.enable=true 设置 ro.boot.sdv.someip.enable=true dev.bootcomplete=1 && enable=true ->> start stack stack ready 通知编排器 start VSIDL Agent VSIDL ready (RTTI catalog loaded) ro.sdv.orchestrator.state.ready=true ->> start broker 通过 Binder 连接 (register_availability_callback) 加载 RTTI 类型信息 monitor_service(SID列表) vsomeip 开始服务发现
7.3 Broker 部署配置
Broker 的启动由系统属性控制:
rc
# device/google/sdv/sdv_core_base/sdv.agents.rc
# 声明 SDV SOME/IP Broker Agent 服务
service sdv_someip_broker_agent /system_ext/bin/sdv_someip_broker_agent_comms
class core
disabled
user system_ext_sdv_someip
group system
# 当编排器就绪且 SOME/IP 启用时启动
on property:ro.sdv.orchestrator.state.ready=true && property:ro.boot.sdv.someip.enable=true
start sdv_someip_broker_agent
在多 VM 环境中,只需在其中一个 SDV 实例上设置 androidboot.sdv.someip.enable=true 即可实现单 Broker 部署。
7.4 多 Broker 实例部署配置
#mermaid-svg-WLMVPC6aRvoHqSbn{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WLMVPC6aRvoHqSbn .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WLMVPC6aRvoHqSbn .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WLMVPC6aRvoHqSbn .error-icon{fill:#552222;}#mermaid-svg-WLMVPC6aRvoHqSbn .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WLMVPC6aRvoHqSbn .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WLMVPC6aRvoHqSbn .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WLMVPC6aRvoHqSbn .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WLMVPC6aRvoHqSbn .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WLMVPC6aRvoHqSbn .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WLMVPC6aRvoHqSbn .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WLMVPC6aRvoHqSbn .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WLMVPC6aRvoHqSbn .marker.cross{stroke:#333333;}#mermaid-svg-WLMVPC6aRvoHqSbn svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WLMVPC6aRvoHqSbn p{margin:0;}#mermaid-svg-WLMVPC6aRvoHqSbn .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WLMVPC6aRvoHqSbn .cluster-label text{fill:#333;}#mermaid-svg-WLMVPC6aRvoHqSbn .cluster-label span{color:#333;}#mermaid-svg-WLMVPC6aRvoHqSbn .cluster-label span p{background-color:transparent;}#mermaid-svg-WLMVPC6aRvoHqSbn .label text,#mermaid-svg-WLMVPC6aRvoHqSbn span{fill:#333;color:#333;}#mermaid-svg-WLMVPC6aRvoHqSbn .node rect,#mermaid-svg-WLMVPC6aRvoHqSbn .node circle,#mermaid-svg-WLMVPC6aRvoHqSbn .node ellipse,#mermaid-svg-WLMVPC6aRvoHqSbn .node polygon,#mermaid-svg-WLMVPC6aRvoHqSbn .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WLMVPC6aRvoHqSbn .rough-node .label text,#mermaid-svg-WLMVPC6aRvoHqSbn .node .label text,#mermaid-svg-WLMVPC6aRvoHqSbn .image-shape .label,#mermaid-svg-WLMVPC6aRvoHqSbn .icon-shape .label{text-anchor:middle;}#mermaid-svg-WLMVPC6aRvoHqSbn .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WLMVPC6aRvoHqSbn .rough-node .label,#mermaid-svg-WLMVPC6aRvoHqSbn .node .label,#mermaid-svg-WLMVPC6aRvoHqSbn .image-shape .label,#mermaid-svg-WLMVPC6aRvoHqSbn .icon-shape .label{text-align:center;}#mermaid-svg-WLMVPC6aRvoHqSbn .node.clickable{cursor:pointer;}#mermaid-svg-WLMVPC6aRvoHqSbn .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WLMVPC6aRvoHqSbn .arrowheadPath{fill:#333333;}#mermaid-svg-WLMVPC6aRvoHqSbn .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WLMVPC6aRvoHqSbn .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WLMVPC6aRvoHqSbn .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WLMVPC6aRvoHqSbn .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WLMVPC6aRvoHqSbn .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WLMVPC6aRvoHqSbn .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WLMVPC6aRvoHqSbn .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WLMVPC6aRvoHqSbn .cluster text{fill:#333;}#mermaid-svg-WLMVPC6aRvoHqSbn .cluster span{color:#333;}#mermaid-svg-WLMVPC6aRvoHqSbn div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WLMVPC6aRvoHqSbn .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WLMVPC6aRvoHqSbn rect.text{fill:none;stroke-width:0;}#mermaid-svg-WLMVPC6aRvoHqSbn .icon-shape,#mermaid-svg-WLMVPC6aRvoHqSbn .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WLMVPC6aRvoHqSbn .icon-shape p,#mermaid-svg-WLMVPC6aRvoHqSbn .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WLMVPC6aRvoHqSbn .icon-shape .label rect,#mermaid-svg-WLMVPC6aRvoHqSbn .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WLMVPC6aRvoHqSbn .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WLMVPC6aRvoHqSbn .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WLMVPC6aRvoHqSbn :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} VLAN 2: ADAS
VLAN 1: Body/Chassis
SDV Core VM
系统属性控制
ro.boot.sdv.someip.enable=true
Broker Instance 1
Domain: Body Signals
监听: 10.0.1.10:30490
Broker Instance 2
Domain: ADAS
监听: 10.0.2.10:30490
10.0.1.0/24
BCM ECU
(车身控制模块)
GW ECU
(网关)
10.0.2.0/24
Camera ECU
Radar ECU
7.5 VSIDL Provider 部署
VSIDL Agent(Catalog Provider)必须与 Broker 部署在同一个 VM 中,因为它提供 Broker 运行所需的 RTTI。
使用 runtime-config-prebuilts 变体,VSIDL Agent 可以生成包含预构建规则的 Android.bp 文件,这些规则构建和部署运行时配置文件。
7.6 Soong 构建集成
使用 vsidl_rc_generator 工具生成运行时配置:
bash
vsidl_rc_generator [OPTIONS] \
--vsidl-path <VSIDL_PATH> \
--catalog-path <CATALOG_PATH> \
--output-path <OUTPUT_PATH>
可选参数:
--dependency-catalog-path <PATH>:指定 catalog 之外的依赖 proto 目录--variant <VARIANT>:运行模式RuntimeConfig(默认):生成运行时配置文件(SOME/IP 和诊断配置)RuntimeConfigPrebuilts:生成包含预构建模块的构建文件
--service-bundle-name <NAME>:指定要应用运行时配置的 service bundle--package-name <NAME>:与 service-bundle-name 联用,指定包名--filegroup <FILEGROUP>:在RuntimeConfigPrebuilts模式下必须定义
7.7 构建产物流程
#mermaid-svg-8KPvAYJ7JVMf2vRy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8KPvAYJ7JVMf2vRy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8KPvAYJ7JVMf2vRy .error-icon{fill:#552222;}#mermaid-svg-8KPvAYJ7JVMf2vRy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8KPvAYJ7JVMf2vRy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8KPvAYJ7JVMf2vRy .marker.cross{stroke:#333333;}#mermaid-svg-8KPvAYJ7JVMf2vRy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8KPvAYJ7JVMf2vRy p{margin:0;}#mermaid-svg-8KPvAYJ7JVMf2vRy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8KPvAYJ7JVMf2vRy .cluster-label text{fill:#333;}#mermaid-svg-8KPvAYJ7JVMf2vRy .cluster-label span{color:#333;}#mermaid-svg-8KPvAYJ7JVMf2vRy .cluster-label span p{background-color:transparent;}#mermaid-svg-8KPvAYJ7JVMf2vRy .label text,#mermaid-svg-8KPvAYJ7JVMf2vRy span{fill:#333;color:#333;}#mermaid-svg-8KPvAYJ7JVMf2vRy .node rect,#mermaid-svg-8KPvAYJ7JVMf2vRy .node circle,#mermaid-svg-8KPvAYJ7JVMf2vRy .node ellipse,#mermaid-svg-8KPvAYJ7JVMf2vRy .node polygon,#mermaid-svg-8KPvAYJ7JVMf2vRy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8KPvAYJ7JVMf2vRy .rough-node .label text,#mermaid-svg-8KPvAYJ7JVMf2vRy .node .label text,#mermaid-svg-8KPvAYJ7JVMf2vRy .image-shape .label,#mermaid-svg-8KPvAYJ7JVMf2vRy .icon-shape .label{text-anchor:middle;}#mermaid-svg-8KPvAYJ7JVMf2vRy .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8KPvAYJ7JVMf2vRy .rough-node .label,#mermaid-svg-8KPvAYJ7JVMf2vRy .node .label,#mermaid-svg-8KPvAYJ7JVMf2vRy .image-shape .label,#mermaid-svg-8KPvAYJ7JVMf2vRy .icon-shape .label{text-align:center;}#mermaid-svg-8KPvAYJ7JVMf2vRy .node.clickable{cursor:pointer;}#mermaid-svg-8KPvAYJ7JVMf2vRy .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8KPvAYJ7JVMf2vRy .arrowheadPath{fill:#333333;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8KPvAYJ7JVMf2vRy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8KPvAYJ7JVMf2vRy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8KPvAYJ7JVMf2vRy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8KPvAYJ7JVMf2vRy .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8KPvAYJ7JVMf2vRy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8KPvAYJ7JVMf2vRy .cluster text{fill:#333;}#mermaid-svg-8KPvAYJ7JVMf2vRy .cluster span{color:#333;}#mermaid-svg-8KPvAYJ7JVMf2vRy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8KPvAYJ7JVMf2vRy .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8KPvAYJ7JVMf2vRy rect.text{fill:none;stroke-width:0;}#mermaid-svg-8KPvAYJ7JVMf2vRy .icon-shape,#mermaid-svg-8KPvAYJ7JVMf2vRy .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8KPvAYJ7JVMf2vRy .icon-shape p,#mermaid-svg-8KPvAYJ7JVMf2vRy .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8KPvAYJ7JVMf2vRy .icon-shape .label rect,#mermaid-svg-8KPvAYJ7JVMf2vRy .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8KPvAYJ7JVMf2vRy .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8KPvAYJ7JVMf2vRy .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8KPvAYJ7JVMf2vRy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 输出: RuntimeConfigPrebuilts 模式
输出: RuntimeConfig 模式
构建工具
输入
*.vsidl
(服务定义 + SOME/IP 映射)
Dependency Protos
vsidl_rc_generator
SOME/IP Runtime Config
(Broker 加载的映射表)
Diagnostics Config
(UDS 路由配置)
Android.bp
(预构建模块规则)
Prebuilt .pb 文件
(直接部署到 VM)
7.8 诊断配置集成
AAOS SDV 不仅支持 SOME/IP 通信集成,还提供了完整的诊断(Diagnostics)框架,与 SOME/IP 共享相似的配置和部署机制:
- 统一的运行时配置生成器
- 共享的 VSIDL 类型系统
- 统一的构建规则
这使得 OEM 可以在同一个框架内管理通信和诊断功能,减少集成复杂性。
八、安全机制:SELinux 配置
8.1 SELinux 策略概览
SOME/IP 集成的安全性由 SELinux 策略保证。参考实现的 SELinux 配置文件位于:
text
device/google/sdv/sdv_core_base/sepolicy/samples/vendor/
8.2 SELinux 安全边界
#mermaid-svg-dqeelrxR8fM5RDkV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-dqeelrxR8fM5RDkV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-dqeelrxR8fM5RDkV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-dqeelrxR8fM5RDkV .error-icon{fill:#552222;}#mermaid-svg-dqeelrxR8fM5RDkV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-dqeelrxR8fM5RDkV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-dqeelrxR8fM5RDkV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-dqeelrxR8fM5RDkV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-dqeelrxR8fM5RDkV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-dqeelrxR8fM5RDkV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-dqeelrxR8fM5RDkV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-dqeelrxR8fM5RDkV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-dqeelrxR8fM5RDkV .marker.cross{stroke:#333333;}#mermaid-svg-dqeelrxR8fM5RDkV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-dqeelrxR8fM5RDkV p{margin:0;}#mermaid-svg-dqeelrxR8fM5RDkV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-dqeelrxR8fM5RDkV .cluster-label text{fill:#333;}#mermaid-svg-dqeelrxR8fM5RDkV .cluster-label span{color:#333;}#mermaid-svg-dqeelrxR8fM5RDkV .cluster-label span p{background-color:transparent;}#mermaid-svg-dqeelrxR8fM5RDkV .label text,#mermaid-svg-dqeelrxR8fM5RDkV span{fill:#333;color:#333;}#mermaid-svg-dqeelrxR8fM5RDkV .node rect,#mermaid-svg-dqeelrxR8fM5RDkV .node circle,#mermaid-svg-dqeelrxR8fM5RDkV .node ellipse,#mermaid-svg-dqeelrxR8fM5RDkV .node polygon,#mermaid-svg-dqeelrxR8fM5RDkV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-dqeelrxR8fM5RDkV .rough-node .label text,#mermaid-svg-dqeelrxR8fM5RDkV .node .label text,#mermaid-svg-dqeelrxR8fM5RDkV .image-shape .label,#mermaid-svg-dqeelrxR8fM5RDkV .icon-shape .label{text-anchor:middle;}#mermaid-svg-dqeelrxR8fM5RDkV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-dqeelrxR8fM5RDkV .rough-node .label,#mermaid-svg-dqeelrxR8fM5RDkV .node .label,#mermaid-svg-dqeelrxR8fM5RDkV .image-shape .label,#mermaid-svg-dqeelrxR8fM5RDkV .icon-shape .label{text-align:center;}#mermaid-svg-dqeelrxR8fM5RDkV .node.clickable{cursor:pointer;}#mermaid-svg-dqeelrxR8fM5RDkV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-dqeelrxR8fM5RDkV .arrowheadPath{fill:#333333;}#mermaid-svg-dqeelrxR8fM5RDkV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-dqeelrxR8fM5RDkV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-dqeelrxR8fM5RDkV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dqeelrxR8fM5RDkV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-dqeelrxR8fM5RDkV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dqeelrxR8fM5RDkV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-dqeelrxR8fM5RDkV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-dqeelrxR8fM5RDkV .cluster text{fill:#333;}#mermaid-svg-dqeelrxR8fM5RDkV .cluster span{color:#333;}#mermaid-svg-dqeelrxR8fM5RDkV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-dqeelrxR8fM5RDkV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-dqeelrxR8fM5RDkV rect.text{fill:none;stroke-width:0;}#mermaid-svg-dqeelrxR8fM5RDkV .icon-shape,#mermaid-svg-dqeelrxR8fM5RDkV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-dqeelrxR8fM5RDkV .icon-shape p,#mermaid-svg-dqeelrxR8fM5RDkV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-dqeelrxR8fM5RDkV .icon-shape .label rect,#mermaid-svg-dqeelrxR8fM5RDkV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-dqeelrxR8fM5RDkV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-dqeelrxR8fM5RDkV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-dqeelrxR8fM5RDkV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 文件系统
SOME/IP 安全域
系统全局
启动
Binder IPC
读
读写
执行
SELinux 策略控制
binder_use()
binder_call(stack, broker)
allow self:udp_socket create_socket_perms
allow port_type:udp_socket name_bind
allow sdv_someip_data_file:file create_file_perms
init (u:r:init:s0)
sdv_someip_stack_default
(u:r:sdv_someip_stack_default:s0)
sdv_someip_broker_domain
(u:r:sdv_someip_broker:s0)
/vendor/etc/someip/*
(u:object_r:sdv_someip_config_file:s0)
/data/vendor/vsomeip/*
(u:object_r:sdv_someip_data_file:s0)
/vendor/bin/sdv_someip_stack_agent
(u:object_r:sdv_someip_stack_default_exec:s0)
允许: stack <-> broker Binder 通信
允许: 绑定 SD 端口 (30490/UDP)
拒绝: 访问非 someip 文件
拒绝: 创建其他类型的 socket
8.3 域定义
te
# sdv_someip_stack_default.te
type sdv_someip_stack_default, domain;
type sdv_someip_stack_default_exec, exec_type, vendor_file_type, file_type;
# Binder 通信域
binder_use(sdv_someip_stack_default)
binder_call(sdv_someip_stack_default, sdv_someip_broker_domain)
# 网络访问
allow sdv_someip_stack_default self:udp_socket create_socket_perms;
allow sdv_someip_stack_default self:tcp_socket create_socket_perms;
allow sdv_someip_stack_default port_type:udp_socket name_bind;
allow sdv_someip_stack_default port_type:tcp_socket name_connect;
# 文件系统访问
allow sdv_someip_stack_default sdv_someip_data_file:dir create_dir_perms;
allow sdv_someip_stack_default sdv_someip_data_file:file create_file_perms;
8.4 文件上下文
text
# file_contexts
/vendor/bin/sdv_someip_stack_agent u:object_r:sdv_someip_stack_default_exec:s0
/vendor/etc/someip(/.*)? u:object_r:sdv_someip_config_file:s0
/data/vendor/vsomeip(/.*)? u:object_r:sdv_someip_data_file:s0
SELinux 配置确保:
- Binder 通信只在 Stack 和 Broker 之间允许
- 网络 Socket 创建被限制在必要的端口范围
- 配置文件和运行时数据的访问被严格控制
九、实战:从零开始集成 SOME/IP
9.1 整体工作流程
#mermaid-svg-6moPwbRZ6nnCrz3r{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-6moPwbRZ6nnCrz3r .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-6moPwbRZ6nnCrz3r .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-6moPwbRZ6nnCrz3r .error-icon{fill:#552222;}#mermaid-svg-6moPwbRZ6nnCrz3r .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6moPwbRZ6nnCrz3r .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-6moPwbRZ6nnCrz3r .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6moPwbRZ6nnCrz3r .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6moPwbRZ6nnCrz3r .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-6moPwbRZ6nnCrz3r .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6moPwbRZ6nnCrz3r .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6moPwbRZ6nnCrz3r .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6moPwbRZ6nnCrz3r .marker.cross{stroke:#333333;}#mermaid-svg-6moPwbRZ6nnCrz3r svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6moPwbRZ6nnCrz3r p{margin:0;}#mermaid-svg-6moPwbRZ6nnCrz3r .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-6moPwbRZ6nnCrz3r .cluster-label text{fill:#333;}#mermaid-svg-6moPwbRZ6nnCrz3r .cluster-label span{color:#333;}#mermaid-svg-6moPwbRZ6nnCrz3r .cluster-label span p{background-color:transparent;}#mermaid-svg-6moPwbRZ6nnCrz3r .label text,#mermaid-svg-6moPwbRZ6nnCrz3r span{fill:#333;color:#333;}#mermaid-svg-6moPwbRZ6nnCrz3r .node rect,#mermaid-svg-6moPwbRZ6nnCrz3r .node circle,#mermaid-svg-6moPwbRZ6nnCrz3r .node ellipse,#mermaid-svg-6moPwbRZ6nnCrz3r .node polygon,#mermaid-svg-6moPwbRZ6nnCrz3r .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6moPwbRZ6nnCrz3r .rough-node .label text,#mermaid-svg-6moPwbRZ6nnCrz3r .node .label text,#mermaid-svg-6moPwbRZ6nnCrz3r .image-shape .label,#mermaid-svg-6moPwbRZ6nnCrz3r .icon-shape .label{text-anchor:middle;}#mermaid-svg-6moPwbRZ6nnCrz3r .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-6moPwbRZ6nnCrz3r .rough-node .label,#mermaid-svg-6moPwbRZ6nnCrz3r .node .label,#mermaid-svg-6moPwbRZ6nnCrz3r .image-shape .label,#mermaid-svg-6moPwbRZ6nnCrz3r .icon-shape .label{text-align:center;}#mermaid-svg-6moPwbRZ6nnCrz3r .node.clickable{cursor:pointer;}#mermaid-svg-6moPwbRZ6nnCrz3r .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-6moPwbRZ6nnCrz3r .arrowheadPath{fill:#333333;}#mermaid-svg-6moPwbRZ6nnCrz3r .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6moPwbRZ6nnCrz3r .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6moPwbRZ6nnCrz3r .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6moPwbRZ6nnCrz3r .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-6moPwbRZ6nnCrz3r .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6moPwbRZ6nnCrz3r .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-6moPwbRZ6nnCrz3r .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6moPwbRZ6nnCrz3r .cluster text{fill:#333;}#mermaid-svg-6moPwbRZ6nnCrz3r .cluster span{color:#333;}#mermaid-svg-6moPwbRZ6nnCrz3r div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6moPwbRZ6nnCrz3r .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-6moPwbRZ6nnCrz3r rect.text{fill:none;stroke-width:0;}#mermaid-svg-6moPwbRZ6nnCrz3r .icon-shape,#mermaid-svg-6moPwbRZ6nnCrz3r .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-6moPwbRZ6nnCrz3r .icon-shape p,#mermaid-svg-6moPwbRZ6nnCrz3r .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-6moPwbRZ6nnCrz3r .icon-shape .label rect,#mermaid-svg-6moPwbRZ6nnCrz3r .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-6moPwbRZ6nnCrz3r .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-6moPwbRZ6nnCrz3r .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-6moPwbRZ6nnCrz3r :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Step 1: 分析 SOME/IP 服务
确定 SID / 方法 / 事件 / 数据结构
Step 2: 定义 SDV Service Bundle
编写 vsidl 文件
Step 3: 编写 SOME/IP 映射
配置 some_ip_mapping
Step 4: 构建与生成配置
vsidl_rc_generator
Step 5: 集成 Stack
参考实现 vsomeip / OEM 定制
Step 6: 部署与启动
init.rc + SELinux 策略
Step 7: 验证端到端通信
logcat + 网络抓包
Step 8: 集成测试
Cuttlefish + 自动化测试
9.2 实际案例:车速信号集成
场景:AUTOSAR 域中的车速传感器通过 SOME/IP 发布车速数据,需要在 AAOS SDV 侧接收。
端到端架构:
#mermaid-svg-IHlCrNLNY1XojWsJ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-IHlCrNLNY1XojWsJ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-IHlCrNLNY1XojWsJ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-IHlCrNLNY1XojWsJ .error-icon{fill:#552222;}#mermaid-svg-IHlCrNLNY1XojWsJ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IHlCrNLNY1XojWsJ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-IHlCrNLNY1XojWsJ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IHlCrNLNY1XojWsJ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IHlCrNLNY1XojWsJ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-IHlCrNLNY1XojWsJ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IHlCrNLNY1XojWsJ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IHlCrNLNY1XojWsJ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IHlCrNLNY1XojWsJ .marker.cross{stroke:#333333;}#mermaid-svg-IHlCrNLNY1XojWsJ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IHlCrNLNY1XojWsJ p{margin:0;}#mermaid-svg-IHlCrNLNY1XojWsJ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IHlCrNLNY1XojWsJ .cluster-label text{fill:#333;}#mermaid-svg-IHlCrNLNY1XojWsJ .cluster-label span{color:#333;}#mermaid-svg-IHlCrNLNY1XojWsJ .cluster-label span p{background-color:transparent;}#mermaid-svg-IHlCrNLNY1XojWsJ .label text,#mermaid-svg-IHlCrNLNY1XojWsJ span{fill:#333;color:#333;}#mermaid-svg-IHlCrNLNY1XojWsJ .node rect,#mermaid-svg-IHlCrNLNY1XojWsJ .node circle,#mermaid-svg-IHlCrNLNY1XojWsJ .node ellipse,#mermaid-svg-IHlCrNLNY1XojWsJ .node polygon,#mermaid-svg-IHlCrNLNY1XojWsJ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IHlCrNLNY1XojWsJ .rough-node .label text,#mermaid-svg-IHlCrNLNY1XojWsJ .node .label text,#mermaid-svg-IHlCrNLNY1XojWsJ .image-shape .label,#mermaid-svg-IHlCrNLNY1XojWsJ .icon-shape .label{text-anchor:middle;}#mermaid-svg-IHlCrNLNY1XojWsJ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-IHlCrNLNY1XojWsJ .rough-node .label,#mermaid-svg-IHlCrNLNY1XojWsJ .node .label,#mermaid-svg-IHlCrNLNY1XojWsJ .image-shape .label,#mermaid-svg-IHlCrNLNY1XojWsJ .icon-shape .label{text-align:center;}#mermaid-svg-IHlCrNLNY1XojWsJ .node.clickable{cursor:pointer;}#mermaid-svg-IHlCrNLNY1XojWsJ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-IHlCrNLNY1XojWsJ .arrowheadPath{fill:#333333;}#mermaid-svg-IHlCrNLNY1XojWsJ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IHlCrNLNY1XojWsJ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IHlCrNLNY1XojWsJ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IHlCrNLNY1XojWsJ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-IHlCrNLNY1XojWsJ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IHlCrNLNY1XojWsJ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-IHlCrNLNY1XojWsJ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IHlCrNLNY1XojWsJ .cluster text{fill:#333;}#mermaid-svg-IHlCrNLNY1XojWsJ .cluster span{color:#333;}#mermaid-svg-IHlCrNLNY1XojWsJ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IHlCrNLNY1XojWsJ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-IHlCrNLNY1XojWsJ rect.text{fill:none;stroke-width:0;}#mermaid-svg-IHlCrNLNY1XojWsJ .icon-shape,#mermaid-svg-IHlCrNLNY1XojWsJ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-IHlCrNLNY1XojWsJ .icon-shape p,#mermaid-svg-IHlCrNLNY1XojWsJ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-IHlCrNLNY1XojWsJ .icon-shape .label rect,#mermaid-svg-IHlCrNLNY1XojWsJ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-IHlCrNLNY1XojWsJ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-IHlCrNLNY1XojWsJ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-IHlCrNLNY1XojWsJ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 配置
AAOS SDV
AUTOSAR Domain
SID=0x1001
EventID=0x8001
on_event_notification
topic: vehicle_speed
车速传感器
(物理硬件)
AUTOSAR ECU
SOME/IP Service
车载以太网
SOME/IP Stack
(vsomeip)
SOME/IP Broker
(RTTI 翻译)
SDV App
(SpeedConsumer)
speed_data.vsidl
- mapping
步骤 1:定义 SDV 数据类型
protobuf
// speed_data.vsidl
package: "com.android.sdv.samples"
sdv_service_bundle {
name: "VehicleSignals"
version: "1.0"
type {
name: "SpeedData"
proto: "message SpeedData { float speed_kph = 1; uint8 quality = 2; }"
}
}
步骤 2:配置 SOME/IP 映射
protobuf
some_ip_mapping {
someip_service_mapping {
someip_service_id: 0x1001
version_major: 1
version_minor: 0
instance {
instance_id: 0x0001
sdv_service_unit_parameterization {
key: 1
value: "speed_sensor_unit"
}
sdv_topic_parameterization {
key: 1
value {
topic: "vehicle_speed"
capacity: 10
}
}
}
instance_impl {
offered_event {
group_id: 1
event_id: 0x8001
simple_event {
sdv_unit_type {
package_name: "com.android.sdv.samples"
type_name: "SpeedData"
}
service_unit: 1
topic: 1
message_translation_mode: REFLECTION
type_definition {
struct {
name: "SpeedData"
members {
name: "speed_kph"
data_type: FLOAT32
}
members {
name: "quality"
data_type: UINT8
}
}
}
}
}
}
}
}
步骤 3:SDV 侧接收数据
rust
// SDV 服务代码(Rust)
use sdv::comm::*;
#[derive(Default)]
struct SpeedConsumer {
topic_subscriber: TopicSubscriber<SpeedData>,
}
impl SpeedConsumer {
fn new() -> Self {
let subscriber = comm_stack::subscribe_topic(
"vehicle_speed",
10
).unwrap();
Self {
topic_subscriber: subscriber,
}
}
fn process_speed_data(&mut self) {
if let Some(speed_data) = self.topic_subscriber.try_recv() {
println!(
"Speed: {} km/h, quality: {}",
speed_data.speed_kph,
speed_data.quality
);
}
}
}
9.3 车速信号端到端数据流
SDV App SOME/IP Broker SOME/IP Stack vsomeip Network vsomeip SD AUTOSAR ECU 车速传感器 SDV App SOME/IP Broker SOME/IP Stack vsomeip Network vsomeip SD AUTOSAR ECU 车速传感器 #mermaid-svg-yzWjaysgrdztrHYl{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-yzWjaysgrdztrHYl .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-yzWjaysgrdztrHYl .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-yzWjaysgrdztrHYl .error-icon{fill:#552222;}#mermaid-svg-yzWjaysgrdztrHYl .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yzWjaysgrdztrHYl .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-yzWjaysgrdztrHYl .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yzWjaysgrdztrHYl .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yzWjaysgrdztrHYl .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-yzWjaysgrdztrHYl .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yzWjaysgrdztrHYl .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yzWjaysgrdztrHYl .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yzWjaysgrdztrHYl .marker.cross{stroke:#333333;}#mermaid-svg-yzWjaysgrdztrHYl svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yzWjaysgrdztrHYl p{margin:0;}#mermaid-svg-yzWjaysgrdztrHYl .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yzWjaysgrdztrHYl text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-yzWjaysgrdztrHYl .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-yzWjaysgrdztrHYl .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-yzWjaysgrdztrHYl .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-yzWjaysgrdztrHYl .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-yzWjaysgrdztrHYl #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-yzWjaysgrdztrHYl .sequenceNumber{fill:white;}#mermaid-svg-yzWjaysgrdztrHYl #sequencenumber{fill:#333;}#mermaid-svg-yzWjaysgrdztrHYl #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-yzWjaysgrdztrHYl .messageText{fill:#333;stroke:none;}#mermaid-svg-yzWjaysgrdztrHYl .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yzWjaysgrdztrHYl .labelText,#mermaid-svg-yzWjaysgrdztrHYl .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-yzWjaysgrdztrHYl .loopText,#mermaid-svg-yzWjaysgrdztrHYl .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-yzWjaysgrdztrHYl .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-yzWjaysgrdztrHYl .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-yzWjaysgrdztrHYl .noteText,#mermaid-svg-yzWjaysgrdztrHYl .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-yzWjaysgrdztrHYl .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yzWjaysgrdztrHYl .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yzWjaysgrdztrHYl .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-yzWjaysgrdztrHYl .actorPopupMenu{position:absolute;}#mermaid-svg-yzWjaysgrdztrHYl .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-yzWjaysgrdztrHYl .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-yzWjaysgrdztrHYl .actor-man circle,#mermaid-svg-yzWjaysgrdztrHYl line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-yzWjaysgrdztrHYl :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1. 服务发现 2. 数据推送 (周期性) 3. 服务消失 OfferService(SID=0x1001, Instance=0x0001) on_sdv_service_available callback subscribe(SID=0x1001, EG=1, 0x8001) SubscribeEventGroup SubscribeEventGroupAck CAN/LIN 信号 (50 km/h) SOME/IP NOTIFICATION (EventID=0x8001) on_message(SID, EventID, binary_payload) on_event_notification(SID, EventID, binary_payload) RTTI 反射: binary_payload ->> SpeedData{speed:50.0, quality:1} topic_update("vehicle_speed", SpeedData{50.0, 1}) CAN/LIN 信号 (65 km/h) SOME/IP NOTIFICATION on_message(...) on_event_notification(...) RTTI translation topic_update("vehicle_speed", SpeedData{65.0, 1}) StopOfferService on_sdv_service_available callback (available=false) topic_unavailable("vehicle_speed")
9.4 诊断与调试
AAOS SDV 提供了多种诊断 SOME/IP 通信的方法:
1. 日志排查
text
# 查看 Broker 日志
logcat -s SdvSomeIpBroker
# 查看 Stack 日志
logcat -s SdvSomeIpStack
# vsomeip 自身日志
cat /data/vendor/vsomeip/vsomeip.log
2. 常用检查命令
bash
# 检查 Broker 是否运行
ps -A | grep someip
# 检查网络端口
netstat -an | grep 30490
# 检查 SELinux 上下文
ls -Z /vendor/bin/sdv_someip_stack_agent
3. 常见问题定位
| 问题现象 | 可能原因 | 检查方法 |
|---|---|---|
| 服务不可用 | SD 配置错误 | 检查多播地址和端口 |
| 数据为空 | 映射字段名不匹配 | 验证 field_name_mapping |
| 类型错误 | RTTI 未加载 | 确认 VSIDL Agent 正常运行 |
| 权限拒绝 | SELinux 策略 | 检查 avc log |
| 订阅失败 | EventGroup ID 不匹配 | 验证 group_id 设置 |
十、性能考虑与最佳实践
10.1 性能优化
1. 选择合适的传输协议
#mermaid-svg-uWVwK3zUbxxmGUMH{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-uWVwK3zUbxxmGUMH .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-uWVwK3zUbxxmGUMH .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-uWVwK3zUbxxmGUMH .error-icon{fill:#552222;}#mermaid-svg-uWVwK3zUbxxmGUMH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uWVwK3zUbxxmGUMH .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-uWVwK3zUbxxmGUMH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uWVwK3zUbxxmGUMH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uWVwK3zUbxxmGUMH .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-uWVwK3zUbxxmGUMH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uWVwK3zUbxxmGUMH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uWVwK3zUbxxmGUMH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uWVwK3zUbxxmGUMH .marker.cross{stroke:#333333;}#mermaid-svg-uWVwK3zUbxxmGUMH svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uWVwK3zUbxxmGUMH p{margin:0;}#mermaid-svg-uWVwK3zUbxxmGUMH .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-uWVwK3zUbxxmGUMH .cluster-label text{fill:#333;}#mermaid-svg-uWVwK3zUbxxmGUMH .cluster-label span{color:#333;}#mermaid-svg-uWVwK3zUbxxmGUMH .cluster-label span p{background-color:transparent;}#mermaid-svg-uWVwK3zUbxxmGUMH .label text,#mermaid-svg-uWVwK3zUbxxmGUMH span{fill:#333;color:#333;}#mermaid-svg-uWVwK3zUbxxmGUMH .node rect,#mermaid-svg-uWVwK3zUbxxmGUMH .node circle,#mermaid-svg-uWVwK3zUbxxmGUMH .node ellipse,#mermaid-svg-uWVwK3zUbxxmGUMH .node polygon,#mermaid-svg-uWVwK3zUbxxmGUMH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-uWVwK3zUbxxmGUMH .rough-node .label text,#mermaid-svg-uWVwK3zUbxxmGUMH .node .label text,#mermaid-svg-uWVwK3zUbxxmGUMH .image-shape .label,#mermaid-svg-uWVwK3zUbxxmGUMH .icon-shape .label{text-anchor:middle;}#mermaid-svg-uWVwK3zUbxxmGUMH .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-uWVwK3zUbxxmGUMH .rough-node .label,#mermaid-svg-uWVwK3zUbxxmGUMH .node .label,#mermaid-svg-uWVwK3zUbxxmGUMH .image-shape .label,#mermaid-svg-uWVwK3zUbxxmGUMH .icon-shape .label{text-align:center;}#mermaid-svg-uWVwK3zUbxxmGUMH .node.clickable{cursor:pointer;}#mermaid-svg-uWVwK3zUbxxmGUMH .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-uWVwK3zUbxxmGUMH .arrowheadPath{fill:#333333;}#mermaid-svg-uWVwK3zUbxxmGUMH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-uWVwK3zUbxxmGUMH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-uWVwK3zUbxxmGUMH .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uWVwK3zUbxxmGUMH .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-uWVwK3zUbxxmGUMH .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uWVwK3zUbxxmGUMH .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-uWVwK3zUbxxmGUMH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-uWVwK3zUbxxmGUMH .cluster text{fill:#333;}#mermaid-svg-uWVwK3zUbxxmGUMH .cluster span{color:#333;}#mermaid-svg-uWVwK3zUbxxmGUMH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-uWVwK3zUbxxmGUMH .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-uWVwK3zUbxxmGUMH rect.text{fill:none;stroke-width:0;}#mermaid-svg-uWVwK3zUbxxmGUMH .icon-shape,#mermaid-svg-uWVwK3zUbxxmGUMH .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-uWVwK3zUbxxmGUMH .icon-shape p,#mermaid-svg-uWVwK3zUbxxmGUMH .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-uWVwK3zUbxxmGUMH .icon-shape .label rect,#mermaid-svg-uWVwK3zUbxxmGUMH .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-uWVwK3zUbxxmGUMH .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-uWVwK3zUbxxmGUMH .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-uWVwK3zUbxxmGUMH :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 条件判断
选择策略
<= 1400 bytes + 延迟敏感
> 1400 bytes 或需可靠传输
需要多播
Payload 大小?
UDP
✓ 低延迟
✓ 开销小
✗ 可靠传输需应用层保证
TCP
✓ 可靠传输
✓ 自动重组
✗ 额外握手开销
- UDP:适用于周期性小数据(如传感器信号),开销小
- TCP:适用于大数据量和可靠传输需求(如配置更新)
2. 事件分组优化
#mermaid-svg-fsBr1d6ffsAbosTR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fsBr1d6ffsAbosTR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fsBr1d6ffsAbosTR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fsBr1d6ffsAbosTR .error-icon{fill:#552222;}#mermaid-svg-fsBr1d6ffsAbosTR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fsBr1d6ffsAbosTR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fsBr1d6ffsAbosTR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fsBr1d6ffsAbosTR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fsBr1d6ffsAbosTR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fsBr1d6ffsAbosTR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fsBr1d6ffsAbosTR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fsBr1d6ffsAbosTR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fsBr1d6ffsAbosTR .marker.cross{stroke:#333333;}#mermaid-svg-fsBr1d6ffsAbosTR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fsBr1d6ffsAbosTR p{margin:0;}#mermaid-svg-fsBr1d6ffsAbosTR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fsBr1d6ffsAbosTR .cluster-label text{fill:#333;}#mermaid-svg-fsBr1d6ffsAbosTR .cluster-label span{color:#333;}#mermaid-svg-fsBr1d6ffsAbosTR .cluster-label span p{background-color:transparent;}#mermaid-svg-fsBr1d6ffsAbosTR .label text,#mermaid-svg-fsBr1d6ffsAbosTR span{fill:#333;color:#333;}#mermaid-svg-fsBr1d6ffsAbosTR .node rect,#mermaid-svg-fsBr1d6ffsAbosTR .node circle,#mermaid-svg-fsBr1d6ffsAbosTR .node ellipse,#mermaid-svg-fsBr1d6ffsAbosTR .node polygon,#mermaid-svg-fsBr1d6ffsAbosTR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fsBr1d6ffsAbosTR .rough-node .label text,#mermaid-svg-fsBr1d6ffsAbosTR .node .label text,#mermaid-svg-fsBr1d6ffsAbosTR .image-shape .label,#mermaid-svg-fsBr1d6ffsAbosTR .icon-shape .label{text-anchor:middle;}#mermaid-svg-fsBr1d6ffsAbosTR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fsBr1d6ffsAbosTR .rough-node .label,#mermaid-svg-fsBr1d6ffsAbosTR .node .label,#mermaid-svg-fsBr1d6ffsAbosTR .image-shape .label,#mermaid-svg-fsBr1d6ffsAbosTR .icon-shape .label{text-align:center;}#mermaid-svg-fsBr1d6ffsAbosTR .node.clickable{cursor:pointer;}#mermaid-svg-fsBr1d6ffsAbosTR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fsBr1d6ffsAbosTR .arrowheadPath{fill:#333333;}#mermaid-svg-fsBr1d6ffsAbosTR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fsBr1d6ffsAbosTR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fsBr1d6ffsAbosTR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fsBr1d6ffsAbosTR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fsBr1d6ffsAbosTR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fsBr1d6ffsAbosTR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fsBr1d6ffsAbosTR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fsBr1d6ffsAbosTR .cluster text{fill:#333;}#mermaid-svg-fsBr1d6ffsAbosTR .cluster span{color:#333;}#mermaid-svg-fsBr1d6ffsAbosTR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fsBr1d6ffsAbosTR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fsBr1d6ffsAbosTR rect.text{fill:none;stroke-width:0;}#mermaid-svg-fsBr1d6ffsAbosTR .icon-shape,#mermaid-svg-fsBr1d6ffsAbosTR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fsBr1d6ffsAbosTR .icon-shape p,#mermaid-svg-fsBr1d6ffsAbosTR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fsBr1d6ffsAbosTR .icon-shape .label rect,#mermaid-svg-fsBr1d6ffsAbosTR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fsBr1d6ffsAbosTR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fsBr1d6ffsAbosTR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fsBr1d6ffsAbosTR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 优化后: 相关事件合并
EventGroup 1 (Powertrain)
EventA: 车速
EventB: 发动机转速
EventC: 油门位置
EventGroup 2 (Braking)
EventD: 制动状态
一次 Subscribe EG1
接收三个事件
优化前: 每个事件独立订阅
EventGroup 1
EventA: 车速
EventGroup 2
EventB: 发动机转速
EventGroup 3
EventC: 油门位置
EventGroup 4
EventD: 制动状态
每次 Subscribe 一个 EG
4 次订阅交互
将相关的 Event 组织在同一个 Event Group 中,减少订阅管理的开销。
3. 数据大小考虑
SOME/IP 支持分段传输(Segmentation),但应尽量控制单个消息大小以避免重组开销。
4. Broker 实例规划
根据 SOME/IP 域的规模和流量,合理规划单实例 vs 多实例部署。
10.2 架构最佳实践
1. 关注点分离
#mermaid-svg-WQpvYNGRfsUEZfIu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WQpvYNGRfsUEZfIu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WQpvYNGRfsUEZfIu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WQpvYNGRfsUEZfIu .error-icon{fill:#552222;}#mermaid-svg-WQpvYNGRfsUEZfIu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WQpvYNGRfsUEZfIu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WQpvYNGRfsUEZfIu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WQpvYNGRfsUEZfIu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WQpvYNGRfsUEZfIu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WQpvYNGRfsUEZfIu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WQpvYNGRfsUEZfIu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WQpvYNGRfsUEZfIu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WQpvYNGRfsUEZfIu .marker.cross{stroke:#333333;}#mermaid-svg-WQpvYNGRfsUEZfIu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WQpvYNGRfsUEZfIu p{margin:0;}#mermaid-svg-WQpvYNGRfsUEZfIu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WQpvYNGRfsUEZfIu .cluster-label text{fill:#333;}#mermaid-svg-WQpvYNGRfsUEZfIu .cluster-label span{color:#333;}#mermaid-svg-WQpvYNGRfsUEZfIu .cluster-label span p{background-color:transparent;}#mermaid-svg-WQpvYNGRfsUEZfIu .label text,#mermaid-svg-WQpvYNGRfsUEZfIu span{fill:#333;color:#333;}#mermaid-svg-WQpvYNGRfsUEZfIu .node rect,#mermaid-svg-WQpvYNGRfsUEZfIu .node circle,#mermaid-svg-WQpvYNGRfsUEZfIu .node ellipse,#mermaid-svg-WQpvYNGRfsUEZfIu .node polygon,#mermaid-svg-WQpvYNGRfsUEZfIu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WQpvYNGRfsUEZfIu .rough-node .label text,#mermaid-svg-WQpvYNGRfsUEZfIu .node .label text,#mermaid-svg-WQpvYNGRfsUEZfIu .image-shape .label,#mermaid-svg-WQpvYNGRfsUEZfIu .icon-shape .label{text-anchor:middle;}#mermaid-svg-WQpvYNGRfsUEZfIu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WQpvYNGRfsUEZfIu .rough-node .label,#mermaid-svg-WQpvYNGRfsUEZfIu .node .label,#mermaid-svg-WQpvYNGRfsUEZfIu .image-shape .label,#mermaid-svg-WQpvYNGRfsUEZfIu .icon-shape .label{text-align:center;}#mermaid-svg-WQpvYNGRfsUEZfIu .node.clickable{cursor:pointer;}#mermaid-svg-WQpvYNGRfsUEZfIu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WQpvYNGRfsUEZfIu .arrowheadPath{fill:#333333;}#mermaid-svg-WQpvYNGRfsUEZfIu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WQpvYNGRfsUEZfIu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WQpvYNGRfsUEZfIu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WQpvYNGRfsUEZfIu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WQpvYNGRfsUEZfIu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WQpvYNGRfsUEZfIu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WQpvYNGRfsUEZfIu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WQpvYNGRfsUEZfIu .cluster text{fill:#333;}#mermaid-svg-WQpvYNGRfsUEZfIu .cluster span{color:#333;}#mermaid-svg-WQpvYNGRfsUEZfIu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WQpvYNGRfsUEZfIu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WQpvYNGRfsUEZfIu rect.text{fill:none;stroke-width:0;}#mermaid-svg-WQpvYNGRfsUEZfIu .icon-shape,#mermaid-svg-WQpvYNGRfsUEZfIu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WQpvYNGRfsUEZfIu .icon-shape p,#mermaid-svg-WQpvYNGRfsUEZfIu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WQpvYNGRfsUEZfIu .icon-shape .label rect,#mermaid-svg-WQpvYNGRfsUEZfIu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WQpvYNGRfsUEZfIu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WQpvYNGRfsUEZfIu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WQpvYNGRfsUEZfIu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 职责清晰的三层架构
SDV Service Layer
业务逻辑处理
不关心 SOME/IP 细节
Broker Layer
协议翻译 + 类型映射
不实现业务逻辑
Stack Layer
SOME/IP 协议传输
不理解 payload 语义
- Stack 只负责协议传输,不处理 payload 语义
- Broker 负责协议翻译,不实现业务逻辑
- 业务逻辑放在 SDV Service 层
2. 映射文件管理
- 将映射文件与 SDV 服务定义分开管理
- 使用版本控制跟踪映射变化
- 利用
sd_behavior精细控制服务发现的兼容性
3. 安全设计
#mermaid-svg-8MO7cgOxyj2Egmvr{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8MO7cgOxyj2Egmvr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8MO7cgOxyj2Egmvr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8MO7cgOxyj2Egmvr .error-icon{fill:#552222;}#mermaid-svg-8MO7cgOxyj2Egmvr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8MO7cgOxyj2Egmvr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8MO7cgOxyj2Egmvr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8MO7cgOxyj2Egmvr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8MO7cgOxyj2Egmvr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8MO7cgOxyj2Egmvr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8MO7cgOxyj2Egmvr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8MO7cgOxyj2Egmvr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8MO7cgOxyj2Egmvr .marker.cross{stroke:#333333;}#mermaid-svg-8MO7cgOxyj2Egmvr svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8MO7cgOxyj2Egmvr p{margin:0;}#mermaid-svg-8MO7cgOxyj2Egmvr .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8MO7cgOxyj2Egmvr .cluster-label text{fill:#333;}#mermaid-svg-8MO7cgOxyj2Egmvr .cluster-label span{color:#333;}#mermaid-svg-8MO7cgOxyj2Egmvr .cluster-label span p{background-color:transparent;}#mermaid-svg-8MO7cgOxyj2Egmvr .label text,#mermaid-svg-8MO7cgOxyj2Egmvr span{fill:#333;color:#333;}#mermaid-svg-8MO7cgOxyj2Egmvr .node rect,#mermaid-svg-8MO7cgOxyj2Egmvr .node circle,#mermaid-svg-8MO7cgOxyj2Egmvr .node ellipse,#mermaid-svg-8MO7cgOxyj2Egmvr .node polygon,#mermaid-svg-8MO7cgOxyj2Egmvr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8MO7cgOxyj2Egmvr .rough-node .label text,#mermaid-svg-8MO7cgOxyj2Egmvr .node .label text,#mermaid-svg-8MO7cgOxyj2Egmvr .image-shape .label,#mermaid-svg-8MO7cgOxyj2Egmvr .icon-shape .label{text-anchor:middle;}#mermaid-svg-8MO7cgOxyj2Egmvr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8MO7cgOxyj2Egmvr .rough-node .label,#mermaid-svg-8MO7cgOxyj2Egmvr .node .label,#mermaid-svg-8MO7cgOxyj2Egmvr .image-shape .label,#mermaid-svg-8MO7cgOxyj2Egmvr .icon-shape .label{text-align:center;}#mermaid-svg-8MO7cgOxyj2Egmvr .node.clickable{cursor:pointer;}#mermaid-svg-8MO7cgOxyj2Egmvr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8MO7cgOxyj2Egmvr .arrowheadPath{fill:#333333;}#mermaid-svg-8MO7cgOxyj2Egmvr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8MO7cgOxyj2Egmvr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8MO7cgOxyj2Egmvr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8MO7cgOxyj2Egmvr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8MO7cgOxyj2Egmvr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8MO7cgOxyj2Egmvr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8MO7cgOxyj2Egmvr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8MO7cgOxyj2Egmvr .cluster text{fill:#333;}#mermaid-svg-8MO7cgOxyj2Egmvr .cluster span{color:#333;}#mermaid-svg-8MO7cgOxyj2Egmvr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8MO7cgOxyj2Egmvr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8MO7cgOxyj2Egmvr rect.text{fill:none;stroke-width:0;}#mermaid-svg-8MO7cgOxyj2Egmvr .icon-shape,#mermaid-svg-8MO7cgOxyj2Egmvr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8MO7cgOxyj2Egmvr .icon-shape p,#mermaid-svg-8MO7cgOxyj2Egmvr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8MO7cgOxyj2Egmvr .icon-shape .label rect,#mermaid-svg-8MO7cgOxyj2Egmvr .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8MO7cgOxyj2Egmvr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8MO7cgOxyj2Egmvr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8MO7cgOxyj2Egmvr :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 纵深防御策略
网络层隔离
独立 VLAN / 防火墙规则
SELinux 层控制
Binder / 网络 / 文件 细粒度策略
Broker 层认证
服务级访问控制列表 (ACL)
应用层安全
Android 权限模型 + Service 认证
- 使用 SELinux 进行细粒度的访问控制
- 网络隔离:不同的 SOME/IP 域使用独立的 VLAN
- 认证与授权:在 Broker 层实现服务级的访问控制
4. 可测试性
- 利用 Cuttlefish 虚拟设备进行云端开发和测试
- 编写自动化测试验证映射配置的正确性
- 使用仿真工具模拟 AUTOSAR ECU 的行为
十一、总结与展望
11.1 Google 的 SOME/IP 集成方案总结
#mermaid-svg-SKS8Qk5tlY2mY77j{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-SKS8Qk5tlY2mY77j .error-icon{fill:#552222;}#mermaid-svg-SKS8Qk5tlY2mY77j .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-SKS8Qk5tlY2mY77j .marker{fill:#333333;stroke:#333333;}#mermaid-svg-SKS8Qk5tlY2mY77j .marker.cross{stroke:#333333;}#mermaid-svg-SKS8Qk5tlY2mY77j svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-SKS8Qk5tlY2mY77j p{margin:0;}#mermaid-svg-SKS8Qk5tlY2mY77j .edge{stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .section--1 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section--1 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section--1 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section--1 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section--1 text{fill:#ffffff;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth--1{stroke-width:17;}#mermaid-svg-SKS8Qk5tlY2mY77j .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-0 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-0 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-0 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-0 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-0 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-0{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-0{stroke-width:14;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-1 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-1 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-1 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-1 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-1 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-1{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-1{stroke-width:11;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-2 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-2 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-2 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-2 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-2 text{fill:#ffffff;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-2{stroke-width:8;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-3 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-3 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-3 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-3 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-3 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-3{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-3{stroke-width:5;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-4 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-4 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-4 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-4 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-4 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-4{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-4{stroke-width:2;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-5 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-5 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-5 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-5 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-5 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-5{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-5{stroke-width:-1;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-6 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-6 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-6 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-6 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-6 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-6{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-6{stroke-width:-4;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-7 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-7 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-7 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-7 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-7 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-7{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-7{stroke-width:-7;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-8 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-8 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-8 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-8 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-8 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-8{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-8{stroke-width:-10;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-9 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-9 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-9 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-9 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-9 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-9{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-9{stroke-width:-13;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-10 rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-10 path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-10 circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-10 polygon,#mermaid-svg-SKS8Qk5tlY2mY77j .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-10 text{fill:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .node-icon-10{font-size:40px;color:black;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .edge-depth-10{stroke-width:-16;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled circle,#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:lightgray;}#mermaid-svg-SKS8Qk5tlY2mY77j .disabled text{fill:#efefef;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-root rect,#mermaid-svg-SKS8Qk5tlY2mY77j .section-root path,#mermaid-svg-SKS8Qk5tlY2mY77j .section-root circle,#mermaid-svg-SKS8Qk5tlY2mY77j .section-root polygon{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-SKS8Qk5tlY2mY77j .section-root text{fill:#ffffff;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-root span{color:#ffffff;}#mermaid-svg-SKS8Qk5tlY2mY77j .section-2 span{color:#ffffff;}#mermaid-svg-SKS8Qk5tlY2mY77j .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-SKS8Qk5tlY2mY77j .edge{fill:none;}#mermaid-svg-SKS8Qk5tlY2mY77j .mindmap-node-label{dy:1em;alignment-baseline:middle;text-anchor:middle;dominant-baseline:middle;text-align:center;}#mermaid-svg-SKS8Qk5tlY2mY77j :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} AAOS SOME/IP
架构分层
Broker + Stack 分离
AIDL 标准化接口
RTTI 动态类型翻译
核心能力
跨协议通信
多 VM 部署
运行时类型映射
工具链
VSIDL 定义语言
vsidl_rc_generator
Cuttlefish 仿真
安全
SELinux 策略
网络隔离
Binder ACL
Google 在 AAOS SDV 中的 SOME/IP 集成提供了:
- 清晰的架构分层:通过 Broker + Stack 的分离设计,实现了关注点分离
- 灵活的类型系统:基于 RTTI 的动态类型翻译,支持运行时处理未知服务类型
- 标准化接口:ISomeIpStack AIDL 接口使得不同 OEM 可以实现自己的 Stack 而不影响上层
- 完整的工具链:从 VSIDL 定义到构建工具 vsidl_rc_generator,提供了端到端的开发支持
- 安全机制:SELinux 策略保证了通信的安全隔离
11.2 与其他方案的对比
| 特性 | Google AAOS SOME/IP | 传统 AUTOSAR SOME/IP | 第三方方案 |
|---|---|---|---|
| 平台 | Android | 嵌入式 RTOS | 多平台 |
| 通信栈 | AIDL 抽象层 | 原生 C API | 各异 |
| 类型系统 | Protobuf + RTTI | ARXML 定义 | 各异 |
| 部署环境 | 多 VM VirtIO | 物理 ECU | 依赖实现 |
| 开发语言 | Rust/Java/Kotlin | C/C++ | 各异 |
11.3 未来展望
#mermaid-svg-ZwhQVHjVInBnvURe{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-ZwhQVHjVInBnvURe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ZwhQVHjVInBnvURe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ZwhQVHjVInBnvURe .error-icon{fill:#552222;}#mermaid-svg-ZwhQVHjVInBnvURe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ZwhQVHjVInBnvURe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ZwhQVHjVInBnvURe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ZwhQVHjVInBnvURe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ZwhQVHjVInBnvURe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ZwhQVHjVInBnvURe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ZwhQVHjVInBnvURe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ZwhQVHjVInBnvURe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ZwhQVHjVInBnvURe .marker.cross{stroke:#333333;}#mermaid-svg-ZwhQVHjVInBnvURe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ZwhQVHjVInBnvURe p{margin:0;}#mermaid-svg-ZwhQVHjVInBnvURe .edge{stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .section--1 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section--1 path,#mermaid-svg-ZwhQVHjVInBnvURe .section--1 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section--1 path{fill:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section--1 text{fill:#ffffff;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon--1{font-size:40px;color:#ffffff;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge--1{stroke:hsl(240, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth--1{stroke-width:17;}#mermaid-svg-ZwhQVHjVInBnvURe .section--1 line{stroke:hsl(60, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:#ffffff;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-0 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-0 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-0 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-0 path{fill:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-0 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-0{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-0{stroke:hsl(60, 100%, 73.5294117647%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-0{stroke-width:14;}#mermaid-svg-ZwhQVHjVInBnvURe .section-0 line{stroke:hsl(240, 100%, 83.5294117647%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-1 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-1 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-1 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-1 path{fill:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-1 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-1{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-1{stroke:hsl(80, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-1{stroke-width:11;}#mermaid-svg-ZwhQVHjVInBnvURe .section-1 line{stroke:hsl(260, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-2 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-2 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-2 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-2 path{fill:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-2 text{fill:#ffffff;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-2{font-size:40px;color:#ffffff;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-2{stroke:hsl(270, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-2{stroke-width:8;}#mermaid-svg-ZwhQVHjVInBnvURe .section-2 line{stroke:hsl(90, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:#ffffff;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-3 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-3 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-3 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-3 path{fill:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-3 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-3{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-3{stroke:hsl(300, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-3{stroke-width:5;}#mermaid-svg-ZwhQVHjVInBnvURe .section-3 line{stroke:hsl(120, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-4 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-4 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-4 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-4 path{fill:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-4 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-4{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-4{stroke:hsl(330, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-4{stroke-width:2;}#mermaid-svg-ZwhQVHjVInBnvURe .section-4 line{stroke:hsl(150, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-5 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-5 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-5 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-5 path{fill:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-5 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-5{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-5{stroke:hsl(0, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-5{stroke-width:-1;}#mermaid-svg-ZwhQVHjVInBnvURe .section-5 line{stroke:hsl(180, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-6 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-6 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-6 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-6 path{fill:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-6 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-6{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-6{stroke:hsl(30, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-6{stroke-width:-4;}#mermaid-svg-ZwhQVHjVInBnvURe .section-6 line{stroke:hsl(210, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-7 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-7 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-7 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-7 path{fill:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-7 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-7{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-7{stroke:hsl(90, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-7{stroke-width:-7;}#mermaid-svg-ZwhQVHjVInBnvURe .section-7 line{stroke:hsl(270, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-8 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-8 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-8 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-8 path{fill:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-8 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-8{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-8{stroke:hsl(150, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-8{stroke-width:-10;}#mermaid-svg-ZwhQVHjVInBnvURe .section-8 line{stroke:hsl(330, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-9 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-9 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-9 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-9 path{fill:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-9 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-9{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-9{stroke:hsl(180, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-9{stroke-width:-13;}#mermaid-svg-ZwhQVHjVInBnvURe .section-9 line{stroke:hsl(0, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-10 rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-10 path,#mermaid-svg-ZwhQVHjVInBnvURe .section-10 circle,#mermaid-svg-ZwhQVHjVInBnvURe .section-10 path{fill:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-10 text{fill:black;}#mermaid-svg-ZwhQVHjVInBnvURe .node-icon-10{font-size:40px;color:black;}#mermaid-svg-ZwhQVHjVInBnvURe .section-edge-10{stroke:hsl(210, 100%, 76.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .edge-depth-10{stroke-width:-16;}#mermaid-svg-ZwhQVHjVInBnvURe .section-10 line{stroke:hsl(30, 100%, 86.2745098039%);stroke-width:3;}#mermaid-svg-ZwhQVHjVInBnvURe .lineWrapper line{stroke:black;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled,#mermaid-svg-ZwhQVHjVInBnvURe .disabled circle,#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:lightgray;}#mermaid-svg-ZwhQVHjVInBnvURe .disabled text{fill:#efefef;}#mermaid-svg-ZwhQVHjVInBnvURe .section-root rect,#mermaid-svg-ZwhQVHjVInBnvURe .section-root path,#mermaid-svg-ZwhQVHjVInBnvURe .section-root circle{fill:hsl(240, 100%, 46.2745098039%);}#mermaid-svg-ZwhQVHjVInBnvURe .section-root text{fill:#ffffff;}#mermaid-svg-ZwhQVHjVInBnvURe .icon-container{height:100%;display:flex;justify-content:center;align-items:center;}#mermaid-svg-ZwhQVHjVInBnvURe .edge{fill:none;}#mermaid-svg-ZwhQVHjVInBnvURe .eventWrapper{filter:brightness(120%);}#mermaid-svg-ZwhQVHjVInBnvURe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 2024-2025 初始 SDV 架构发布 SOME/IP 集成预览 Cuttlefish 多 VM 支持 2026 AAOS SDV 全面开源 (AOSP Q2/Q4) SDV SOME/IP 框架稳定 云端开发工具链成熟 2027+ 向 ASIL-B/D 安全域扩展 更深度的 ADAS 集成 跨域服务编排 AAOS SDV 发展路线图
随着 AAOS SDV 在 2026 年全面开源(AOSP),我们可以期待:
- 更广泛的 OEM 采用:Google 将 AAOS SDV 扩展为软件定义汽车的基础平台
- 云端开发强化:Cuttlefish 虚拟化环境使得"先开发软件、后匹配硬件"的开发模式更加成熟
- 与 ADAS 更深度集成:AAOS SDV 正在向 QM 级以上的安全关键应用扩展
- 工具链完善:VSIDL、映射文件生成器、调试工具将更加成熟
十二、参考资料
- Android Open Source Project - Automotive Documentation
- AOSP - SOME/IP Integration Guide
- AOSP - SOME/IP Mapping File
- AOSP - Implement the SOME/IP Stack
- AOSP - Integrate SOME/IP with SDV
- COVESA vsomeip Project
- AUTOSAR SOME/IP Protocol Specification
- Android Developers Blog - Beyond Infotainment
本文内容基于 AOSP 官方文档和 AAOS SDV 公开技术资料整理,如有更新请以官方文档为准。