Oprogramowanie pośredniczące Vehicle Services Interface Definition Language (VSIDL) definiuje zestaw bibliotek Rust, które tworzą warstwę abstrakcji na stosie komunikacyjnym pojazdu definiowanego przez oprogramowanie (SDV), aby uprościć korzystanie z ekosystemu SDV. Oprogramowanie pośredniczące zapewnia standardowy sposób komunikacji i interakcji między usługami. Zarówno wygenerowany przez VSIDLC kod, jak i Twój kod niestandardowy korzystają z tych bibliotek.
Kompilator języka definicji interfejsu usług pojazdu (VSIDLC) weryfikuje definicje, generuje pliki kompilacji (Android.bp) zawierające cele genrule, które podczas procesu kompilacji tworzą kod pośredniczący w języku Rust, oraz tworzy konfiguracje wdrażania z plików VSIDL i protobuf w katalogu. Rysunek 1 przedstawia dane wejściowe VSIDLC i dane wyjściowe wygenerowane przez VSIDLC:
Rysunek 1. Wejścia i wyjścia VSIDLC.
Wyjaśnienie diagramu:
Jako dane wejściowe podajesz te pliki uporządkowane w katalogach:
- Pliki proto (z rozszerzeniem
.proto) zawierają struktury danych, które są wymieniane między jednostkami usługi zdefiniowanymi przez VSIDL. - Pliki VSIDL (z rozszerzeniem
.vsidl) definiują pakiety usług, jednostki usług i własność typu jednostki. - Pliki
Android.bpw każdym katalogu definiująrust_protobufcele kompilacji dla wszystkich plików proto w katalogu. VSIDLC używa polacrate_nameokreślonego w tych elementach docelowych, aby odwoływać się do wygenerowanych typów wiadomości protobuf w języku Rust.
- Pliki proto (z rozszerzeniem
Uruchom narzędzie VSIDLC, aby wygenerować te pliki:
W folderze każdego pakietu usług generowane są
Android.bppliki. Jeśli ustawisz--genrule, te cele wygenerują aktualne pliki Rust podczas procesu kompilacji i uwzględnią niezbędne zależności bibliotekirust_protobuf.Dla każdego pakietu usług generowane są pliki
service_bundle.rs, które zawierają główny plikstructi funkcje interakcji z komponentami oprogramowania pośredniczącego.lib.rssą generowane dla każdej usługi RPC należącej do pakietu i umieszczane w podfolderze o nazwie usługi RPC. Pliki te obejmują:Interfacececha implementuje logikę po stronie serwera.Struktura
Clientwywołuje usługę RPC.Pliki
diagnostics.rssą generowane, jeśli w pliku VSIDL występujediagnostics_declaration, co zapewnia niezbędne powiązania dla diagnostyki opartej na UDS.Konfiguracje wdrożenia i bezpieczeństwa są generowane podczas używania flagi
--apex. Są one umieszczane w katalogachapex/iconfigs/i zawierają pliki orkiestracji.textprotooraz zasady bezpieczeństwa (uprawnienia) wymagane do komunikacji między usługami.Gdy używasz flagi
--services, generowany jest szablon usługi. Jest on umieszczony w kataloguservices/i zawiera szkielet aplikacji w języku Rust, w tym plikmain.rs, który ułatwia rozpoczęcie implementacji.
Uruchamianie VSIDLC
Aby uruchomić VSIDLC:
Jeśli nie masz skonfigurowanego środowiska, uruchom polecenie
source build/envsetup.sh.Aby utworzyć VSIDLC, uruchom to polecenie:
m vsidlcUpewnij się, że katalog VSIDL zawiera niezbędne pliki build, protobuf i VSIDL.
Uruchom polecenie
vsidlc:vsidlc -c path_to_catalog -o output_directory -pGdzie:
-c path_to_catalogokreśla ścieżkę do głównego katalogu.-o output_directoryokreśla katalog nadrzędny, w którym tworzony jest katalog wyjściowygenerated_rs.- (opcjonalnie)
--apexgeneruje artefakty konfiguracji administracyjnej i zabezpieczeń. - (opcjonalnie)
--servicesgeneruje szkielet aplikacji Rust typu jumpstart. - (opcjonalnie)
-pusuwa istniejące wygenerowane katalogi (np.generated_rs, a w razie potrzebyapex,configslubservices) przed wygenerowaniem nowych plików. - (opcjonalnie)
--genrulegenerujeAndroid.bpgenrules zamiast kodu w Rust. Polecenie genrules generuje niezbędny kod w języku Rust na bieżąco podczas wykonywania poleceniam, aby uniknąć umieszczania wygenerowanych artefaktów pod kontrolą wersji.
Zostanie utworzony katalog
generated_rszawierający plikAndroid.bpi wygenerowane pliki oprogramowania pośredniczącego. Ten katalog jest podzielony na podkatalogi odpowiadające pełnym i jednoznacznym nazwom zdefiniowanych pakietów usług.
Obsługa zależności
Domyślnie VSIDLC generuje kod tylko dla katalogu głównego, a nie dla katalogów zależności. Jeśli Twój katalog korzysta z typów lub jednostek usług zdefiniowanych w innych katalogach, określ ścieżkę do każdego katalogu zależności za pomocą flagi -d:
vsidlc -c path_to_catalog -o output_directory -d dep1_path -d dep2_path ...
Musisz podać ścieżki dla całego wykresu zależności, w tym zależności pośrednich (zależności od zależności). Załóżmy, że masz taką strukturę zależności katalogu:
Rysunek 2. Przykładowe drzewo zależności VSIDLC.
Aby wygenerować oprogramowanie pośredniczące dla każdego katalogu w drzewie, musisz uruchomić te polecenia:
| Katalog docelowy | Zależności | Polecenie |
|---|---|---|
| Katalog SDV Core | Nie dotyczy | vsidlc -o ./generated -c ./path/to/sdv_core_catalog |
| Katalog diagnostyki | Katalog SDV Core | vsidlc -o ./generated -c ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Katalog SOMEIP | Katalog diagnostyki, katalog SDV Core | vsidlc -o ./generated -c ./path/to/someip_catalog -d ./path/to/diagnostics_catalog -d ./path/to/sdv_core_catalog |
| Katalog OEM | Katalog diagnostyczny, katalog SOMEIP, (przechodnio) katalog 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 |
Formatowanie danych wyjściowych w Rust
Domyślnie VSIDL używa narzędzia rustfmt do formatowania danych wyjściowych w języku Rust. Aby domyślna wartość działała prawidłowo, ustaw zmienną środowiskową $ANDROID_BUILD_TOP lub zmienne środowiskowe RUSTFMT_PATH i RUSTFMT_TOML_PATH. Aby zmienić domyślny format danych wyjściowych Rust, użyj opcji --rust-formatter z wartością pretty-please lub none:
Aby zmienić format wyjściowy na
prettyplease, użyj wartościpretty-please:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-pleaseAby zmienić format wyjściowy na brak, użyj wartości
none:vsidlc -c path_to_catalog -o output_directory -p --rust-formatter none
Co dalej?
Po wygenerowaniu oprogramowania pośredniczącego zapoznaj się z sekcją Implementowanie logiki biznesowej.