Generowanie oprogramowania pośredniczącego

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:

Wejścia i wyjścia VSIDLC

Rysunek 1. Wejścia i wyjścia VSIDLC.

Wyjaśnienie diagramu:

  1. 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.bp w każdym katalogu definiują rust_protobuf cele kompilacji dla wszystkich plików proto w katalogu. VSIDLC używa pola crate_name określonego w tych elementach docelowych, aby odwoływać się do wygenerowanych typów wiadomości protobuf w języku Rust.
  2. Uruchom narzędzie VSIDLC, aby wygenerować te pliki:

    • W folderze każdego pakietu usług generowane są Android.bp pliki. Jeśli ustawisz --genrule, te cele wygenerują aktualne pliki Rust podczas procesu kompilacji i uwzględnią niezbędne zależności biblioteki rust_protobuf.

    • Dla każdego pakietu usług generowane są pliki service_bundle.rs, które zawierają główny plik struct i funkcje interakcji z komponentami oprogramowania pośredniczącego.

    • lib.rs są generowane dla każdej usługi RPC należącej do pakietu i umieszczane w podfolderze o nazwie usługi RPC. Pliki te obejmują:

    • Interface cecha implementuje logikę po stronie serwera.

    • Struktura Client wywołuje usługę RPC.

    • Pliki diagnostics.rs są generowane, jeśli w pliku VSIDL występuje diagnostics_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 katalogach apex/configs/ i zawierają pliki orkiestracji .textproto oraz 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 katalogu services/ i zawiera szkielet aplikacji w języku Rust, w tym plik main.rs, który ułatwia rozpoczęcie implementacji.

Uruchamianie VSIDLC

Aby uruchomić VSIDLC:

  1. Jeśli nie masz skonfigurowanego środowiska, uruchom polecenie source build/envsetup.sh.

  2. Aby utworzyć VSIDLC, uruchom to polecenie:

    m vsidlc
    
  3. Upewnij się, że katalog VSIDL zawiera niezbędne pliki build, protobuf i VSIDL.

  4. Uruchom polecenie vsidlc:

    vsidlc -c path_to_catalog -o output_directory -p
    

    Gdzie:

    • -c path_to_catalog określa ścieżkę do głównego katalogu.
    • -o output_directory określa katalog nadrzędny, w którym tworzony jest katalog wyjściowy generated_rs.
    • (opcjonalnie) --apex generuje artefakty konfiguracji administracyjnej i zabezpieczeń.
    • (opcjonalnie) --services generuje szkielet aplikacji Rust typu jumpstart.
    • (opcjonalnie) -p usuwa istniejące wygenerowane katalogi (np. generated_rs, a w razie potrzeby apex, configs lub services) przed wygenerowaniem nowych plików.
    • (opcjonalnie) --genrule generuje Android.bp genrules zamiast kodu w Rust. Polecenie genrules generuje niezbędny kod w języku Rust na bieżąco podczas wykonywania polecenia m, aby uniknąć umieszczania wygenerowanych artefaktów pod kontrolą wersji.

    Zostanie utworzony katalog generated_rs zawierający plik Android.bp i 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:

Przykładowe drzewo zależności VSIDLC

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_PATHRUSTFMT_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ści pretty-please:

    vsidlc -c path_to_catalog -o output_directory -p --rust-formatter pretty-please
    
  • Aby 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.