VSIDL 제공자는 서비스 번들이 SDV 플랫폼 에이전트 (진단, 원격 분석, SOME/IP)에 VSIDL 선언 메타데이터를 제공할 수 있도록 하는 라이브러리 및 도구 집합입니다.
특히 VSIDL 제공자는 SDV 에이전트가 다음 메타데이터를 검색할 수 있도록 지원합니다.
- VSIDL 카탈로그에 사용되는 메시지 및 서비스의 protobuf 설명자
- SOME/IP 매핑
- 서비스 번들의 진단 선언
서비스 번들 개발자를 위한 VSIDL 제공업체 가이드
VSIDL 제공자 라이브러리는 다음 작업을 실행합니다.
- 다음 두 위치에서 파일을 찾습니다.
- sdv_service_bundle_metadata에 정의된 경로의 Apex 내
- 정적 경로의 이미지
- 동일한 VM 또는 다른 VM에 상주하는 에이전트에서 API를 쿼리하기 위해 RPC 호출을 시작합니다.
서비스 번들을 개발하는 경우 VSIDL 제공자 라이브러리의 세부사항을 알 필요가 없습니다. 이 단계를 따르면 VSIDL 제공자가 런타임에 필요한 파일을 찾을 수 있습니다.
카탈로그의 런타임 구성 생성
세 가지 파일 유형 (vsidl 스키마, 진단 선언, someip 매핑)은 모두 vsidl_rc_generator 도구에서 생성됩니다.
vsidlc에 사용된 것과 동일한 매개변수와 다음 추가 매개변수를 사용하여 vsidl_rc_generator 호스트 바이너리 도구를 사용합니다.
--variant runtime-config-prebuilts--filegroup를 사용하여 카탈로그의 모든 파일 (Android.bp포함)이 포함된 filegroup 타겟 이름을 지정합니다.
참고로 관련 vsidlc 매개변수는 다음과 같습니다.
--catalog-path: 카탈로그의 루트 경로를 지정합니다.--dependency-catalog-path를 사용하여 종속 카탈로그를 지정합니다.-- -path를 사용하여 생성된 모든genrule및prebuilt_etc타겟으로Android.bp를 작성할 위치를 지정합니다.
생성기는 관련 genrule 및 prebuilt_etc 타겟이 포함된 Android.bp 파일을 만듭니다. Android.bp에서 생성된 타겟 블록 위에는 각 타겟의 의도된 사용법을 나타내는 주석이 있습니다.
APEX의 Android.bp 업데이트
생성된 Android.bp 파일의 주석에 다음과 같이 표시됩니다.
// Usage: add the following line to ... declaration
이러한 타겟 (표시된 Usage 주석 아래)을 Apex를 정의하는 Android.bp에 추가해야 합니다.
apex {
name: "some_apex_name",
...
prebuilts: [
// ADD THE prebuilt_etc TARGETS HERE
],
...
}
APEX의 sdv_service_bundles_manifest.textproto 업데이트
Apex의 sdv_service_bundles_manifest.textproto 파일의 sdv_service_bundle_metadata 블록 내에서 다음을 정의해야 합니다 (해당 경로에만 해당).
sdv_service_bundle_metadata {
...
vsidl_schemas_path: "etc/vsidl_provider/SomeFile-vsidl-config.binpb"
diagnostics_config_path: "etc/vsidl_provider/SomeFile-diag-config.binpb"
external_protocol_mapping_path: "etc/vsidl_provider/someip-config.binpb"
...
}
자체 경로를 정의하지 마세요. 대신 생성된 Android.bp 파일의 주석에 표시된 경로를 복사하세요. 경로는 다음과 같이 찾을 수 있습니다.
// + vsidl_schemas_path:
// + diagnostics_config_path:
// + external_protocol_mapping_path:
이렇게 하면 VSIDL 프로바이더 인스턴스가 각 sdv_service_bundle_metadata 항목에 지정된 경로에서 쿼리할 수 있습니다.
이미지에 타겟 추가
생성된 Android.bp 파일은 이미지에 직접 로드할 수 있는 타겟도 생성합니다. 또한 주석은 다음과 같이 이러한 방식으로 사용되어야 하는 타겟을 나타냅니다.
// Usage: add this target to the VM image.
생성된 prebuilt_etc 타겟은 genrule로 생성된 파일을 이미지의 미리 지정된 위치에 배치합니다. 각 *.mk 파일 (예: device/google/sdv/sdv_core_base/sdv_samples_automotive_services.mk)에 prebuilt_etc 타겟을 포함해야 합니다.
플랫폼 개발자를 위한 VSIDL 제공업체 가이드
일반적으로 리플렉션 기능이 필요한 SDV 에이전트를 개발하는 경우 VSIDL 제공자 라이브러리를 사용할 수 있습니다.
VSIDL 제공자 라이브러리 API에는 다음 함수가 포함되어 있습니다.
async fn get_publication_descriptor(
&self,
source_fqin: &ServiceFqin,
unit_type: &UnitType,
) -> SdvResult<PublicationDescriptor>;
async fn get_rpc_method_descriptor(
&self,
source_fqin: &ServiceFqin,
unit_type: &UnitType,
method_name: &str,
) -> SdvResult<RpcMethodDescriptor>;
async fn get_message_descriptor(
&self,
source_fqin: &ServiceFqin,
message_name: &str,
) -> SdvResult<MessageDescriptor>;
async fn get_someip_mappings(&self, source_fqin: &ServiceFqin)
-> SdvResult<Vec<SomeIpMapping>>;
async fn get_diagnostics_declaration(
&self,
fqin: &ServiceFqin,
) -> SdvResult<DiagnosticsDeclaration>;
async fn subscribe_availability_change_by_vm(
&self,
vm_name: &str,
) -> SdvResult<AvailabilityStream>;
장소
pub type AvailabilityStream = Pin<Box<dyn Stream<Item = AvailabilityChangeEvent> + Send>>;
모든 함수는 source_fqin 매개변수를 사용하여 쿼리됩니다. 이렇게 하면 동일한 unit_type 또는 message_name를 사용하는 서로 다른 FQIN이 올바른 데이터를 반환합니다. 이 파라미터는 VSIDL 프로바이더 라이브러리를 가장 정확한 메시지 스키마가 포함된 특정 APEX로 안내합니다. APEX는 독립적으로 업데이트되며 동일한 protobuf 메시지나 서비스에 다른 스키마를 사용할 수 있으므로 이 작업이 필요합니다.
get_message_descriptor 함수 사용
이는 리플렉션에 사용되는 외부 크레이트에서 순수하게 pub struct MessageDescriptor를 반환합니다. MessageDescriptor는 메타데이터의 일부로, 리플렉션을 허용하여 런타임에 protobuf 메시지를 동적으로 검사하고 조작할 수 있습니다.
get_publication_descriptor 함수 사용
이 함수는 다음을 나타내는 PublicationDescriptor를 반환합니다.
pub struct PublicationDescriptor {
/// Message descriptor for publication.
pub message_descriptor: MessageDescriptor,
/// Information about the size of the publication message.
pub size_metadata: SizeMetadata,
}
size_metadata 필드에는 게시의 메시지 크기 및 제약 조건에 관한 정보가 포함됩니다. 이 메타데이터는 VSIDL 구성에서 파생됩니다.
pub struct SizeMetadata {
/// Message size in bytes.
pub message_size: u32,
/// Message count.
pub message_count: u32,
/// VSIDL-declared size constraints for the message fields.
pub field_size_constraints: HashMap<String, FieldSizeConstraint>,
}
pub struct FieldSizeConstraint {
/// Max number of repeated fields allowed for the field.
pub repeated_max_count: Option<u32>,
/// Max size of variable sized types (string, bytes) in bytes.
pub variable_type_max_size: Option<u32>,
}
get_rpc_method_descriptor 함수 사용
이 함수는 다음을 나타내는 RpcMethodDescriptor를 반환합니다.
pub struct RpcMethodDescriptor {
/// Message descriptor for RPC request.
pub request_message: Option<MessageDescriptor>,
/// Message descriptor for RPC response.
pub response_message: Option<MessageDescriptor>,
}
이 구조체는 RPC 메서드의 요청 및 응답 메시지 모두에 대한 MessageDescriptor를 보유합니다.
get_someip_mappings 함수 사용
이는 core_services/vsidl/protos/sdv/someip/v1/someip.proto에 정의된 로컬 SOME/IP 서비스 매핑을 가져오는 함수입니다.
get_diagnostics_declaration 함수 사용
이는 core_services/vsidl/protos/sdv/diagnostics/v1/diagnostics_syntax.proto에 정의된 진단 선언을 가져오는 함수입니다.
subscribe_availability_change_by_vm 함수 사용
이 함수는 지정된 가상 머신의 가용성 스트림을 반환하여 중요한 대체 메커니즘 역할을 합니다. 표준 VSIDL 제공자 API 호출이 SdvStatusCode::Unavailable 오류로 실패할 때 사용하여 시스템이 VSIDL 제공자 인터페이스가 다시 온라인 상태가 될 때까지 효율적으로 기다릴 수 있도록 합니다.
이 함수의 주요 동작은 다음과 같습니다.
- 즉시 방출: 구독 시 스트림은 타겟 가상 머신의 현재 사용 가능 상태를 방출합니다.
- 동작 패리티: 결과 스트림은
ServiceDiscoveryManager에서 사용하는subscribe_service_unit_change_by_name함수와 동일하게 동작합니다.
VSIDL 제공업체 에이전트
모든 VM은 자체 VSIDL 제공자 에이전트를 실행합니다. 이는 기본적으로 에이전트 내 라이브러리의 로컬 인스턴스인 VSIDL 제공자 API에 대한 요청을 전달하는 RPC 서버입니다. 에이전트는 다른 VM의 VSIDL 제공자를 쿼리하는 데 사용됩니다. 즉, 한 VM의 서비스가 이 에이전트를 사용하여 다른 VM의 VSIDL 메타데이터를 쿼리할 수 있습니다.
코드베이스에서 API 사용
SOMEIP:
get_publication_descriptor(모든 구조체 필드가 사용됨)get_rpc_method_descriptor(모든 구조체 필드가 사용됨)get_someip_mappings
원격 분석:
get_publication_descriptor(message_descriptor필드만 사용)get_rpc_method_descriptor(모든 구조체 필드가 사용됨)
진단:
get_message_descriptorget_diagnostics_declaration
다양한 데이터 소스와 소스 우선순위가 있는 다양한 버전은 core_services/vsidl/provider/src/vsidl_provider.rs에서 확인할 수 있습니다.
vsidl_provider 크레이트는 다양한 SDV 에이전트에 맞게 조정된 프로바이더 인스턴스를 생성하는 여러 공개 함수를 제공합니다. 각 구성은 VSIDL 관련 데이터를 해결하기 위한 고유한 데이터 소스 체인을 지정합니다. 다음 표에서는 각 생성자 함수의 동작을 간략하게 설명합니다.
| 생성자 함수 | 데이터 유형 | 데이터 소스 조회 (및 순서) |
|---|---|---|
new_for_vsidl_provider_agent |
SomeIp | APEX |
Diagnostics | APEX | |
VsidlSchemas | APEX, 파일 | |
new_for_diagnostics_agent | Diagnostics | 에이전트 (원격), APEX |
VsidlSchemas | 파일 | |
new_for_someip_broker_agent |
SomeIp | APEX |
VsidlSchemas | 파일 | |
new_for_telemetry_agent | VsidlSchemas | 에이전트 (원격 및 로컬) |
new_for_integration_test |
SomeIp | 에이전트 (원격 및 로컬) |
Diagnostics | 에이전트 (원격 및 로컬) | |
VsidlSchemas | 에이전트 (원격 및 로컬) |
표의 데이터 소스는 그림 1의 호출을 참조합니다.