إنشاء لقطات VNDK

لقطة VNDK هي مجموعة من مكتبتَي VNDK-core وVNDK-SP لإصدار Android. يمكنك ترقية قسم النظام فقط إذا كان system.img يتضمّن لقطة VNDK المقابلة التي يحتاج إليها vendor.img.

يتم إنشاء نُسخ VNDK الرسمية تلقائيًا على خادم إنشاء Android ويتم تسجيلها في /prebuilts/vndk من شجرة مصدر Android. لأغراض تطوير التطبيقات، يمكنك إنشاء لقطات VNDK محليًا. يمكن استخدام لقطات VNDK مع أنظمة التشغيل arm وarm64 وx86 وx86_64 TARGET_ARCH.

إنشاء لقطات

ينشئ خادم إنشاء تطبيقات Android عناصر إنشاء وملفات لقطات VNDK باستخدام مَعلمات الإنشاء وأوامر الإنشاء التالية.

إنشاء المَعلمات

اسم هدف الإنشاء هو vndk. تظهر أدناه إعدادات استهداف عملية الإنشاء.

TARGET_PRODUCT TARGET_ARCH TARGET_ARCH_VARIANT
aosp_arm arm armv7-a-neon
aosp_arm64 arm64 armv8-a
aosp_x86 x86 x86
aosp_x86_64 x86_64 x86_64
  • TARGET_PRODUCT=aosp_$(TARGET_ARCH)
  • TARGET_BUILD_VARIANT=user
  • TARGET_ARCH هو نفسه البنية الأساسية المستهدَفة لـ "صورة النظام العام" (GSI) (arm وarm64 وx86 وx86_64).
  • TARGET_ARCH_VARIANT. بالنسبة إلى الإصدار 28 من الإصدارات العلنية (Android 9) والإصدارات الأحدث، تتضمّن الإعدادات الشائعة المذكورة أعلاه.

إنشاء الطلبات

بالنسبة إلى اللقطات الرسمية، يتضمّن الإصدار 9 من Android والإصدارات الأحدث نموذجًا مستهدَفًا (vndk) في vndk.mk ينشئ لقطة VNDK ويعرضها على $DIST_DIR. يستخدم ملف ZIP الخاص باللقطة التنسيق android-vndk-$(TARGET_ARCH).zip. مثلاً:

lunch aosp_TARGET_ARCH-user
make -j vndk dist [BOARD_VNDK_VERSION=current]

يستخدم خادم إنشاءات Android النص البرمجي build.sh لإنشاء جميع النُسخ المتوافقة من ملف تعريف ملف APK باستخدام الأمر التالي.

DIST_DIR=dist_dir development/vndk/snapshot/build.sh

يتم إنشاء لقطة VNDK لإصدار Android من مسار الإصدار لهذا الإصدار.

الإنشاء على الجهاز

أثناء التطوير، يمكنك إنشاء لقطات VNDK من شجرة مصدر محلية باستخدام الأوامر التالية.

  • لإنشاء جميع الأنظمة الأساسية المتوافقة دفعة واحدة، نفِّذ نص الإنشاء التالي (build.sh).
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
  • لإنشاء TARGET_ARCH محدّد، نفِّذ الأوامر التالية.
    lunch aosp_TARGET_ARCH-user
    m -j vndk dist

يتم إنشاء ملف android-vndk-$(TARGET_ARCH).zip المقابل ضمن $DIST_DIR.

ملفات اللقطات

تتضمّن لقطة VNDK الملفات التالية.

  • نسخة المورّد من مكتبتَي VNDK-core وVNDK-SP المشتركة
    • لا حاجة إلى مكتبات LL-NDK المشتركة لأنّها متوافقة مع الإصدارات القديمة.
    • بالنسبة إلى الأجهزة المستهدفة التي تعمل بنظام التشغيل 64 بت، يتم إنشاء مكتبتَي TARGET_ARCH و TARGET_2ND_ARCH وتضمينها.
  • يمكنك الاطّلاع على قائمة مكتبات VNDK-core وVNDK-SP وLL-NDK وVNDK-private على الرابط [vndkcore|vndksp|llndk|vndkprivate].libraries.txt.
  • ملفات التراخيص
  • module_paths.txt. تُسجِّل مسارات الوحدات لجميع مكتبات VNDK ، وهي مطلوبة للتحقّق من أنّ مشاريع GPL تتضمّن مصادر تم إصدارها في شجرة مصدر معيّنة لنظام Android.

بالنسبة إلى ملف ZIP للقطة VNDK، android-vndk-$(TARGET_ARCH).zip، يتم تجميع المكتبات المُسبقة الإنشاء لـ VNDK في أدلة منفصلة باسم arch-$(TARGET_ARCH)-$(TARGET_ARCH_VARIANT) وفقًا لوحدة ABI. على سبيل المثال، بالنسبة إلى android-vndk-arm64.zip، يتم وضع المكتبات المتوافقة مع الإصدار 64 بت ضمن arch-arm64-armv8-a ويتم وضع المكتبات المتوافقة مع الإصدار 32 بت ضمن arch-arm-armv8-a. يعرض المثال أدناه بنية الدليل لملف ZIP (android-vndk-arm64.zip) الذي يتضمّن لقطة لنظام التشغيل VNDK على جهاز يعمل بمعالج arm64 (TARGET_ARCH=arm64).

بنية دليل لقطات VNDK
الشكل 1. بنية دليل لقطة VNDK (مثال)

إنشاء لقطات لمورّدي المحتوى

يتوافق Android 11 مع لقطات رمز المصنّع، ما يتيح لك إنشاء vendor.img بغض النظر عن إصدار Android في شجرة المصدر. تحتوي لقطة VNDK التلقائية على ملفات المكتبة المشترَكة (.so) التي يمكن تثبيتها على الأجهزة، ثم يتم ربطها من الثنائيات C++ الخاصة بالمورّد في وقت التشغيل. لإنشاء الإصدار من حزمة VNDK هذه، تحتاج إلى عناصر إضافية، مثل ملفات الرأس وعلامات التصدير.

لإنشاء هذه العناصر (بالإضافة إلى لقطة VNDK) من شجرة مصدر محلية، استخدِم الأمر التالي.

VNDK_SNAPSHOT_BUILD_ARTIFACTS=true development/vndk/snapshot/build.sh

ينشئ هذا الأمر android-vndk-$(TARGET_ARCH).zip ملفًا ضمن $DIST_DIR. في ما يلي مثال على ملف ZIP للقطة VNDK على arm64 يتضمّن عناصر إنشاء. الملفات المميّزة بالخط الغامق هي ملفات تمت إضافتها حديثًا إلى لقطة VNDK العادية (الموضَّحة في الشكل 1)، وتشمل ملفات JSON (التي تخزِّن cflags من كل مكتبة) وجميع ملفات الرأس التي تم تصديرها.

android-vndk-arm64.zip
├── arch-arm64-armv8-a
│   └── shared
│       ├── vndk-core  -> *.so files, *.json files
│       └── vndk-sp    -> *.so files, *.json files
├── arch-arm-armv8-a   -> (same as arch-arm64-armv8-a)
├── configs            -> *.libraries.txt, module_paths.txt, module_names.txt
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files

تحميل لقطات VNDK

يتم التحقّق من لقطات VNDK في شجرة المصدر ضمن /prebuilts/vndk/vVER، حيث يكون VER مساويًا لإصدار لقطة VNDK (الذي يتّبع إصدار حزمة SDK لإصدار Android المقابل). على سبيل المثال، تحتوي لقطة VNDK لنظام التشغيل Android 8.1 على الإصدار 27.

استخدام النص البرمجي update.py

يعمل نص update.py script (/development/vndk/snapshot/update.py) على التشغيل الآلي لإضافة لقطة VNDK مُسبقة الإنشاء إلى شجرة المصدر. ويرصد تلقائيًا عناصر إنشاء التطبيق ويملؤها بشكل مناسب في المواقع المرتبطة في Android.bp الذي تم إنشاؤه. ينفِّذ هذا النص البرمجي المهام التالية:

  1. في /prebuilts/vndk/vVER، يستخدم repo start لإنشاء فرع Git جديد.
  2. تُستخدَم هذه الأداة لجلب عناصر إنشاء لقطة VNDK وفك ضغطها.
  3. تشغيل gen_buildfiles.py لإنشاء ملفات التصميم تلقائيًا (Android.bp)
  4. يتم تشغيل check_gpl_license.py للتحقّق من أنّ المكتبات المُسبقة الإنشاء المرخّصة بموجب الترخيص العام للبرامج (GPL) تتضمّن مصادر تم إصدارها في شجرة المصادر الحالية.
  5. يستخدم git commit لحفظ التغييرات الجديدة.

استخدام لقطات VNDK المُنشأة محليًا

يمكنك أيضًا استخدام لقطات VNDK التي تم إنشاؤها محليًا. عند تحديد الخيار --local ، يُستخدَم النص البرمجي update.py لجلب عناصر إنشاء لقطة VNDK من الدليل المحلي المحدّد (بدلاً من خادم إنشاء Android) الذي يحتوي على ملفات android-vndk-$(TARGET_ARCH).zip التي تم إنشاؤها من development/vndk/snapshot/build.sh. باستخدام الخيار --local، يتخطّى النص البرمجي update.py خطوات التحقّق من ترخيص GPL وgit commit.

البنية:

python update.py VER --local local_path

مثال على أمر لتعديل لقطة VNDK لنظام التشغيل Android 8.1 باستخدام مواد ملف الإنشاء المحلية في /path/to/local/dir:

python update.py 27 --local /path/to/local/dir

مثال على بنية الدليل للقطة VNDK تم إنشاؤها محليًا:

prebuilts/vndk
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (prebuilt libs)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   └── Android.bp         -> (VNDK modules with cflags)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   ├── x86                    -> (same as above)
│   ├── common
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (license file modules)
│   └── Android.bp             -> (*.libraries.30.txt modules)
└── (other VNDK versions)      -> (same as above)
تتم إضافة عناصر الإنشاء المحلية تلقائيًا إذا تم إنشاء العناصر باستخدام VNDK_SNAPSHOT_BUILD_ARTIFACTS=true.

تثبيت لقطات VNDK

تثبِّت صورة النظام مكتبات لقطات VNDK في وقت الإنشاء باستخدام المعلومات الواردة في BOARD_VNDK_VERSION و PRODUCT_EXTRA_VNDK_VERSIONS وro.vndk.version. يمكنك التحكّم في لقطات VNDK التي يتم تثبيتها من أدلة لقطات VNDK prebuilt (مثل /prebuilts/vndk/v29 أو /prebuilts/vndk/v30) باستخدام أحد الخيارَين التاليَين.

  • الخيار 1: BOARD_VNDK_VERSION. استخدِم وحدات ملفّات التعديل لإنشاء وحدات المورّدين الحالية، ولا تثبِّت سوى وحدات ملفّات التعديل المطلوبة لوحدات المورّدين.
  • الخيار 2: PRODUCT_EXTRA_VNDK_VERSIONS. تثبيت وحدات لقطة VNDK بغض النظر عن وحدات المورّد الحالية يؤدي ذلك إلى تثبيت لقطات VNDK المُنشأة مسبقًا والمدرَجة في PRODUCT_EXTRA_VNDK_VERSIONS بدون ربطها بأي وحدات أخرى في وقت الإنشاء.

ضبط BOARD_VNDK_VERSION

BOARD_VNDK_VERSION تعرِض إصدار حزمة VNDK المطلوب لإنشاء وحدات المورّد الحالية. إذا كان BOARD_VNDK_VERSION يتضمّن إصدارًا متاحًا من لقطة VNDK في دليل /prebuilts/vndk، يتم تثبيت لقطة VNDK المُشار إليها في BOARD_VNDK_VERSION. إذا لم تكن لقطة VNDK متاحة في الدليل، سيحدث خطأ في عملية الإنشاء.

يؤدي تحديد BOARD_VNDK_VERSION أيضًا إلى تفعيل وحدات VNDK لتثبيتها. ترتبط وحدات المورّدين بإصدار لقطة VNDK المحدّد في BOARD_VNDK_VERSION في وقت الإنشاء (لا يؤدي ذلك إلى إنشاء وحدات VNDK الحالية في مصدر النظام). عند تنزيل شجرة المصدر الكاملة من أحد المراكمات، تستند مصادر النظام والمورّد إلى إصدار Android نفسه.

ضبط PRODUCT_EXTRA_VNDK_VERSIONS

يسرد PRODUCT_EXTRA_VNDK_VERSIONS إصدارات VNDK الإضافية التي يجب تثبيتها. يكفي عادةً توفُّر لقطة واحدة من VNDK لقسيمة "المورّد" الحالية. ومع ذلك، قد تحتاج في بعض الحالات إلى تضمين عدة لقطات في صورة نظام واحدة. على سبيل المثال، تتضمّن مبادرة GSI لقطات متعددة لتوفير ميزة التوافق مع إصدارات متعددة من المورّدين باستخدام صورة نظام واحدة. من خلال ضبط القيمة PRODUCT_EXTRA_VNDK_VERSIONS، يمكنك تثبيت وحدات لقطة VNDK بالإضافة إلى إصدار VNDK في BOARD_VNDK_VERSION.

إذا كان PRODUCT_EXTRA_VNDK_VERSIONS يحتوي على قائمة محدّدة بالإصدارات، يبحث نظام الإنشاء عن لقطات مُعدّة مسبقًا لقائمة الإصدارات في directory prebuilts/vndk. إذا حدّد نظام الإنشاء موقع كل اللقطات المُدرَجة ، سيثبّت ملفات اللقطات هذه في كل ملف VNDK APEX (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER. ويؤدي عدم توفّر الإصدارات إلى حدوث خطأ في عملية الإنشاء.

لا يتم ربط وحدات VNDK بوحدات المورّد في وقت الإنشاء، ولكن يمكن استخدامها في وقت التشغيل إذا كانت وحدات المورّد في قسم المورّد تتطلّب أحد إصدارات VNDK المثبَّتة. لا تكون السمة PRODUCT_EXTRA_VNDK_VERSIONS صالحة إلا إذا تم تحديد السمة BOARD_VNDK_VERSION.

PLATFORM_VNDK_VERSION

PLATFORM_VNDK_VERSION يحدّد إصدار حزمة VNDK لوحدات VNDK الحالية في مصدر النظام. يتم ضبط القيمة تلقائيًا:

  • قبل الإصدار، يتم ضبط PLATFORM_VNDK_VERSION على PLATFORM_VERSION_CODENAME.
  • عند الإصدار، يتم نسخ PLATFORM_SDK_VERSION إلى PLATFORM_VNDK_VERSION.

بعد طرح إصدار Android، يتم تثبيت مكتبات VNDK الحالية في حزمة VNDK APEX (/system/apex/com.android.vndk.vVER)، حيث يمثّل VER الإصدار المخزَّن في PLATFORM_VNDK_VERSION.

عند ضبط BOARD_VNDK_VERSION على current، يتم تخزين PLATFORM_VNDK_VERSION في ro.vndk.version، وإلا يتم تخزين BOARD_VNDK_VERSION في ro.vndk.version. يتم ضبط PLATFORM_VNDK_VERSION على إصدار حزمة SDK عند إصدار Android. وقبل الإصدار، يتم استخدام اسم رمز PLATFORM_VNDK_VERSION الأبجدي الرقمي لنظام Android .

ملخّص لإعدادات إصدار VNDK

يلخّص الجدول إعدادات إصدار VNDK.

المورّد
إنشاء
لوحة
الإصدار
إصدار حزمة SDK
النظام الأساسي
الإصدار
الإصدار
السمة
دليل التثبيت
وحدات VNDK الحالية current قبل CODE_NAME CODE_NAME /system/apex/com.android.vndk.vCODE_NAME
بعد SDK_VER SDK_VER /system/apex/com.android.vndk.vSDK_VER
وحدات اللقطات المصمّمة مسبقًا VNDK_VER
للقطة
قبل أو بعد CODE_NAME
أو SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.vVNDK_VER
  • إصدار اللوحة (BOARD_VNDK_VERSION): إصدار VNDK الذي تتطلّبه وحدات المورّدين لإنشاء التطبيق. اضبط القيمة على current إذا كان بإمكان وحدات المورّد الربط بوحدات النظام الحالية.
  • إصدار النظام الأساسي (PLATFORM_VNDK_VERSION): يشير إلى إصدار VNDK الذي يتم إنشاء وحدات النظام الحالية من خلاله. لا يتم إنشاؤه إلا عندما يكون BOARD_VNDK_VERSION مساويًا للقيمة الحالية.
  • سمة الإصدار (ro.vndk.version): وهي سمة تحدّد إصدار VNDK الذي تتطلّب ملفّات bin وlibs في vendor.img بدءه . تم تخزينها في vendor.img في /vendor/default.prop.