في الإصدار Android 8.1 والإصدارات الأحدث، تم دمج نظام التصميم مع VNDK. فعندما يتم تفعيل دعم VNDK، ويتحقق نظام الإصدار من التبعيات بين وتنشئ متغيرًا خاصًا بالبائع لوحدات البائعين، بتثبيت هذه الوحدات تلقائيًا في الأدلة المخصصة.
مثال على دعم إصدار VNDK
في هذا المثال، يحدّد تعريف الوحدة Android.bp
مكتبة باسم libexample
. vendor_available
تشير إلى أن وحدات إطار العمل ووحدات الموردين قد تعتمد على
libexample
:
تم تفعيل دعم الشكل 1..
كل من إطار العمل القابل للتنفيذ /system/bin/foo
والمورِّد
يعتمد /vendor/bin/bar
القابل للتنفيذ على libexample
تحتوي على libexample
في المواقع الإلكترونية على shared_libs
.
في حال استخدام libexample
من قِبل كل من وحدات إطار العمل والمورِّد
وحدتان، تم إنشاء صيغتين من libexample
. الصيغة الأساسية
(التي تحمل اسم libexample
) تستخدمها وحدات إطار العمل
يستخدم المورّد صيغة المورّد (التي تحمل اسم libexample.vendor
)
الوحدات. تم تثبيت المتغيرَين في أدلة مختلفة:
- تم تثبيت الصيغة الأساسية في
/system/lib[64]/libexample.so
- تم تثبيت صيغة المورّد في VNDK APEX للأسباب التالية:
تم
true
ميزةvndk.enabled
.
لمزيد من التفاصيل، يُرجى الاطّلاع على تعريف الوحدة.
إعداد دعم الإصدار
لتفعيل الدعم الكامل لنظام الإصدار لجهاز ما، يمكنك إضافة
BOARD_VNDK_VERSION
إلى BoardConfig.mk
:
BOARD_VNDK_VERSION := current
لهذا الإعداد تأثير عام: عند تحديده في
BoardConfig.mk
، تم التحقّق من جميع الوحدات. نظرًا لعدم وجود آلية
لإدراج الوحدة المسيئة في القائمة السوداء أو القائمة البيضاء، يجب تنظيف جميع
والتبعيات غير الضرورية قبل إضافة BOARD_VNDK_VERSION
. إِنْتَ
اختبار وحدة وتجميعها عن طريق ضبط BOARD_VNDK_VERSION
في
متغيرات بيئتك وهي:
$ BOARD_VNDK_VERSION=current m module_name.vendor
عند تفعيل BOARD_VNDK_VERSION
، يتم ضبط العديد من الإعدادات التلقائية العامة.
تتم إزالة مسارات البحث في العناوين. ومن بينها:
frameworks/av/include
frameworks/native/include
frameworks/native/opengl/include
hardware/libhardware/include
hardware/libhardware_legacy/include
hardware/ril/include
libnativehelper/include
libnativehelper/include_deprecated
system/core/include
system/media/audio/include
إذا كانت وحدة تعتمد على الرؤوس من هذه الأدلة، فيجب تحديد
(بشكل صريح) التبعيات مع header_libs
،
static_libs
و/أو shared_libs
حزمة VNDK APEX
في الإصدار 10 من نظام التشغيل Android والإصدارات الأقدم، تم تثبيت الوحدات التي تتضمّن vndk.enabled
في
/system/lib[64]/vndk[-sp]-${VER}
في نظام التشغيل Android 11 والإصدارات الأحدث،
يتم حزم مكتبات VNDK بتنسيق APEX، ويحمل اسم VNDK APEX
com.android.vndk.v${VER}
استنادًا إلى إعدادات الجهاز
تكون VNDK APEX مسطحة أو غير مسطحة وهي متاحة من المسار الأساسي
/apex/com.android.vndk.v${VER}
الشكل 2. حزمة VNDK APEX
تعريف الوحدة
لإنشاء Android باستخدام BOARD_VNDK_VERSION
، يجب مراجعة
يتم تعريف الوحدة إما في Android.mk
أو
Android.bp
يصف هذا القسم الأنواع المختلفة من الوحدات
والتعريفات والعديد من خصائص الوحدة ذات الصلة بـ VNDK وعمليات التحقق من التبعية
تنفيذها في نظام الإصدار.
وحدات المورّدين
وحدات المورّدين هي ملفات تنفيذية خاصة بالموردين أو مكتبات مشتركة
في قسم المورِّد. في Android.bp
ملف،
يجب أن تضبط وحدات المورّدين هذه القيمة على true
.
في Android.mk
ملف، يجب ضبط وحدات المورّدين.
LOCAL_VENDOR_MODULE
أو LOCAL_PROPRIETARY_MODULE
إلى
true
إذا تم تحديد BOARD_VNDK_VERSION
، لن يسمح نظام التصميم بذلك.
المهام والتبعيات بين وحدات الموردين ووحدات إطار العمل، وينتج عنها أخطاء في الحالات التالية:
- أي وحدة بدون
vendor:true
تعتمد على وحدة ذاتvendor:true
، أو - تعتمد أي وحدة مع
vendor:true
على وحدة غير تابعة لـllndk_library
لا تحتوي علىvendor:true
أوvendor_available:true
.
ينطبق التحقق من التبعية على header_libs
،
static_libs
وshared_libs
بوصة
Android.bp
، وإلى LOCAL_HEADER_LIBRARIES
،
LOCAL_STATIC_LIBRARIES
وLOCAL_SHARED_LIBRARIES
في
Android.mk
LL-NDK
المكتبات المشتركة LL-NDK هي مكتبات مشتركة تحتوي على واجهات ABI ثابتة. كلا إطارَي العمل
والموردين تشترك في نفس طريقة التنفيذ وأحدثها. لكل منها
LL-NDK، يحتوي cc_library
على
السمة llndk
التي تحتوي على ملف رموز:
cc_library { name: "libvndksupport", llndk: { symbol_file: "libvndksupport.map.txt", }, }
يصف ملف الرموز الرموز المرئية لوحدات الموردين. مثلاً:
LIBVNDKSUPPORT { global: android_load_sphal_library; # llndk android_unload_sphal_library; # llndk local: *; };
واستنادًا إلى ملف الرموز، ينشئ نظام الإصدار مكتبة مشتركة بديلة
وحدات الموردين، التي ترتبط بهذه المكتبات عند
تم تفعيل ميزة BOARD_VNDK_VERSION
. يتم تضمين رمز في التنصيص
المكتبة المشتركة فقط في حالة:
- لم يتم تحديده في نهاية القسم بـ
_PRIVATE
أو_PLATFORM
, - لا تتضمّن علامة
#platform-only
- لا تحتوي على علامات
#introduce*
أو لا تتطابق العلامة مع الهدف.
الدونغ الفيتنامي (VNDK)
في Android.bp
ملف، cc_library
،
cc_library_static
وcc_library_shared
و
تدعم تعريفات الوحدات cc_library_headers
ثلاثة واجهات برمجة تطبيقات مرتبطة بـ VNDK.
المواقع: vendor_available
، وvndk.enabled
،
vndk.support_system_process
إذا كانت قيمة vendor_available
أو vndk.enabled
هي
true
، قد يكون هناك صيغتان (أساسية ومورّد)
بُنيت. يجب التعامل مع الصيغة الأساسية كوحدة إطار عمل ويجب أن يتعامل المورّد مع
يجب التعامل مع المتغير على أنه وحدة للمورد. إذا كانت بعض وحدات إطار العمل تعتمد
في هذه الوحدة، يتم إنشاء الصيغة الأساسية. إذا كانت بعض وحدات البائعين
على هذه الوحدة، يتم إنشاء متغير البائع. يفرض نظام التصميم
عمليات التحقق من التبعية التالية:
- تكون الصيغة الأساسية دائمًا مستندة إلى إطار عمل فقط ولا يمكن للمورِّد الوصول إليها. الوحدات.
- يتعذّر دائمًا الوصول إلى صيغة المورّد من وحدات إطار العمل.
- جميع تبعيات خيار البائع، والتي يتم تحديدها في
header_libs
و/أوstatic_libs
و/أوshared_libs
، يجب أن يكون إماllndk_library
أو معvendor_available
أوvndk.enabled
. - إذا كانت قيمة السمة
vendor_available
هيtrue
، يكون خيار المورّد متاحة لجميع وحدات الموردين. - إذا كانت قيمة السمة
vendor_available
هيfalse
، يكون خيار المورّد لا يمكن الوصول إليها إلا من خلال وحدات VNDK أو VNDK-SP الأخرى (أي الوحدات التي تحتوي على يتعذّر على "vendor:true
" ربط "vendor_available:false
" الوحدات).
مسار التثبيت التلقائي لـ cc_library
أو
يتم تحديد cc_library_shared
من خلال القواعد التالية:
- تم تثبيت الصيغة الأساسية على
/system/lib[64]
. - قد يختلف مسار تثبيت صيغة المورّد:
- إذا كانت قيمة السمة
vndk.enabled
هيfalse
، يكون خيار المورّد مثبَّتة في/vendor/lib[64]
. - إذا كانت قيمة السمة
vndk.enabled
هيtrue
، يكون خيار المورّد في VNDK APEX(com.android.vndk.v${VER}
).
- إذا كانت قيمة السمة
يلخّص الجدول أدناه كيفية تعامل نظام الإصدار مع خيارات المورّدين:
المورّد_متاح | تم تفعيل vndk |
vndk support_same_process |
أوصاف خيارات المورّدين |
---|---|---|---|
true |
false |
false |
تكون خيارات المورِّد VND-ONLY. المكتبات المشتركة هي
تم التثبيت في /vendor/lib[64] . |
true |
غير صالح (خطأ في الإصدار) | ||
true |
false |
خيارات المورِّد هي VNDK. تم تثبيت المكتبات المشتركة. إلى شركة VNDK APEX. | |
true |
خيارات المورِّد هي VNDK-SP. المكتبات المشتركة هي على VNDK APEX. | ||
|
|
|
ما مِن صيغ للمورّدين. هذه الوحدة مخصّصة للاستخدام فقط مع الأجهزة الجوّالة. |
true |
غير صالح (خطأ في الإصدار) | ||
true |
false |
تكون صيغ المورّد هي VNDK-private. المكتبات المشتركة هي على VNDK APEX. يجب ألا تكون هذه تستخدمه بشكل مباشر من قبل وحدات المورد. | |
true |
تكون خيارات المورِّد هي VNDK-SP-private. المكتبات المشتركة هي على VNDK APEX. يجب ألا تكون هذه تستخدمه بشكل مباشر من قبل وحدات المورد. |
إضافات VNDK
إضافات VNDK هي مكتبات مشتركة لـ VNDK مزودة بواجهات برمجة تطبيقات إضافية. الإضافات هي
تم التثبيت على /vendor/lib[64]/vndk[-sp]
(بدون لاحقة الإصدار)
وإلغاء مكتبات VNDK المشتركة الأصلية في وقت التشغيل.
تعريف إضافات VNDK
على الإصدار 9 من نظام Android والإصدارات الأحدث، يتوافق Android.bp
في الأصل مع VNDK.
الإضافات. لإنشاء امتداد VNDK، حدد وحدة أخرى
السمة vendor:true
والسمة extends
:
cc_library { name: "libvndk", vendor_available: true, vndk: { enabled: true, }, } cc_library { name: "libvndk_ext", vendor: true, vndk: { enabled: true, extends: "libvndk", }, }
وحدة مع vendor:true
وvndk.enabled:true
و
تحدد خصائص extends
إضافة VNDK:
- يجب أن تحدّد السمة
extends
مكتبة مشتركة أساسية من VNDK. اسم (أو اسم المكتبة المشتركة VNDK-SP). - تتم تسمية امتدادات VNDK (أو امتدادات VNDK-SP) باسم الوحدة الأساسية.
الأسماء التي تمتد منها. على سبيل المثال، الناتج الثنائي
libvndk_ext
هوlibvndk.so
بدلاً منlibvndk_ext.so
- تم تثبيت إضافات VNDK في
/vendor/lib[64]/vndk
. - يتم تثبيت إضافات VNDK-SP في
/vendor/lib[64]/vndk-sp
- يجب أن تحتوي المكتبات المشتركة الأساسية على كل من
vndk.enabled:true
. وvendor_available:true
.
يجب أن تكون إضافة VNDK-SP من مكتبة مشتركة في VNDK-SP.
(يجب أن يكون vndk.support_system_process
متساويًا):
cc_library { name: "libvndk_sp", vendor_available: true, vndk: { enabled: true, support_system_process: true, }, } cc_library { name: "libvndk_sp_ext", vendor: true, vndk: { enabled: true, extends: "libvndk_sp", support_system_process: true, }, }
قد تعتمد إضافات VNDK (أو إضافات VNDK-SP) على إضافات VNDK المشتركة المكتبات:
cc_library { name: "libvndk", vendor_available: true, vndk: { enabled: true, }, } cc_library { name: "libvndk_ext", vendor: true, vndk: { enabled: true, extends: "libvndk", }, shared_libs: [ "libvendor", ], } cc_library { name: "libvendor", vendor: true, }
استخدام إضافات VNDK
إذا كانت وحدة المورد تعتمد على واجهات برمجة تطبيقات إضافية تم تحديدها بواسطة إضافات VNDK، فإن
اسم امتداد VNDK في
الخاصية "shared_libs
":
// A vendor shared library example cc_library { name: "libvendor", vendor: true, shared_libs: [ "libvndk_ext", ], } // A vendor executable example cc_binary { name: "vendor-example", vendor: true, shared_libs: [ "libvndk_ext", ], }
إذا كانت وحدة البائع تعتمد على امتدادات VNDK، فسيتم إنشاء امتدادات VNDK هذه
تم تثبيته على /vendor/lib[64]/vndk[-sp]
تلقائيًا. إذا كانت وحدة
لم تعد تعتمد على إضافة VNDK، أضف خطوة سليمة إلى
CleanSpec.mk
لإزالة المكتبة المشتركة. مثلاً:
$(call add-clean-step, rm -rf $(TARGET_OUT_VENDOR)/lib/libvndk.so)
التجميع الشرطي
يصف هذا القسم كيفية التعامل مع الاختلافات الدقيقة (على سبيل المثال: إضافة أو إزالة ميزة من أحد المتغيرات) بين ما يلي: ثلاث مكتبات مشتركة في VNDK:
- الصيغة الأساسية (مثل
/system/lib[64]/libexample.so
) - صيغة المورّد (على سبيل المثال،
/apex/com.android.vndk.v${VER}/lib[64]/libexample.so
) - إضافة VNDK (مثل
/vendor/lib[64]/vndk[-sp]/libexample.so
)
علامات التجميع الشرطي
يحدّد نظام إصدار Android __ANDROID_VNDK__
للمورّد
والمتغيرات وVNDK بشكل افتراضي. يمكنك حماية الرمز
باستخدام واقيات المعالج الأولي C:
void all() { } #if !defined(__ANDROID_VNDK__) void framework_only() { } #endif #if defined(__ANDROID_VNDK__) void vndk_only() { } #endif
بالإضافة إلى __ANDROID_VNDK__
، يمكن استخدام cflags
أو
قد يتم تحديد cppflags
في Android.bp
. تشير رسالة الأشكال البيانية
تم تحديد cflags
أو cppflags
في
تكون السمة target.vendor
مخصّصة لخيار المورّد.
على سبيل المثال، تحدِّد Android.bp
التالية ما يلي:
libexample
وlibexample_ext
:
cc_library { name: "libexample", srcs: ["src/example.c"], vendor_available: true, vndk: { enabled: true, }, target: { vendor: { cflags: ["-DLIBEXAMPLE_ENABLE_VNDK=1"], }, }, } cc_library { name: "libexample_ext", srcs: ["src/example.c"], vendor: true, vndk: { enabled: true, extends: "libexample", }, cflags: [ "-DLIBEXAMPLE_ENABLE_VNDK=1", "-DLIBEXAMPLE_ENABLE_VNDK_EXT=1", ], }
وفي ما يلي قائمة الرموز الخاصة بـ src/example.c
:
void all() { } #if !defined(LIBEXAMPLE_ENABLE_VNDK) void framework_only() { } #endif #if defined(LIBEXAMPLE_ENABLE_VNDK) void vndk() { } #endif #if defined(LIBEXAMPLE_ENABLE_VNDK_EXT) void vndk_ext() { } #endif
وفقًا لهذين الملفين، يُنشئ نظام الإصدار مكتبات مشتركة مع الرموز المصدّرة التالية:
مسار التثبيت | الرموز التي تم تصديرها |
---|---|
/system/lib[64]/libexample.so |
all ، framework_only |
/apex/com.android.vndk.v${VER}/lib[64]/libexample.so |
all ، vndk |
/vendor/lib[64]/vndk/libexample.so |
all وvndk وvndk_ext |
متطلبات الرموز التي يتم تصديرها
أداة فحص VNDK ABI
لمقارنة واجهة التطبيق الثنائية (ABI) بصيغ مورّدي VNDK
يتم تفريغ إضافات VNDK الخاصة بمرجع واجهة التطبيق الثنائية (ABI) ضمن
prebuilts/abi-dumps/vndk
- الرموز التي تمّ تصديرها من خلال خيارات مورّدي VNDK (مثل،
/apex/com.android.vndk.v${VER}/lib[64]/libexample.so
) يجب أن تكون متطابقة إلى (وليس المجموعات الرئيسية) للرموز المحددة في عمليات تفريغ واجهة التطبيق الثنائية (ABI). - الرموز التي تم تصديرها باستخدام إضافات VNDK (مثل
/vendor/lib[64]/vndk/libexample.so
) يجب أن يتجاوزان المحددة في عمليات تفريغ ABI.
في حال تعذّر تتبُّع خيارات مورّد VNDK أو إضافات VNDK المتطلبات أعلاه، ينتج عن مدقق VNDK ABI أخطاء إنشاء
استبعاد ملفات المصدر أو المكتبات المشتركة من خيارات المورّدين
لاستبعاد ملفات المصدر من صيغة المورّد، أضِفها إلى
الموقع: exclude_srcs
. وبالمثل، لضمان تنفيذ المكتبات المشتركة
غير مرتبطة بمتغير البائع، فقم بإضافة هذه المكتبات إلى
الموقع: exclude_shared_libs
. مثلاً:
cc_library { name: "libexample_cond_exclude", srcs: ["fwk.c", "both.c"], shared_libs: ["libfwk_only", "libboth"], vendor_available: true, target: { vendor: { exclude_srcs: ["fwk.c"], exclude_shared_libs: ["libfwk_only"], }, }, }
في هذا المثال، الصيغة الأساسية لـ libexample_cond_exclude
يتضمن الرمز من fwk.c
وboth.c
ويعتمد على
في المكتبات المشتركة libfwk_only
وlibboth
. تشير رسالة الأشكال البيانية
يتضمن صيغة المورّد لـ libexample_cond_exclude
الرمز فقط
من both.c
لأنه يتم استبعاد fwk.c
من خلال
الموقع "exclude_srcs
". وبالمثل، يعتمد ذلك على المكتبة المشتركة فقط
libboth
لأنه يتم استبعاد libfwk_only
من خلال
الموقع "exclude_shared_libs
".
تصدير العناوين من إضافات VNDK
قد تضيف إضافة VNDK فئات جديدة أو دوال جديدة إلى ملف VNDK مشترك المكتبة. ننصح بالاحتفاظ بهذه البيانات في عناوين مستقلة. وتجنُّب تغيير العناوين الحالية
على سبيل المثال، ملف عنوان جديد
تم إنشاء include-ext/example/ext/feature_name.h
لشركة VNDK
الإضافة libexample_ext
:
- Android.bp
- include-ext/example/ext/feature_name.h
- تضمين/example/example.h
- src/example.c
- src/ext/feature_name.c
في Android.bp
، libexample
عملية تصدير
include
فقط، بينما تُصدِّر libexample_ext
الاثنين
include
وinclude-ext
ويضمن ذلك
لن يتم تضمين feature_name.h
بشكل غير صحيح من قِبل مستخدمي
libexample
:
cc_library { name: "libexample", srcs: ["src/example.c"], export_include_dirs: ["include"], vendor_available: true, vndk: { enabled: true, }, } cc_library { name: "libexample_ext", srcs: [ "src/example.c", "src/ext/feature_name.c", ], export_include_dirs: [ "include", "include-ext", ], vendor: true, vndk: { enabled: true, extends: "libexample", }, }
إذا لم يكن فصل الإضافات عن ملفات الرؤوس المستقلة ممكنًا، سيتم
هو إضافة #ifdef
حارسًا. ومع ذلك، تأكد من أن جميع
يضيف مستخدمو إضافة VNDK علامات التحديد. يمكنك تحديد
cc_defaults
لإضافة علامات تعريف إلى cflags
والرابط
المكتبات المشتركة مع shared_libs
.
على سبيل المثال، لإضافة دالة عضو جديدة Example2::get_b()
إلى
إضافة VNDK libexample2_ext
، يجب تعديل الإضافة الحالية
ملف العنوان وإضافة واقي #ifdef
:
#ifndef LIBEXAMPLE2_EXAMPLE_H_ #define LIBEXAMPLE2_EXAMPLE_H_ class Example2 { public: Example2(); void get_a(); #ifdef LIBEXAMPLE2_ENABLE_VNDK_EXT void get_b(); #endif private: void *impl_; }; #endif // LIBEXAMPLE2_EXAMPLE_H_
جهاز cc_defaults
باسم libexample2_ext_defaults
هو
محدد لمستخدمي libexample2_ext
:
cc_library { name: "libexample2", srcs: ["src/example2.cpp"], export_include_dirs: ["include"], vendor_available: true, vndk: { enabled: true, }, } cc_library { name: "libexample2_ext", srcs: ["src/example2.cpp"], export_include_dirs: ["include"], vendor: true, vndk: { enabled: true, extends: "libexample2", }, cflags: [ "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1", ], } cc_defaults { name: "libexample2_ext_defaults", shared_libs: [ "libexample2_ext", ], cflags: [ "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1", ], }
يمكن لمستخدمي libexample2_ext
ببساطة تضمين
libexample2_ext_defaults
في defaults
الموقع:
cc_binary { name: "example2_user_executable", defaults: ["libexample2_ext_defaults"], vendor: true, }
حِزم المنتجات
في نظام إصدار Android، المتغير PRODUCT_PACKAGES
الملفات التنفيذية أو المكتبات المشتركة أو الحزم التي ينبغي
المثبتة في الجهاز. التبعيات الانتقالية للقيم المحددة
يتم تثبيت الوحدات ضمن الجهاز أيضًا.
في حال تفعيل BOARD_VNDK_VERSION
، ستظل الوحدات ذات
احصل على اشتراك خاص لـ vendor_available
أو vndk.enabled
العلاج. إذا كانت وحدة إطار العمل تعتمد على وحدة ذات
vendor_available
أو vndk.enabled
، الصيغة الأساسية
في مجموعة التثبيت المتعدِّدة. إذا كانت هناك وحدة تابعة للبائع
تعتمد على وحدة تتضمّن vendor_available
، يكون صيغة المورّد
في مجموعة التثبيت المتعدِّدة. ومع ذلك، تتوفّر خيارات خاصة بالمورّدين من الوحدات
مع vndk.enabled
، سواءً كانت مستخدَمة في وحدات المورّدين أم لا.
عندما تكون التبعيات غير مرئية لنظام التصميم (مثل المكتبات المشتركة
التي يمكن فتحها باستخدام dlopen()
في وقت التشغيل)، عليك تحديد
أسماء الوحدات في PRODUCT_PACKAGES
لتثبيت تلك الوحدات
بشكل صريح.
إذا كانت الوحدة تتضمّن vendor_available
أو vndk.enabled
،
فإن اسم الوحدة يرمز إلى المتغير الأساسي لها. لتحديد المواصفات
صيغة المورّد في PRODUCT_PACKAGES
، عليك إلحاق .vendor
اللاحقة إلى اسم الوحدة. مثلاً:
cc_library { name: "libexample", srcs: ["example.c"], vendor_available: true, }
في هذا المثال، تعني libexample
/system/lib[64]/libexample.so
وlibexample.vendor
وتعني /vendor/lib[64]/libexample.so
. للتثبيت
/vendor/lib[64]/libexample.so
، إضافة libexample.vendor
إلى PRODUCT_PACKAGES
:
PRODUCT_PACKAGES += libexample.vendor