יצירת קובצי snapshot של ספקים

‫Android מגרסה 11 תומך בארטיפקטים של בניית snapshot של VNDK וב-snapshots של ספקים, שאפשר להשתמש בהם כדי לבנות את vendor.img בלי קשר לגרסת Android בעץ המקור. כך אפשר להשתמש בגרסאות מעורבות של קובצי אימג', כמו קובץ אימג' של ספק ישן וקובץ אימג' של המערכת חדש.

אי אפשר להשתמש בגרסאות שונות של תמונות במקרים הבאים.

  • Android.mk. מכיוון ש-Soong יוצר את תמונת המצב של הספק, מודולים שמוגדרים ב-Android.mk לא נשמרים כתמונת מצב של הספק (גם מודולים קנייניים של SoC ב-Android.mk לא מובטחים לפעול).

  • מכשיר חיטוי. תמונות מצב של ספקים ו-VNDK לא תומכות ב-sanitizer, כי צריך ליצור בנפרד וריאציות של sanitizer.

מידע על תמונות מצב של ספקים

תמונת מצב של ספק היא תמונת מצב בבעלות OEM. זהו אוסף של מודולי C++‎ מוכנים מראש שמותקנים ב-/vendor אבל מתוחזקים ב-AOSP. אם לא מצלמים תמונת מצב של הספק של גרסת Android הקודמת, שדרוג לגרסת Android חדשה עלול לשבור את מחיצת הספק, כי אפשר להסיר או לשנות מודולים של תמונת מצב של הספק בלי תאימות ל-API או ל-ABI.

תמונת מצב של ספק מכילה את המודולים הבאים ב-AOSP.

  • ספריות משותפות, סטטיות וספריות כותרות עם vendor: true או vendor_available: true
  • ספריות סטטיות של VNDK עם vendor_available: true
  • קבצים הפעלה וקבצי אובייקט עם vendor: true או vendor_available: true

מודולים בספריות הבאות נחשבים לקוד חומרה בבעלות SoC ולא נלקחים בחשבון.

  • device/
  • vendor/
  • hardware/, למעט
    • hardware/interfaces
    • hardware/libhardware
    • hardware/libhardware_legacy

יכול להיות שקודי חומרה בבעלות SoC יופיעו גם בספריות אחרות. בשלב הזה, תמונות מצב של ספקים לא תומכות בהגדרות כאלה.

יצירת תמונות מצב של ספקים

יוצרים תמונת מצב של הספק באמצעות הפקודות הבאות.

. build/envsetup.sh
lunch target
m dist vendor-snapshot

הפקודות האלה יוצרות קובץ vendor-$(TARGET_DEVICE).zip ב-$DIST_DIR. בדוגמה הבאה מוצג קובץ ZIP של תמונת מצב של ספק:

vendor-$(TARGET_DEVICE).zip
├── arch-arm64-armv8-a
│   ├── binary         -> binary files, *.json files
│   ├── header         -> *.json files
│   ├── object         -> *.o files, *.json files
│   ├── shared         -> *.so files, *.json files
│   └── static         -> *.a files, *.json files
├── arch-arm-armv8-a   -> (arch-arm64-armv8-a)
├── configs            -> *.rc files, *.xml files
├── include            -> exported header files (*.h, *.hh, etc.)
└── NOTICE_FILES       -> license txt files
  • קובצי ה-JSON מכילים דגלים כמו שם המודול, ספריות מיוצאות, קבצים מסוג init_rc וקבצים מסוג vintf_fragments.
  • הספרייה configs מכילה את הקבצים .rc ו-.xml מהדגלים init_rc ו-vintf_fragments.

התקנת תמונות מצב של ספקים

כדי להתקין תמונת מצב של ספק, עוברים לספריית היעד ומשתמשים בפקודות הבאות.

python3 development/vendor_snapshot/update.py --local $DIST_DIR --install-dir \
    vendor/vendor name/vendor_snapshot VER

הפקודה הזו יוצרת את /vendor/vendor name/vendor_snapshot/vVER/$(TARGET_ARCH)/Android.bp. בדוגמה הבאה מוצג מבנה הספריות של תמונת מצב של ספק:

vendor/vendor name/vendor_snapshot/
├── v30
│   ├── arm64
│   │   ├── arch-arm64-armv8-a
│   │   │   ├── binary         -> (prebuilt libs)
│   │   │   ├── object         -> (prebuilt libs)
│   │   │   ├── shared         -> (prebuilt libs)
│   │   │   └── static         -> (prebuilt libs)
│   │   ├── arch-arm-armv8-a   -> (same as above)
│   │   ├── configs            -> (config files)
│   │   ├── include            -> (exported header files)
│   │   ├── NOTICE_FILES       -> (license files)
│   │   └── Android.bp         -> (snapshot modules)
│   ├── arm                    -> (same as above)
│   ├── x86_64                 -> (same as above)
│   └── x86                    -> (same as above)
└── (other vendor versions)    -> (same as above)

יצירת תמונות של ספקים

באמצעות ארטיפקטים של build של snapshot של VNDK ו-snapshot של ספק, אפשר לבצע build של vendor.img בלי קשר לגרסת Android בעץ המקור, וכך ליצור גרסאות מעורבות של תמונות. אחרי שמתקינים את תמונת המצב של VNDK ואת תמונת המצב של הספק, מגדירים את BOARD_VNDK_VERSION לגרסה של הספק. לדוגמה:

# BoardConfig.mk
BOARD_VNDK_VERSION := 29

כשהערך של BOARD_VNDK_VERSION שונה מ-current, מערכת ה-build:

  • הפעלת מודולים של תמונת מצב של VNDK ומודולים של תמונת מצב של ספקים של BOARD_VNDK_VERSION. כל מודול של תמונת מצב מבטל מודול מקור של C++ עם אותו שם.
  • ההגדרה של ro.vndk.version היא BOARD_VNDK_VERSION.
  • הפקודה מתקינה מודולים של קובץ snapshot של VNDK מ-BOARD_VNDK_VERSION אל system_ext.