إنشاء حِزم الخدمات ونشرها

بعد إنشاء البرامج الوسيطة وكتابة الرمز المخصّص، يمكنك نشر حِزم الخدمات كملفات APEX.

  1. إنشاء ملفات إعداد SDV:

    الصدأ (Rust)

    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 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. أنشئ مفتاحًا عامًا، 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. أنشئ وحدة APEX جديدة في ملف Android.bp جديد أو حالي. استخدِم اسم حزمة 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. لتضمين ملف makefile الجديد في صورة SDV، أضِف وحدة APEX الجديدة إلى الـ PRODUCT_PACKAGES في ملف makefile للمنتج. على سبيل المثال، اطّلِع على 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).