กำลังสร้างสแนปชอต VNDK

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

สแน็ปช็อต VNDK อย่างเป็นทางการถูกสร้างขึ้นโดยอัตโนมัติบนเซิร์ฟเวอร์บิลด์ของ Android และเช็คอินใน /prebuilts/vndk ของแผนผังต้นทางของ Android เพื่อวัตถุประสงค์ในการพัฒนา คุณสามารถสร้างสแน็ปช็อต VNDK ในเครื่องได้ รองรับสแน็ปช็อต VNDK สำหรับรสชาติของ arm, arm64, x86 และ x86_64 TARGET_ARCH

การสร้างภาพรวม

เซิร์ฟเวอร์บิลด์ Android สร้างบิลด์อาร์ติแฟกต์และไฟล์สแนปช็อต VNDK โดยใช้พารามิเตอร์บิลด์และคำสั่งบิลด์ต่อไปนี้

สร้างพารามิเตอร์

ชื่อเป้าหมายการ build คือ 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) ( 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
    • ไม่จำเป็นต้องใช้ libs ที่ใช้ร่วมกันของ 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 ตัวอย่างเช่น สำหรับ android-vndk-arm64.zip libs 64 บิตจะอยู่ใต้ arch-arm64-armv8-a และ libs 32 บิตจะอยู่ใต้ arch-arm-armv8-a ตัวอย่างด้านล่างแสดงโครงสร้างไดเร็กทอรีสำหรับไฟล์ ZIP สแน็ปช็อต arm64 ( TARGET_ARCH=arm64 ) VNDK ( 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/v VER โดยที่ VER เท่ากับเวอร์ชันของสแน็ปช็อต VNDK (ซึ่งตามหลังเวอร์ชัน SDK ของรุ่น Android ที่เกี่ยวข้อง) ตัวอย่างเช่น สแนปชอต Android 8.1 VNDK มีเวอร์ชัน 27

การใช้สคริปต์ update.py

สคริปต์ update.py ( /development/vndk/snapshot/update.py ) จะทำให้กระบวนการเพิ่ม VNDK snapshot ที่สร้างไว้ล่วงหน้าลงในแผนผังต้นทางเป็นไปโดยอัตโนมัติ โดยจะตรวจจับการสร้างสิ่งประดิษฐ์โดยอัตโนมัติและเติมคุณสมบัติที่เกี่ยวข้องใน Android.bp ที่สร้างขึ้นอย่างเหมาะสม สคริปต์นี้ทำงานต่อไปนี้:

  1. ใน /prebuilts/vndk/v VER ใช้ repo start เพื่อสร้างสาขา Git ใหม่
  2. ดึงข้อมูลและแตกไฟล์อาร์ติแฟกต์การสร้างสแนปชอต VNDK
  3. รัน gen_buildfiles.py เพื่อสร้างไฟล์บิลด์อัตโนมัติ ( Android.bp )
  4. รัน check_gpl_license.py เพื่อตรวจสอบว่าไลบรารีที่สร้างไว้ล่วงหน้าซึ่งได้รับอนุญาตภายใต้ General Public License (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 snapshot หนึ่งรายการสำหรับพาร์ติชันผู้จำหน่ายปัจจุบันก็เพียงพอแล้ว อย่างไรก็ตาม ในบางกรณี คุณอาจต้องรวมสแน็ปช็อตหลายภาพไว้ในอิมเมจระบบเดียว ตัวอย่างเช่น 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 ที่ไบนารีและ libs ใน vendor.img จำเป็นต้องเรียกใช้ เก็บไว้ใน vendor.img ที่ /vendor/default.prop