توليد لقطات VNDK

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

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

لقطات البناء

يقوم خادم بناء 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 . بالنسبة إلى snapshot v28 (Android 9) والإصدارات الأحدث، يتضمن التكوينات الشائعة المذكورة أعلاه.

بناء الأوامر

بالنسبة للقطات الرسمية، يتضمن نظام Android 9 والإصدارات الأحدث نموذجًا مستهدفًا ( 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 لإنشاء جميع النكهات المدعومة باستخدام الأمر التالي.

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 الخاصة موجودة على [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 bitness. على سبيل المثال، بالنسبة إلى android-vndk-arm64.zip ، يتم وضع libs 64 بت ضمن arch-arm64-armv8-a ويتم وضع libs 32 بت ضمن arch-arm-armv8-a . يوضح المثال أدناه بنية الدليل لملف ZIP للقطة VNDK ( android-vndk-arm64.zip ) لملف 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 للقطة من نوعarm64 VNDK يحتوي على عناصر البناء. الملفات الغامقة هي ملفات تمت إضافتها حديثًا إلى لقطة 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/v VER ، حيث VER يساوي إصدار لقطة VNDK (الذي يتبع إصدار SDK لإصدار Android المقابل). على سبيل المثال، تحتوي لقطة Android 8.1 VNDK على الإصدار 27.

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

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

  1. في /prebuilts/vndk/v VER ، يستخدم 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

مثال لأمر لتحديث لقطة Android 8.1 VNDK باستخدام عناصر البناء المحلية في /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 المعدة مسبقًا (على سبيل المثال، /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 يحتوي على قائمة محددة من الإصدارات، فسيبحث نظام الإنشاء عن لقطات تم إنشاؤها مسبقًا لقائمة الإصدارات في دليل prebuilts/vndk . إذا حدد نظام البناء موقع جميع اللقطات المدرجة، فإنه يقوم بتثبيت ملفات اللقطات هذه على كل VNDK APEX ( out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.v VER . تؤدي الإصدارات المفقودة إلى حدوث خطأ في البناء.

لا ترتبط وحدات 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.v VER )، حيث 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؛ قبل الإصدار، يتم استخدام الاسم الرمزي الأبجدي الرقمي لنظام Android لـ PLATFORM_VNDK_VERSION .

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

يلخص الجدول أدناه إعدادات إصدار VNDK.

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