Membangun dan men-deploy paket layanan

Setelah membuat middleware dan menulis kode kustom, Anda dapat men-deploy paket layanan sebagai file APEX.

  1. Buat file konfigurasi SDV:

    Karat

    1. Buat file konfigurasi SDV dengan menjalankan:

      vsidlc -c /path/to/catalog -o /path/to/output --apex
      

      Menjalankan vsidlc dengan tanda --apex akan otomatis membuat semua file konfigurasi yang diperlukan, termasuk:

      • Manifes APEX (apex_manifest.json)
      • Manifes metadata SDV (sdv_service_bundles_manifest.textproto)
      • Konfigurasi linker (linker.config.json)
      • Konteks file SELinux (file_contexts)
      • Kunci publik dan pribadi (.avbpubkey dan .pem)
      • Pernyataan izin dan konfigurasi orkestrasi
      • File Android.bp yang menentukan semua modul Soong yang diperlukan.

      Anda dapat menemukan konfigurasi yang dihasilkan di bagian:

      /path/to/output/apex/
      

      dan,

      /path/to/output/configs/
      

    C++

    1. Buat file manifes metadata SDV, service_bundle.manifest.textproto dengan kolom metadata eksekusi penting berikut:

      • Nama layanan sesuai dengan konvensi penamaan
      • Representasi bilangan bulat dan string dari versi paket layanan
      • Jalur ke pustaka yang dibuat sebelumnya

      Menyiapkan metadata paket layanan penting wajib dilakukan untuk pengemasan dan deployment paket layanan.

      # 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"
      }
      
    2. Buat file konfigurasi linker baru, linker.config.json:

      { "visible": true }
      
    3. Buat file apex_manifest.json baru dengan kolom berikut:

      • Nama paket SDV unik
      • Versi APEX
      • Dependensi pada library 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"
        ]
      }
      
    4. Buat kunci publik, apex_name.apex_key.avbpubkey dan kunci pribadi, apex_name.apex_key.pem.

    5. Buat konteks file SELinux baru apex_file_contexts.

      (/.*)?    u:object_r:system_file:s0
      

      Untuk mempelajari lebih lanjut, lihat Konteks dan kategori keamanan.

    6. Buat target bawaan dalam file Android.bp baru atau yang sudah ada:

      // 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",
      }
      
    7. Buat modul APEX baru dalam file Android.bp baru atau yang sudah ada. Gunakan nama paket SDV sebagai nama modul APEX.

      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,
      }
      
  2. Untuk menyertakan makefile baru dalam image SDV, tambahkan modul APEX baru ke PRODUCT_PACKAGES di makefile produk. Misalnya, lihat sdv_samples_core_services.mk.

  3. Jika Anda menggunakan Cuttlefish, jalankan perintah berikut untuk memulai perangkat:

    sdv-cf create --instance_name=instance1
    
  4. Jalankan paket layanan saat sistem di-boot:

    # 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
    

Pengelolaan dependensi paket layanan

Dalam beberapa skenario, Anda dapat menggunakan penautan statis dependensi paket layanan untuk mengurangi ukuran APEX dan footprint memori paket layanan, serta untuk meningkatkan waktu mulai paket layanan. Skenario ini mencakup APEX dengan:

  • Paket layanan tunggal
  • Beberapa paket layanan yang tidak memiliki banyak dependensi umum yang sama

Untuk mengaktifkan penautan statis, tambahkan properti berikut ke definisi library paket layanan:

// 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"],
}

Untuk setiap situasi, sebaiknya Anda mengonfirmasi bahwa penautan statis ke dependensi menghasilkan peningkatan jejak memori dan waktu mulai paket layanan.

Debug (dumpsys)

Pengelola siklus proses mengimplementasikan antarmuka dumpsys. Antarmuka ini menampilkan daftar paket layanan kepada pengguna yang berada dalam status created atau started. Antarmuka juga menampilkan FQIN atau UID proses paket layanan.

Untuk melihat status dan ID paket layanan Anda saat ini, jalankan:

# Grant root access.
adb root

# Execute dumpsys to see service bundles state
adb shell dumpsys google.sdv.lifecycle.ILifecycleManager/default

Langkah berikutnya

Untuk menjalankan vsidlc secara otomatis dan mengaktifkan plugin IDE agar dapat bekerja dengan dependensi, lihat Pembaruan katalog otomatis dan integrasi LSP.