Google AAOS 中 SOME/IP 框架深度解析:从架构到实践

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)                     |
+----------------------------------------------------+

关键组件

  1. SOME/IP Broker Agent:SDV 与 SOME/IP 网络之间的代理,核心翻译引擎
  2. SOME/IP Stack:通过 AIDL 抽象的低层 SOME/IP 传输逻辑,实现(如 COVESA vsomeip)
  3. 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 集成的核心组件,它的主要职责包括:

  1. 协议翻译:在 SDV 通信原语和 SOME/IP 协议之间进行双向翻译
  2. 服务代理:作为 SDV 服务和 AUTOSAR 服务之间的代理
  3. 类型映射:基于 RTTI 在运行时处理服务特定的数据翻译
  4. 路由管理:管理多个 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 引擎的工作流程:

  1. Broker 从 VSIDL Catalog Provider 加载类型信息
  2. 当收到消息时,Broker 根据服务 ID 和方法/事件 ID 查询 RTTI
  3. RTTI 提供字段级别的序列化/反序列化指令
  4. 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 集成提供了:

  1. 清晰的架构分层:通过 Broker + Stack 的分离设计,实现了关注点分离
  2. 灵活的类型系统:基于 RTTI 的动态类型翻译,支持运行时处理未知服务类型
  3. 标准化接口:ISomeIpStack AIDL 接口使得不同 OEM 可以实现自己的 Stack 而不影响上层
  4. 完整的工具链:从 VSIDL 定义到构建工具 vsidl_rc_generator,提供了端到端的开发支持
  5. 安全机制: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),我们可以期待:

  1. 更广泛的 OEM 采用:Google 将 AAOS SDV 扩展为软件定义汽车的基础平台
  2. 云端开发强化:Cuttlefish 虚拟化环境使得"先开发软件、后匹配硬件"的开发模式更加成熟
  3. 与 ADAS 更深度集成:AAOS SDV 正在向 QM 级以上的安全关键应用扩展
  4. 工具链完善:VSIDL、映射文件生成器、调试工具将更加成熟

十二、参考资料


本文内容基于 AOSP 官方文档和 AAOS SDV 公开技术资料整理,如有更新请以官方文档为准。

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui