สร้างสแนปชอต 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 สำหรับสแนปชอต 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 สำหรับสร้าง Arc ที่รองรับทั้งหมด รสชาติ ด้วยคำสั่งต่อไปนี้

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

สแนปชอต VNDK สำหรับเวอร์ชัน Android สร้างขึ้นจาก ปล่อย Branch

สร้างในเครื่อง

ในระหว่างการพัฒนา คุณจะสร้างสแนปชอต VNDK จากโครงสร้างแหล่งที่มาในเครื่องได้ด้วย คำสั่งต่อไปนี้

  • หากต้องการสร้างส่วนโค้งที่รองรับทั้งหมดพร้อมกัน ให้เรียกใช้สคริปต์บิลด์ต่อไปนี้ (build.sh) วันที่
    cd $ANDROID_BUILD_TOP
    development/vndk/snapshot/build.sh
    
  • หากต้องการสร้าง TARGET_ARCH ที่เฉพาะเจาะจง 1 รายการ ให้ดำเนินการต่อไปนี้ คำสั่ง
    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 ตัวอย่างด้านล่างแสดง โครงสร้างไดเรกทอรีสำหรับ arm64 (TARGET_ARCH=arm64) VNDK ไฟล์สแนปชอต ZIP (android-vndk-arm64.zip)

โครงสร้างไดเรกทอรีสแนปชอต 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/vVER โดยที่ VER มีค่าเท่ากับเวอร์ชันของสแนปชอต VNDK (ซึ่งหลังจากเวอร์ชัน SDK ของ Android รุ่นที่เกี่ยวข้อง) สำหรับ เช่น สแนปชอต Android 8.1 VNDK มีเวอร์ชัน 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

คำสั่งตัวอย่างสำหรับการอัปเดตสแนปชอต 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 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 ไว้เท่านั้น

เวอร์ชันแพลตฟอร์ม_VNDK_

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

การสร้าง
ผู้ให้บริการ
เวอร์ชัน
กระดาน
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) ดองเวียดนาม เวอร์ชันที่โมดูลผู้ให้บริการต้องใช้ในการสร้าง ตั้งค่าเป็น current หาก โมดูลของผู้ให้บริการสามารถลิงก์กับโมดูลระบบปัจจุบันได้
  • เวอร์ชันแพลตฟอร์ม (PLATFORM_VNDK_VERSION) VNDK เวอร์ชันที่กำลังสร้างโมดูลระบบปัจจุบัน สร้างเฉพาะเมื่อ BOARD_VNDK_VERSION เท่ากับค่าปัจจุบัน
  • พร็อพเพอร์ตี้เวอร์ชัน (ro.vndk.version) พร็อพเพอร์ตี้ ที่ระบุเวอร์ชัน VNDK ที่ไบนารีและ lib ในVendor.img ต้องใช้ วิ่งได้ จัดเก็บไว้ใน vendor.img ที่ /vendor/default.prop