ミドルウェアを作成してカスタムコードを記述したら、サービス バンドルを APEX ファイルとしてデプロイできます。
SDV 構成ファイルを作成します。
Rust
次のコマンドを実行して SDV 構成ファイルを生成します。
vsidlc -c /path/to/catalog -o /path/to/output --apex--apexフラグを指定してvsidlcを実行すると、必要な構成ファイルがすべて自動的に生成されます。生成されるファイルは次のとおりです。- APEX マニフェスト(
apex_manifest.json) - SDV メタデータ マニフェスト(
sdv_service_bundles_manifest.textproto) - リンカー構成(
linker.config.json) - SELinux ファイル コンテキスト(
file_contexts) - 公開鍵と秘密鍵(
.avbpubkeyと.pem) - 権限の申告とオーケストレーション構成
- 必要な Soong モジュールをすべて定義する
Android.bpファイル。
生成された構成は次の場所にあります。
/path/to/output/apex/
/path/to/output/configs/- APEX マニフェスト(
C++
次の必須の実行メタデータ フィールドを使用して、SDV メタデータ マニフェスト ファイル
service_bundle.manifest.textprotoを作成します。- 命名規則に準拠したサービスの名前
- サービス バンドル バージョンの整数表現と文字列表現
- 以前に作成したライブラリのパス
サービス バンドルのパッケージ化とデプロイには、必須のサービス バンドル メタデータの準備が不可欠です。
# proto-file: //system/software_defined_vehicle/core_services/service_bundles_registry/proto/sdv_service_bundles_manifest.proto # proto-message: SdvServiceBundleManifestEntry # SDV service bundle metadata definition with mandatory fields. sdv_service_bundle_metadata { # Service bundle name. name: "ServiceBundleName" # Service bundle integer version. version_number: 42 # Service bundle version as a string. version_name: "42.alpha" # Service bundle library path. native_library_path: "lib64/libservice_bundle.so" }新しい リンカー構成 ファイル
linker.config.jsonを作成します。{ "visible": true }次のフィールドを使用して、新しい
apex_manifest.jsonファイルを作成します。- 一意の SDV パッケージ名
- APEX のバージョン
- SDV Comms ライブラリへの依存関係
{ "name": "com.sdv.oem.apex_and_module_name", "version": 1, "requireNativeLibs": [ "libsdv_comms_ctx_ffi.so", "libsdv_comms_dt_ffi.so", "libsdv_comms_id_ffi.so", "libsdv_comms_sd_ffi.so" ] }公開鍵
apex_name.apex_key.avbpubkeyと秘密鍵apex_name.apex_key.pemを作成します。新しい SELinux ファイル コンテキスト
apex_file_contextsを作成します。(/.*)? u:object_r:system_file:s0詳細については、セキュリティ コンテキストとカテゴリをご覧ください。
新規または既存の
Android.bpファイルに、ビルド済みのターゲットを作成します。// SDV manifest file prebuilt. prebuilt_etc { name: "com.sdv.oem.apex_and_module_name.service_bundles_manifest", // The source filename of the manifest file. src: "service_bundle.manifest.textproto", // The name of the installed file needs be `sdv_service_bundles_manifest.textproto`. filename: "sdv_service_bundles_manifest.textproto", // Disable direct installation of the prebuilt to one of the partitions. // The manifest is used only inside of an apex. installable: false, } // The linker config to allow libraries for the apex to be linkable. linker_config { name: "com.sdv.oem.apex_and_module_name. linker_config", src: "linker.config.json", // Disable direct installation of the prebuilt to one of the partitions. // The linker configuration is used only inside of an apex. installable: false, } // Key to be used for signing the apex. apex_key { name: "apex_name.apex_key", public_key: "apex_name.apex_key.avbpubkey", private_key: "apex_name.apex_key.pem", }新規または既存の
Android.bpファイルに、新しい APEX モジュールを作成します。APEX モジュール名として SDV パッケージ名を使用します。apex { name: "com.sdv.oem.apex_and_module_name", // The service bundle(s) to be included in the apex. native_shared_libs: [ "libservice_bundle", ], prebuilts: [ // SDV service bundles manifest file. "com.sdv.oem.apex_and_module_name.service_bundles_manifest", // Linker configuration to enable loading library from apex. "com.sdv.oem.apex_and_module_name.linker_config", ], // Json manifest file describes metadata of the APEX package. // The 'name' field from the JSON is used as a mounting point. manifest: "apex_manifest.json", // Setting the security contexts to files in this APEX bundle. file_contexts: "apex_file_contexts", // Name of the apex_key module that provides the private key to sign the APEX bundle. key: "apex_name.apex_key", // Mark apex as non-updatable for now, this might be revisited going forward. updatable: false, // Service bundle package is installed into /product partition. product_specific: true, }
新しい makefile を SDV イメージに含めるには、
PRODUCT_PACKAGESを プロダクト makefile に新しい APEX モジュールを追加します。たとえば、sdv_samples_core_services.mkをご覧ください。Cuttlefish を使用している場合は、次のコマンドを実行してデバイスを起動します。
sdv-cf create --instance_name=instance1システムの起動時にサービス バンドルを実行します。
# Grant root access. adb root # Launch the new service bundle. adb shell sdv_service_bundle start \ local-vm:com.sdv.oem.apex_and_module_name.ServiceBundleName/instance-1
サービス バンドルの依存関係の管理
シナリオによっては、サービス バンドルの依存関係の静的リンクを使用して、APEX のサイズとサービス バンドルのメモリ使用量を削減し、サービス バンドルの起動時間を短縮できます。このようなシナリオには、次のような APEX が含まれます。
- 単一のサービス バンドル
- 共通の依存関係をあまり共有しない複数のサービス バンドル
静的リンクを有効にするには、サービス バンドル ライブラリの定義に次のプロパティを追加します。
// Service bundle library.
rust_ffi_shared {
// See rust_ffi_shared basic template.
...
// uses static linking for the dependencies
prefer_rlib: true,
// needed to correctly resolve commstack deps
ld_flags: ["-Wl,--no-as-needed"],
}
状況に応じて、依存関係への静的リンクによってサービス バンドルのメモリ使用量と起動時間が改善されることを確認することをおすすめします。
デバッグ(dumpsys)
ライフサイクル マネージャーは dumpsys インターフェースを実装します。このインターフェースには、created 状態または started 状態のサービス バンドルのリストが表示されます。また、サービス バンドル プロセスの FQIN または UID も表示されます。
サービス バンドルの現在の状態と識別子を表示するには、次のコマンドを実行します。
# Grant root access.
adb root
# Execute dumpsys to see service bundles state
adb shell dumpsys google.sdv.lifecycle.ILifecycleManager/default
次のステップ
vsidlc を自動的に実行し、IDE プラグインが
依存関係を処理できるようにするには、カタログの自動更新と LSP の統合をご覧ください。