สร้างสแนปชอต VNDK

สแนปชอต VNDK คือชุดไลบรารี VNDK-core และ VNDK-SP สำหรับรุ่น Android คุณจะอัปเกรดได้เฉพาะพาร์ติชันระบบหาก system.img มีสแนปชอต VNDK ที่เกี่ยวข้องซึ่ง vendor.img ต้องใช้

ระบบจะสร้างสแนปชอต VNDK อย่างเป็นทางการโดยอัตโนมัติในเซิร์ฟเวอร์บิลด์ Android และเช็คอินใน /prebuilts/vndk ของซอร์สทรี Android คุณสร้างสแนปชอต VNDK ได้ในเครื่องเพื่อวัตถุประสงค์ในการพัฒนา ระบบรองรับสแนปชอต VNDK สำหรับ TARGET_ARCH เวอร์ชัน arm, 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 เหมือนกับ Generic System Image (GSI) target archs (arm, arm64, x86, x86_64)
  • TARGET_ARCH_VARIANT. สำหรับสแนปชอต 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-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 สแนปชอต VNDK (android-vndk-arm64.zip) สำหรับ arm64 (TARGET_ARCH=arm64)

โครงสร้างไดเรกทอรีสแนปชอต VNDK
รูปที่ 1 โครงสร้างไดเรกทอรีสแนปชอต VNDK (ตัวอย่าง)

บิลด์สําหรับสแนปชอตของผู้ให้บริการ

Android 11 รองรับสแนปชอตของผู้ให้บริการ ซึ่งช่วยให้คุณสร้าง vendor.img ได้โดยไม่คำนึงถึงเวอร์ชัน Android ในซอร์สทรี ภาพรวม VNDK เริ่มต้นจะมีไฟล์ไลบรารีที่ใช้ร่วมกัน (.so) ซึ่งสามารถติดตั้งลงในอุปกรณ์ แล้วลิงก์จากไบนารี C++ ของผู้ให้บริการในรันไทม์ หากต้องการสร้างเทียบกับสแนปชอต VNDK ดังกล่าว คุณต้องมีอาร์ติแฟกต์เพิ่มเติม เช่น ไฟล์ส่วนหัวและ Flag ที่ส่งออก

หากต้องการสร้างอาร์ติแฟกต์ดังกล่าว (พร้อมกับสแนปชอต 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 (/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 ที่คอมไพล์ไว้ล่วงหน้า (เช่น /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 1 รายการสำหรับพาร์ติชันผู้ให้บริการปัจจุบันก็เพียงพอแล้ว อย่างไรก็ตาม ในบางกรณี คุณอาจต้องรวมภาพรวมหลายรายการไว้ในอิมเมจระบบเดียว ตัวอย่างเช่น 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.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 เผยแพร่ โดยก่อนการเผยแพร่ ระบบจะใช้ชื่อโค้ดที่เป็นตัวอักษรและตัวเลขของ Android สำหรับ PLATFORM_VNDK_VERSION

สรุปการตั้งค่าเวอร์ชัน VNDK

ตารางจะสรุปการตั้งค่าเวอร์ชัน VNDK

ผู้ให้บริการ
สร้าง
Board
Version
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 ที่ไบนารีและไลบรารีใน vendor.img ต้องใช้ในการทำงาน จัดเก็บไว้ใน vendor.img ที่ /vendor/default.prop