تتطلب مجموعة تطوير أصلية للمورّدين (VNDK) إجراء عدة تغييرات على قاعدة الرموز البرمجية لفصل الاهتمامات بين المورّد والنظام. استخدِم الدليل التالي لتفعيل VNDK في قاعدة رموز برمجية خاصة بمورّد أو مصنّع معدات أصلية.
إنشاء مكتبات النظام
يحتوي نظام التصميم على عدة أنواع من العناصر، بما في ذلك المكتبات (المشترَكة أو الثابتة أو عناوين الملفات) والبرامج الثنائية.
الشكل 1: مكتبات نظام التصميم
- يتم استخدام مكتبات
coreمن خلال صورة النظام، وعلى صورة النظام. لا يمكن استخدام هذه المكتبات من خلال مكتباتvendorأوvendor_availableأوvndkأوvndk-sp.cc_library { name: "libThatIsCore", ... }
- يتم استخدام مكتبات
vendor-only(أوproprietary) من خلال صورة المورّد، وضمن صورة المورّد.cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- يتم استخدام مكتبات
vendor_availableبواسطة صورة المورّد، وضمن صورة المورّد (قد تحتوي على نُسخ مكرّرة منcore).cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
- يتم استخدام مكتبات
vndkبواسطة صورة المورّد، في صورة النظام.cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- تستخدم صورة المورّد مكتبات
vndk-sp، كما تستخدمها صورة النظام بشكل غير مباشر.cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
- يتم استخدام مكتبات
llndkمن خلال كل من صور النظام وصور المورّد.cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
عندما يتم وضع علامة vendor_available:true على مكتبة، يتم إنشاؤها مرتين:
- مرة واحدة للنظام الأساسي (وبالتالي يتم تثبيته على
/system/lib) - مرة واحدة للمورّد (وبالتالي يتم تثبيتها في
/vendor/libأو VNDK APEX)
يتم إنشاء إصدارات المكتبات الخاصة بالمورّدين باستخدام -D__ANDROID_VNDK__.
يتم إيقاف مكوّنات النظام الخاصة التي قد تتغيّر بشكل كبير في الإصدارات المستقبلية من Android باستخدام هذه العلامة. بالإضافة إلى ذلك، تصدّر المكتبات المختلفة مجموعة مختلفة من العناوين (مثل liblog). ويمكن تحديد الخيارات الخاصة بنوع معيّن من المورّدين في ملف Android.bp ضمن:
target: { vendor: { … } }تفعيل مجموعة تطوير أصلية للمورّدين (VNDK) لقاعدة الرموز البرمجية
لتفعيل VNDK لقاعدة رموز برمجية، اتّبِع الخطوات التالية:
- تحديد الأهلية من خلال حساب الأحجام المطلوبة لأقسام
vendor.imgوsystem.img - تفعيل
BOARD_VNDK_VERSION=currentيمكنك إضافةBoardConfig.mkأو إنشاء مكونات باستخدامها مباشرةً (على سبيل المثال،m -j BOARD_VNDK_VERSION=current MY-LIB).
بعد تفعيل BOARD_VNDK_VERSION=current، يفرض نظام التصميم متطلبات الاعتمادية والعناوين التالية.
إدارة التبعيات
يجب حلّ عنصر vendor يعتمد على مكوّن core غير متوفّر في vndk أو كعنصر vendor باستخدام أحد الخيارات التالية:
- يمكن إزالة التبعية.
- إذا كان المكوّن
coreمملوكًا منvendor، يمكن تصنيفه على أنّهvendor_availableأوvendor. - قد يتم نقل التغيير الذي يجعل الكائن الأساسي جزءًا من
vndkإلى Google.
بالإضافة إلى ذلك، إذا كان أحد المكوِّنات core يعتمد على أحد المكوِّنات vendor، يجب تحويل المكوِّن vendor إلى المكوِّن core أو إزالة الاعتمادية بطريقة أخرى (على سبيل المثال، عن طريق إزالة الاعتمادية أو نقلها إلى أحد المكوِّنات vendor).
إدارة العناوين
يجب إزالة التبعيات في العنوان العام لتمكين نظام الإنشاء من معرفة ما إذا كان سيتم إنشاء العناوين مع -D__ANDROID_VNDK__ أو بدونها.
على سبيل المثال، يمكن الوصول إلى عناوين libutils، مثل utils/StrongPointer.h، باستخدام مكتبة العناوين libutils_headers.
لم يعُد من الممكن تضمين بعض العناوين (مثل unistd.h) بشكل متعدٍّ، ولكن يمكن تضمينها بشكل محلي.
أخيرًا، تم نقل الجزء العلني من private/android_filesystem_config.h إلى cutils/android_filesystem_config.h. لإدارة هذه العناوين، نفِّذ أحد الإجراءات التالية:
- أزِل الاعتمادية على
private/android_filesystem_config.hمن خلال استبدال جميع وحدات ماكروAID_*باستدعاءاتgetgrnam/getpwnamإذا أمكن ذلك. على سبيل المثال:- تتغيّر قيمة
(uid_t)AID_WIFIلتصبحgetpwnam("wifi")->pw_uid. - تتغيّر قيمة
(gid_t)AID_SDCARD_Rلتصبحgetgrnam("sdcard_r")->gr_gid.
private/android_filesystem_config.h. - تتغيّر قيمة
- بالنسبة إلى AIS المضمّنة في الرمز، يجب تضمين
cutils/android_filesystem_config.h.