יצירת תמונות מצב של VNDK

קובץ snapshot של VNDK הוא קבוצה של ספריות VNDK-core ו-VNDK-SP לגרסה של Android. אפשר לשדרג רק את מחיצת המערכת אם system.img כולל את קובץ ה-snapshot התואם של VNDK שנחוץ ל-vendor.img.

קובצי snapshot רשמיים של VNDK נוצרים באופן אוטומטי בשרת ה-build של Android ומאוחסנים ב-/prebuilts/vndk של עץ המקור של Android. למטרות פיתוח, אפשר ליצור קובצי snapshot של VNDK באופן מקומי. יש תמיכה ב-VNDK snapshots לגרסאות TARGET_ARCH של arm,‏ arm64,‏ x86 ו-x86_64.

יצירת קובצי snapshot

שרת ה-build של Android יוצר ארטיפקטים של build וקובצי snapshot של VNDK באמצעות פרמטרים של build ופקודות build הבאות.

פרמטרים של build

שם היעד של ה-build הוא vndk. הגדרת היעד של ה-build מופיעה בהמשך.

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 זהה לtarget archs (arm, ‏ arm64, ‏ x86, ‏ x86_64) של Generic System Image‏ (GSI).
  • TARGET_ARCH_VARIANT. ב-snapshot מגרסה 28 (Android 9) ואילך, כולל הגדרות פופולריות שצוינו למעלה.

פקודות build

ב-Android 9 ואילך, קובצי snapshot רשמיים כוללים יעד לדוגמה (vndk) ב-vndk.mk שמייצר קובץ snapshot של VNDK ומעביר אותו ל-$DIST_DIR. קובץ ה-ZIP של קובץ ה-snapshot בפורמט android-vndk-$(TARGET_ARCH).zip. לדוגמה:

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

שרת ה-build של Android משתמש בסקריפט build.sh כדי ליצור את כל הגרסאות הנתמכות של הארכיטקטורה באמצעות הפקודה הבאה.

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

קובץ ה-snapshot של VNDK לגרסה של Android נוצר מההסתעפות של הגרסה הזו.

פיתוח גרסת build באופן מקומי

במהלך הפיתוח, אפשר ליצור קובצי snapshot של VNDK מעץ מקור מקומי באמצעות הפקודות הבאות.

  • כדי ליצור את כל הארכיטקטורות הנתמכות בבת אחת, מריצים את סקריפט ה-build הבא (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.

קובצי snapshot

קובץ snapshot של 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 של קובץ snapshot של 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 של snapshot של VNDK (android-vndk-arm64.zip) ב-arm64 (TARGET_ARCH=arm64).

המבנה של ספריית ה-snapshot של VNDK
איור 1. מבנה הספריות של קובצי snapshot ב-VNDK (דוגמה)

פיתוח גרסאות build לתמונות מצב של ספקים

ב-Android 11 יש תמיכה בקובצי snapshot של ספקים, שמאפשרים ליצור את vendor.img ללא קשר לגרסה של Android בעץ המקור. קובץ snapshot שמוגדר כברירת מחדל ב-VNDK מכיל את קובצי הספרייה המשותפת (.so) שאפשר להתקין במכשירים, ואז לקשר אותם מקובצי ה-binary של C++ של הספק בסביבת זמן הריצה. כדי לבצע פיתוח לצד קובץ ה-snapshot של VNDK, נדרשים פריטים נוספים כמו קובצי כותרות ודגלים שיוצאו.

כדי ליצור ארטיפקטים כאלה (יחד עם קובץ snapshot של VNDK) מעץ מקומי של מקורות, משתמשים בפקודה הבאה.

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

הפקודה הזו יוצרת קבצים מסוג android-vndk-$(TARGET_ARCH).zip בתיקייה $DIST_DIR. הדוגמה הבאה היא קובץ ZIP של snapshot של VNDK ב-arm64 עם ארטיפקטים של build. הקבצים המודגשים הם קבצים שנוספו לאחרונה ל-snapshot הרגיל של 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

העלאת קובצי snapshot של VNDK

קובצי snapshot של VNDK נבדקים בעץ המקור בקטע /prebuilts/vndk/vVER, כאשר VER שווה לגרסה של קובץ ה-snapshot של VNDK (שנקבעת לפי גרסת ה-SDK של גרסת Android המתאימה). לדוגמה, קובץ snapshot של VNDK ב-Android 8.1 הוא בגרסה 27.

שימוש בסקריפט update.py

הסקריפט update.py (/development/vndk/snapshot/update.py) מאפשר להוסיף באופן אוטומטי קובץ snapshot של VNDK שנוצר מראש לעץ המקור. הוא מזהה באופן אוטומטי ארטיפקטים של גרסאות build וממלא בצורה מתאימה את המאפיינים המשויכים ב-Android.bp שנוצר. הסקריפט הזה מבצע את המשימות הבאות:

  1. ב-/prebuilts/vndk/vVER, משתמשים ב-repo start כדי ליצור הסתעפות Git חדשה.
  2. אחזור ופתיחת קובצי ארכיון של פריטי מידע שנוצרו בתהליך פיתוח (artifacts) של קובץ snapshot של VNDK.
  3. הפקודה gen_buildfiles.py מפעילה את היצירה האוטומטית של קובצי ה-build (Android.bp).
  4. הפקודה check_gpl_license.py מופעלת כדי לוודא שלספריות שנוצרו מראש ברישיון General Public License‏ (GPL) יש מקורות שפורסמו בעץ המקורות הנוכחי.
  5. משתמשים ב-git commit כדי לבצע השינויים החדשים.

שימוש ב-snapshots של VNDK שנוצרו באופן מקומי

אפשר גם להשתמש ב-snapshots של VNDK שנוצרו באופן מקומי. כשמציינים את האפשרות --local, הסקריפט update.py מאחזר את ארטיפקטי ה-build של קובץ ה-snapshot של VNDK מהספרייה המקומית שצוינה (במקום משרת ה-build של Android), שבה נמצאים הקבצים android-vndk-$(TARGET_ARCH).zip שנוצרו מהקובץ development/vndk/snapshot/build.sh. כשמשתמשים באפשרות --local, הסקריפט update.py מדלג על בדיקת הרישיון של GPL ועל השלבים git commit.

תחביר:

python update.py VER --local local_path

דוגמה לפקודה לעדכון קובץ ה-snapshot של VNDK בגרסה 8.1 של Android באמצעות ארטיפקטים מקומיים של build ב-/path/to/local/dir:

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

דוגמה למבנה ספרייה של קובץ snapshot של 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)
ארטיפקטים מקומיים של גרסאות build מתווספים באופן אוטומטי אם הארטיפקטים נוצרו באמצעות VNDK_SNAPSHOT_BUILD_ARTIFACTS=true.

התקנה של קובצי snapshot של VNDK

קובץ האימג' של המערכת מתקין ספריות של קובצי snapshot של VNDK בזמן ה-build באמצעות המידע שמופיע ב-BOARD_VNDK_VERSION, ב-PRODUCT_EXTRA_VNDK_VERSIONS וב-ro.vndk.version. אתם יכולים לקבוע אילו קובצי snapshot של VNDK יותקנו מהספריות של קובצי ה-snapshot של VNDK שנוצרו מראש (לדוגמה, /prebuilts/vndk/v29 או /prebuilts/vndk/v30) באמצעות אחת מהאפשרויות הבאות.

  • אפשרות 1: BOARD_VNDK_VERSION. משתמשים במודולים של קובצי snapshot כדי ליצור את המודולים הנוכחיים של הספק, ומתקינים רק את המודולים של קובצי snapshot שנדרשים למודולים של הספק.
  • אפשרות 2: PRODUCT_EXTRA_VNDK_VERSIONS. התקנת המודולים של קובצי snapshot של VNDK ללא קשר למודולים הנוכחיים של הספק. הפקודה הזו מתקינה את קובצי ה-snapshot של VNDK שנוצרו מראש ומפורטים בקובץ PRODUCT_EXTRA_VNDK_VERSIONS, בלי לקשר אותם למודולים אחרים בזמן ה-build.

הגדרת BOARD_VNDK_VERSION

BOARD_VNDK_VERSION מציג את גרסת VNDK שנדרשת ליצירת מודולים של ספקים קיימים. אם ב-BOARD_VNDK_VERSION יש גרסה זמינה של קובץ snapshot של VNDK בספרייה /prebuilts/vndk, קובץ ה-snapshot של VNDK שצוין ב-BOARD_VNDK_VERSION מותקן. אם קובץ snapshot של VNDK לא זמין בספרייה, מתרחשת שגיאה ב-build.

הגדרת BOARD_VNDK_VERSION מאפשרת גם להתקין את המודולים של VNDK. מודולים של ספקים מקושרים לגרסה של קובץ ה-snapshot של VNDK שמוגדרת ב-BOARD_VNDK_VERSION בזמן ה-build (הפעולה הזו לא יוצרת את המודולים הנוכחיים של VNDK במקור המערכת). כשמורידים את עץ המקור המלא ממאגר, גם מקורות המערכת וגם מקורות הספק מבוססים על אותה גרסה של Android.

הגדרת PRODUCT_EXTRA_VNDK_VERSIONS

PRODUCT_EXTRA_VNDK_VERSIONS מציג את הגרסאות הנוספות של VNDK שצריך להתקין. בדרך כלל מספיק קובץ snapshot אחד של VNDK למחיצה הנוכחית של הספק. עם זאת, במקרים מסוימים יכול להיות שתצטרכו לכלול כמה קובצי snapshot בתמונת מערכת אחת. לדוגמה, ל-GSI יש כמה קובצי snapshot כדי לתמוך בכמה גרסאות של ספקים באמצעות קובץ אימג' מערכת אחד. כשמגדירים את PRODUCT_EXTRA_VNDK_VERSIONS, אפשר להתקין את המודולים של קובץ ה-snapshot של VNDK בנוסף לגרסה של VNDK ב-BOARD_VNDK_VERSION.

אם ב-PRODUCT_EXTRA_VNDK_VERSIONS יש רשימה ספציפית של גרסאות, מערכת ה-build מחפשת קובצי snapshot מוכנים מראש של רשימת הגרסאות בתיקייה prebuilts/vndk. אם מערכת ה-build מאתרת את כל קובצי ה-snapshot שרשומים, היא מתקינה את קובצי ה-snapshot האלה בכל VNDK APEX‏ (out/target/product/$(TARGET_DEVICE)/system_ext/apex/com.android.vndk.vVER. גרסאות חסרות יוצרות שגיאת build.

המודולים של VNDK לא מקושרים למודולים של הספק בזמן ה-build, אבל אפשר להשתמש בהם בזמן הריצה אם המודולים של הספק במחיצה של הספק דורשים אחת מגרסאות 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 משוחררת. לפני השחרור, השם האלפאנומרי של קוד Android משמש את השדה PLATFORM_VNDK_VERSION.

סיכום של הגדרות הגרסה של VNDK

בטבלה מפורט סיכום של הגדרות הגרסה של VNDK.

Vendor
Build
Board
Version
SDK
Release
גרסת הפלטפורמה
מאפיין Version
ספריית ההתקנות
המודולים הנוכחיים של VNDK current לפני CODE_NAME CODE_NAME /system/apex/com.android.vndk.vCODE_NAME
אחרי SDK_VER SDK_VER /system/apex/com.android.vndk.vSDK_VER
מודולים מוכנים מראש של קובצי snapshot VNDK_VER
לתמונת מצב
לפני או אחרי CODE_NAME
או SDK_VER
VNDK_VER /system_ext/apex/com.android.vndk.vVNDK_VER
  • Board Version (BOARD_VNDK_VERSION). גרסת VNDK שנדרשת למודולים של הספק לצורך פיתוח. מגדירים את הערך current אם אפשר לקשר בין מודולים של ספקים לבין מודולים קיימים במערכת.
  • Platform Version (PLATFORM_VNDK_VERSION). גרסת VNDK שבה נוצרים מודולי המערכת הנוכחיים. ה-build נוצר רק כאשר BOARD_VNDK_VERSION שווה ל-current.
  • Version Property (ro.vndk.version). נכס שמציין את גרסת VNDK שנדרשת כדי להריץ את הקבצים הבינאריים והספריות ב-vendor.img. מאוחסן ב-vendor.img‏ ב-/vendor/default.prop.