Hizmet paketleri oluşturma ve dağıtma

Ara katman yazılımlarını oluşturup özel kodunuzu yazdıktan sonra hizmet paketlerinizi APEX dosyaları olarak dağıtabilirsiniz.

  1. SDV yapılandırma dosyaları oluşturma:

    Rust

    1. Aşağıdaki komutu çalıştırarak SDV yapılandırma dosyaları oluşturun:

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

      vsidlc komutunu --apex işaretiyle çalıştırdığınızda aşağıdakiler de dahil olmak üzere gerekli tüm yapılandırma dosyaları otomatik olarak oluşturulur:

      • APEX manifesti (apex_manifest.json)
      • SDV meta veri manifesti (sdv_service_bundles_manifest.textproto)
      • Bağlayıcı yapılandırması (linker.config.json)
      • SELinux dosya bağlamları (file_contexts)
      • Ortak ve özel anahtarlar (.avbpubkey ve .pem)
      • İzin beyanları ve düzenleme yapılandırmaları
      • Gerekli tüm Soong modüllerini tanımlayan bir Android.bp dosyası.

      Oluşturulan yapılandırmaları şurada bulabilirsiniz:

      /path/to/output/apex/
      

      ve

      /path/to/output/configs/
      

    C++

    1. Aşağıdaki temel yürütme meta veri alanlarını içeren bir SDV meta veri manifest dosyası oluşturun: service_bundle.manifest.textproto

      • Adlandırma kurallarına göre hizmetin adı
      • Hizmet paketi sürümünün tam sayı ve dize gösterimi
      • Daha önce oluşturulan kitaplığın yolu

      Temel hizmet paketi meta verilerini hazırlamak, hizmet paketi paketleme ve dağıtımı için zorunludur.

      # 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. Yeni bir bağlayıcı yapılandırma dosyası oluşturun, linker.config.json:

      { "visible": true }
      
    3. Şu alanları içeren yeni bir apex_manifest.json dosyası oluşturun:

      • Benzersiz SDV paketi adı
      • APEX sürümü
      • SDV Comms kitaplıklarına bağımlılık
      {
        "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. Ortak anahtar (apex_name.apex_key.avbpubkey) ve özel anahtar (apex_name.apex_key.pem) oluşturun.

    5. Yeni bir SELinux dosya bağlamı oluşturun apex_file_contexts.

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

      Daha fazla bilgi için Güvenlik bağlamı ve kategorileri başlıklı makaleyi inceleyin.

    6. Yeni veya mevcut bir Android.bp dosyasında önceden oluşturulmuş hedefler oluşturun:

      // 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. Yeni veya mevcut bir Android.bp dosyasında yeni bir APEX modülü oluşturun. APEX modül adı olarak SDV paket adını kullanın.

      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. Yeni makefile'ı bir SDV görüntüsüne dahil etmek için yeni APEX modülünü product makefile'daki PRODUCT_PACKAGES bölümüne ekleyin. Örneğin, sdv_samples_core_services.mk bölümüne bakın.

  3. Cuttlefish kullanıyorsanız cihazı başlatmak için aşağıdaki komutu çalıştırın:

    sdv-cf create --instance_name=instance1
    
  4. Sistem başlatıldığında hizmet paketini çalıştırın:

    # 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
    

Hizmet paketi bağımlılığı yönetimi

Bazı senaryolarda, APEX boyutunu ve hizmet paketi bellekte kaplanan yerini azaltmak ve hizmet paketlerinin başlatma süresini iyileştirmek için hizmet paketi bağımlılıklarının statik bağlantısını kullanabilirsiniz. Bu senaryolar, aşağıdaki özelliklere sahip APEX'leri içerir:

  • Tek hizmet paketleri
  • Çok fazla ortak bağımlılığı olmayan çeşitli hizmet paketleri

Statik bağlantıyı etkinleştirmek için hizmet paketi kitaplığı tanımına aşağıdaki özellikleri ekleyin:

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

Her durumda, bağımlılıklara statik bağlantı oluşturmanın, hizmet paketlerinin bellekte kapladığı yeri ve başlangıç zamanlarını iyileştirdiğini doğrulamanızı öneririz.

Hata ayıklama (dumpsys)

Yaşam döngüsü yöneticisi, dumpsys arayüzünü uygular. Bu arayüz, kullanıcıya created veya started durumundaki hizmet paketlerinin listesini gösterir. Arayüzde, hizmet paketi sürecinin FQIN'i veya UID'si de gösterilir.

Hizmet paketlerinizin mevcut durumunu ve tanımlayıcılarını görüntülemek için şu komutu çalıştırın:

# Grant root access.
adb root

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

Sonraki adımlar

vsidlc komutunu otomatik olarak yürütmek ve IDE eklentisinin bağımlılıklarla çalışmasını sağlamak için Otomatik katalog güncellemeleri ve LSP entegrasyonu başlıklı makaleyi inceleyin.