يتطلّب Vendor Native Development Kit (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
.