리플렉션을 위한 VSIDL 제공자

VSIDL 제공자는 서비스 번들이 SDV 플랫폼 에이전트 (진단, 원격 분석, SOME/IP)에 VSIDL 선언 메타데이터를 제공할 수 있도록 하는 라이브러리 및 도구 집합입니다.

특히 VSIDL 제공자는 SDV 에이전트가 다음 메타데이터를 검색할 수 있도록 지원합니다.

서비스 번들 개발자를 위한 VSIDL 제공업체 가이드

VSIDL 제공자 라이브러리는 다음 작업을 실행합니다.

  • 다음 두 위치에서 파일을 찾습니다.
    • sdv_service_bundle_metadata에 정의된 경로의 Apex 내
    • 정적 경로의 이미지
  • 동일한 VM 또는 다른 VM에 상주하는 에이전트에서 API를 쿼리하기 위해 RPC 호출을 시작합니다.

그림 1.VSIDL 제공업체 개요

서비스 번들을 개발하는 경우 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를 사용하여 생성된 모든 genruleprebuilt_etc 타겟으로 Android.bp를 작성할 위치를 지정합니다.

생성기는 관련 genruleprebuilt_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_descriptor
  • get_diagnostics_declaration

다양한 데이터 소스와 소스 우선순위가 있는 다양한 버전은 core_services/vsidl/provider/src/vsidl_provider.rs에서 확인할 수 있습니다.

vsidl_provider 크레이트는 다양한 SDV 에이전트에 맞게 조정된 프로바이더 인스턴스를 생성하는 여러 공개 함수를 제공합니다. 각 구성은 VSIDL 관련 데이터를 해결하기 위한 고유한 데이터 소스 체인을 지정합니다. 다음 표에서는 각 생성자 함수의 동작을 간략하게 설명합니다.

생성자 함수데이터 유형데이터 소스 조회 (및 순서)
new_for_vsidl_provider_agent SomeIpAPEX
DiagnosticsAPEX
VsidlSchemasAPEX, 파일
new_for_diagnostics_agentDiagnostics에이전트 (원격), APEX
VsidlSchemas파일
new_for_someip_broker_agent SomeIpAPEX
VsidlSchemas파일
new_for_telemetry_agentVsidlSchemas에이전트 (원격 및 로컬)
new_for_integration_test SomeIp에이전트 (원격 및 로컬)
Diagnostics에이전트 (원격 및 로컬)
VsidlSchemas에이전트 (원격 및 로컬)

표의 데이터 소스는 그림 1의 호출을 참조합니다.