بعد إنشاء البرمجيات الوسيطة وكتابة الرمز المخصّص، يمكنك نشر حِزم الخدمات كملفات APEX.
إنشاء ملفات إعداد SDV:
الصدأ (Rust)
أنشِئ ملفات إعداد 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/- ملف بيان 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", }أنشئ وحدة 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, }
لتضمين ملف makefile الجديد في صورة SDV، أضِف وحدة APEX الجديدة إلى
PRODUCT_PACKAGESفي ملف makefile الخاص بالمنتج. على سبيل المثال، يمكنك الاطّلاع على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
تحديثات سريعة لحِزم الخدمات أثناء عملية التطوير
إذا كنت تستخدم "استوديو Android للنظام الأساسي" (ASfP)، يمكنك نشر التغييرات على حزمة خدمات APEX مثبَّتة من قبل مباشرةً من بيئة التطوير المتكاملة (IDE) بدون إعادة إنشاء صورة النظام. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة نشر حِزم خدمات SDV.
إدارة التبعية لحِزم الخدمات
In some scenarios, you can use static linking of the service bundle dependencies to reduce APEX size and service bundle memory footprint, and to improve the startup time of the service bundles. وتشمل هذه السيناريوهات ملفات 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.