차량 서비스 인터페이스 정의 언어 (VSIDL) 미들웨어 는 소프트웨어 정의 차량 (SDV) 통신 스택 위에 추상화 계층을 만들어 SDV 생태계의 사용을 간소화하는 Rust 라이브러리 집합을 정의합니다. 미들웨어는 서비스가 서로 통신하고 상호작용할 수 있는 표준화된 방법을 제공합니다. VSIDLC 생성 코드와 커스텀 코드는 모두 이러한 라이브러리를 사용합니다.
차량 서비스 인터페이스 정의 언어 컴파일러 (VSIDLC) 는 정의의 유효성을 검사하고, 빌드 프로세스 중에 Rust 미들웨어 코드를 생성하는 genrule 타겟이 포함된 빌드 파일 (Android.bp)을 생성하며, 카탈로그의 VSIDL 및 protobuf 파일에서 배포 구성을 만듭니다. 그림 1은 VSIDLC의 입력과 VSIDLC에서 생성된 출력을 보여줍니다.
그림 1. VSIDLC 입력 및 출력
다음은 다이어그램에 관한 설명입니다.
입력으로 카탈로그라고 하는 디렉터리 내에 정리된 다음 파일을 제공합니다.
- Proto 파일 (확장자
.proto포함)에는 VSIDL로 정의된 서비스 단위 간에 교환되는 데이터 구조가 포함되어 있습니다. - VSIDL 파일 (
.vsidl확장자 포함)은 서비스 번들, 서비스 단위, 단위 유형 소유권을 정의합니다. - 각 카탈로그 디렉터리의
Android.bp파일은 카탈로그 내의 모든 proto 파일에 대한rust_protobuf빌드 타겟을 정의합니다. VSIDLC는 이러한 타겟에 지정된crate_name을 사용하여 Rust에서 생성된 protobuf 메시지 유형을 참조합니다.
- Proto 파일 (확장자
VSIDLC를 실행하여 다음 파일을 출력합니다.
Android.bp파일은 각 서비스 번들의 폴더 내에 생성됩니다.--genrule을 설정하면 이러한 타겟은 빌드 프로세스 중에 최신 Rust 파일을 생성하고 필요한rust_protobuf라이브러리 종속 항목을 포함합니다.service_bundle.rs파일은 각 서비스 번들에 대해 생성되며 미들웨어 구성요소와 상호작용하기 위한 기본struct및 함수를 포함합니다.lib.rs파일은 번들이 소유한 각 RPC 서비스에 대해 생성되며 RPC 서비스의 이름을 딴 하위 폴더에 배치됩니다. 이러한 파일에는 다음이 포함됩니다.Interface트레잇은 서버 측 로직을 구현합니다.Client구조체는 RPC 서비스를 호출합니다.diagnostics.rs파일은 VSIDL 파일에diagnostics_declaration이 있는 경우 생성되며 UDS 기반 진단에 필요한 바인딩을 제공합니다.배포 및 보안 구성은
--apex플래그를 사용할 때 생성됩니다. 이러한 구성은apex/및configs/디렉터리에 배치되며 서비스 간 통신에 필요한 조정.textproto파일과 보안 정책 (권한)을 포함합니다.서비스 상용구는
--services플래그를 사용할 때 생성됩니다. 이러한 상용구는services/디렉터리에 배치되며 구현을 시작하기 위한main.rs파일을 포함한 Rust 애플리케이션 스켈레톤을 포함합니다.
VSIDLC 실행
VSIDLC를 실행하려면 다음 단계를 따르세요.
환경을 설정하지 않은 경우
source build/envsetup.sh를 실행합니다.다음 명령어를 실행하여 VSIDLC를 빌드합니다.
m vsidlcVSIDL 카탈로그 디렉터리에 필요한 빌드, protobuf, VSIDL 파일이 있는지 확인합니다.
vsidlc명령어를 실행합니다.vsidlc -c path_to_catalog -o output_directory -p각 항목의 의미는 다음과 같습니다.
-c path_to_catalog는 기본 카탈로그 디렉터리의 경로를 식별합니다.-o output_directory는generated_rs출력 디렉터리가 생성되는 상위 디렉터리를 식별합니다.- (선택사항)
--apex는 조정 및 보안 구성 아티팩트를 생성합니다. - (선택사항)
--services는 jumpstart Rust 애플리케이션 스켈레톤을 생성합니다. - (선택사항)
-p는 새 파일을 생성하기 전에 기존에 생성된 디렉터리 (예:generated_rs, 해당하는 경우apex,configs또는services)를 삭제합니다. - (선택사항)
--genrule은 Rust 코드 대신Android.bpgenrule을 생성합니다. genrule은m을 실행할 때 생성된 아티팩트를 버전 제어에 두지 않도록 필요한 Rust 코드를 즉석에서 생성합니다.
Android.bp및 생성된 미들웨어 파일이 포함된generated_rs디렉터리가 생성됩니다. 이 디렉터리는 정의된 서비스 번들의 정규화된 이름에 해당하는 하위 디렉터리 내에 정리됩니다.
종속 항목 처리
기본적으로 VSIDLC는 종속 항목 카탈로그가 아닌 기본 카탈로그에만 코드를 생성합니다. 카탈로그에서 다른 카탈로그에 정의된 유형 또는 서비스 단위를 사용하는 경우 -d 플래그를 사용하여 각 종속 항목 카탈로그의 경로를 지정합니다.
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
전이 종속 항목 (종속 항목의 종속 항목)을 포함한 전체 종속 항목 그래프의 경로를 제공해야 합니다. 예를 들어 다음과 같은 카탈로그 종속 항목 트리가 있다고 가정합니다.
그림 2. VSIDLC 종속 항목 트리의 예
트리의 각 카탈로그에 대한 미들웨어를 생성하려면 다음 명령어를 실행해야 합니다.
| 타겟 카탈로그 | 종속 항목 | 명령어 |
|---|---|---|
| SDV Core 카탈로그 | 해당 사항 없음 | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| 진단 카탈로그 | SDV Core 카탈로그 | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| SOMEIP 카탈로그 | 진단 카탈로그, SDV Core 카탈로그 | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| OEM 카탈로그 | 진단 카탈로그, SOMEIP 카탈로그, (전이적으로) SDV Core 카탈로그 | vsidlc -o ./generated -c ./path/to/oem_catalog -d ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
Rust 출력 형식 지정
기본적으로 VSIDL은 rustfmt를 사용하여 Rust 출력을 형식 지정합니다. 기본값이 제대로 작동하려면 $ANDROID_BUILD_TOP 환경 변수 또는 RUSTFMT_PATH 및 RUSTFMT_TOML_PATH 환경 변수를 설정합니다. Rust가 출력하는 기본 형식을 변경하려면 --rust-formatter 옵션을 pretty-please 또는 none과 함께 사용합니다.
출력 형식을 crate
prettyplease로 변경하려면pretty-please값을 사용합니다.vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-please출력 형식을 없음으로 변경하려면
none값을 사용합니다.vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
다음 단계
미들웨어를 생성한 후 비즈니스 로직 구현을 참고하세요.