اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release
بدلاً من aosp-main
لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
تفعيل حزمة VNDK
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
تتطلّب حزمة تطوير البرامج الأصلية للمورّد (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
.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Enable VNDK\n\nThe Vendor Native Development Kit (VNDK) requires several changes to a codebase to separate\nconcerns between vendor and system. Use the following guide to enable VNDK in a vendor/OEM\ncodebase.\n\nBuild system libraries\n----------------------\n\nThe build system contains several types of objects including libraries\n(shared, static, or header) and binaries.\n\n**Figure 1.** Build system libraries.\n\n- `core` libraries are used by the system image, on the system image. These libraries can't be used by `vendor`, `vendor_available`, `vndk`, or `vndk-sp` libraries. \n\n ```carbon\n cc_library {\n name: \"libThatIsCore\",\n ...\n }\n ```\n- `vendor-only` (or `proprietary`) libraries are used by the vendor image, on the vendor image. \n\n ```carbon\n cc_library {\n name: \"libThatIsVendorOnly\",\n proprietary: true,\n # or: vendor: true, # (for things in AOSP)\n ...\n }\n ```\n- `vendor_available` libraries are used by the vendor image, on the vendor image (may contain duplicates of `core`). \n\n ```carbon\n cc_library {\n name: \"libThatIsVendorAvailable\",\n vendor_available: true,\n ...\n }\n ```\n- `vndk` libraries are used by the vendor image, on the system image. \n\n ```carbon\n cc_library {\n name: \"libThatIsVndk\",\n vendor_available: true,\n vndk: {\n enabled: true,\n }\n ...\n }\n ```\n- `vndk-sp` libraries are used by the vendor image, and also by the system image indirectly. \n\n ```carbon\n cc_library {\n name: \"libThatIsVndkSp\",\n vendor_available: true,\n vndk: {\n enabled: true,\n support_system_process: true,\n }\n ...\n }\n ```\n- `llndk` libraries are used by both the system and vendor images. \n\n ```carbon\n cc_library {\n name: \"libThatIsLlndk\",\n llndk: {\n symbol_file: \"libthatisllndk.map.txt\"\n }\n ...\n }\n ```\n\nWhen a lib is marked as `vendor_available:true`, it's built\ntwice:\n\n- Once for platform (and thus installed to `/system/lib`)\n- Once for vendor (and thus installed to `/vendor/lib` or VNDK APEX)\n\nThe vendor versions of libs are built with `-D__ANDROID_VNDK__`.\nPrivate system components that may change significantly in future versions of\nAndroid are disabled with this flag. In addition, different libraries export a\ndifferent set of headers (such as `liblog`). Options specific to a\nvendor variant of a target can be specified in an `Android.bp` file\nin: \n\n```text\ntarget: { vendor: { … } }\n```\n\nEnable VNDK for a codebase\n--------------------------\n\nTo enable the VNDK for a codebase:\n\n1. Determine eligibility by calculating the required sizes of `vendor.img` and `system.img` partitions.\n2. Enable `BOARD_VNDK_VERSION=current`. You can add to `BoardConfig.mk` or build components with it directly (for example, `m -j BOARD_VNDK_VERSION=current `\u003cvar translate=\"no\"\u003eMY-LIB\u003c/var\u003e).\n\nAfter enabling `BOARD_VNDK_VERSION=current`, the build system\nenforces the following dependency and header requirements.\n\n### Manage dependencies\n\nA `vendor` object that depends on a `core` component\nthat doesn't exist in `vndk` or as a `vendor` object\nmust be resolved using one of the following options:\n\n- The dependency can be removed.\n- If the `core` component is owned by `vendor`, it can be marked as `vendor_available` or `vendor`.\n- A change making the core object part of the `vndk` may be upstreamed to Google.\n\nIn addition, if a `core` component has dependencies on a\n`vendor` component, the `vendor` component must be made\ninto a `core` component **or** the dependency must be\nremoved in another way (for example, by removing the dependency or by moving the\ndependency into a `vendor` component).\n\n### Manage headers\n\nGlobal header dependencies must be removed to enable the build system to know\nwhether to build the headers with or without `-D__ANDROID_VNDK__`.\nFor example, libutils headers such as `utils/StrongPointer.h` can\nstill be accessed using the header library\n[`libutils_headers`](https://android.googlesource.com/platform/system/core/+/android16-release/libutils/include/utils).\n\nSome headers (such as `unistd.h`) can no longer be included transitively\nbut can be included locally.\n\nFinally, the public part of `private/android_filesystem_config.h`\nhas been moved to `cutils/android_filesystem_config.h`. To manage\nthese headers, do one of the following:\n\n- Remove the dependency to `private/android_filesystem_config.h` by replacing all `AID_*` macros with [getgrnam](http://man7.org/linux/man-pages/man3/getgrnam.3.html)/ [getpwnam](http://man7.org/linux/man-pages/man3/getpwnam.3.html) calls if possible. For example:\n - `(uid_t)AID_WIFI` becomes `getpwnam(\"wifi\")-\u003epw_uid`.\n - `(gid_t)AID_SDCARD_R` becomes `getgrnam(\"sdcard_r\")-\u003egr_gid`.\n\n For details, refer to [private/android_filesystem_config.h](https://android.googlesource.com/platform/system/core/+/android16-release/libcutils/include/private/android_filesystem_config.h).\n- For hard-coded AIS, include `cutils/android_filesystem_config.h`."]]