ساختن و پیاده‌سازی بسته‌های سرویس

پس‌از ایجاد میان‌افزار و نوشتن کد سفارشی، می‌توانید دسته‌های سرویس خود را به‌عنوان فایل‌های APEX پیاده‌سازی کنید.

  1. ایجاد فایل‌های پیکربندی SDV:

    زنگار

    1. با اجرای دستور زیر، فایل‌های پیکربندی SDV را تولید کنید:

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

      اجرای vsidlc با پرچم --apex به‌طور خودکار همه فایل‌های پیکربندی لازم را تولید می‌کند، ازجمله:

      • مانیفست APEX (apex_manifest.json)
      • مانیفست فراداده SDV‏ (sdv_service_bundles_manifest.textproto)
      • پیکربندی پیونددهنده (linker.config.json)
      • زمینه‌های فایل SELinux (file_contexts)
      • کلیدهای عمومی و خصوصی (.avbpubkey و .pem)
      • بیانیه اجازه‌ها و پیکربندی‌های هماهنگ‌سازی
      • فایل Android.bp که همه واحدهای Soong لازم را تعریف می‌کند.

      می‌توانید پیکربندی‌های تولیدشده را در اینجا پیدا کنید:

      /path/to/output/apex/
      

      و،

      /path/to/output/configs/
      

    C++‎

    1. فایل مانیفست فراداده 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"
      }
      
    2. فایل پیکربندی پیونددهنده جدیدی ایجاد کنید، linker.config.json:

      { "visible": true }
      
    3. فایل apex_manifest.json جدیدی با این فیلدها بسازید:

      • نام بسته SDV منحصربه‌فرد
      • نسخه APEX
      • وابستگی به کتابخانه‌های ارتباطات SDV
      {
        "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. کلید عمومی، apex_name.apex_key.avbpubkey و کلید خصوصی، apex_name.apex_key.pem ایجاد کنید.

    5. زمینه فایل SELinux جدیدی apex_file_contexts ایجاد کنید.

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

      برای اطلاعات بیشتر، زمینه‌های امنیتی و دسته‌ها را ببینید.

    6. هدف‌های پیش‌ساخته را در فایل 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",
      }
      
    7. در فایل Android.bp جدید یا موجود، واحد APEX جدیدی ایجاد کنید. از نام بسته SDV به‌عنوان نام واحد 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. برای گنجاندن فایل ساخت جدید در تصویر SDV، واحد APEX جدید را به PRODUCT_PACKAGES در فایل ساخت محصول اضافه کنید. برای مثال، sdv_samples_core_services.mk را ببینید.

  3. اگر از Cuttlefish استفاده می‌کنید، برای شروع دستگاه، فرمان زیر را اجرا کنید:

    sdv-cf create --instance_name=instance1
    
  4. اجرای بسته سرویس هنگام راه‌اندازی سیستم:

    # 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 را ببینید.