อิมเมจระบบสามารถใช้ภาพรวม VNDK เพื่อจัดหาคลัง VNDK ที่ถูกต้องให้กับอิมเมจของผู้ให้บริการได้ แม้ว่าอิมเมจระบบและอิมเมจของผู้ให้บริการจะสร้างขึ้นจาก Android เวอร์ชันต่างๆ ก็ตาม การสร้างสแนปชอต VNDK ต้องมีการบันทึกห้องสมุด VNDK เป็นสแนปชอตและทําเครื่องหมายด้วยหมายเลขเวอร์ชัน รูปภาพผู้ให้บริการอาจลิงก์กับ VNDK เวอร์ชันที่ระบุซึ่งให้ ABI ที่จำเป็นสำหรับโมดูลในรูปภาพผู้ให้บริการ อย่างไรก็ตาม ภายใน VNDK เวอร์ชันเดียวกัน ไลบรารี VNDK ต้องเป็น ABI-stable
การออกแบบสแนปชอต VNDK มีวิธีการสร้างสแนปชอต VNDK ที่คอมไพล์ล่วงหน้าจากอิมเมจระบบปัจจุบัน และการติดตั้งไลบรารีที่คอมไพล์ล่วงหน้าเหล่านั้นลงในพาร์ติชันระบบของ Android เวอร์ชันใหม่
เกี่ยวกับไลบรารี VNDK
HIDL-HAL ที่เปิดตัวใน Android 8.0 ช่วยให้สามารถอัปเกรดพาร์ติชันระบบและพาร์ติชันของผู้ให้บริการแยกกันได้ VNDK จะกำหนดชุดไลบรารี (VNDK-core, VNDK-SP และ LL-NDK) ที่โค้ดของผู้ให้บริการลิงก์ได้ และบล็อกไม่ให้ผู้ให้บริการใช้ไลบรารีที่ไม่ได้อยู่ในชุด VNDK ด้วยเหตุนี้ ระบบจึงสร้างและเรียกใช้อิมเมจของผู้ให้บริการได้หากมีการระบุชุด VNDK ที่ถูกต้องในอิมเมจระบบให้กับอิมเมจของผู้ให้บริการ
VNDK-core
ระบบจะติดตั้งชุดไลบรารี VNDK-core ใน /system/lib[64]/vndk-${VER}
และพร้อมใช้งานเฉพาะสำหรับกระบวนการของผู้ให้บริการที่มีระดับ API เท่ากับ ${VER}
กระบวนการของระบบจะใช้ไลบรารีเหล่านี้ไม่ได้ และต้องใช้ไลบรารีที่ติดตั้งใน /system/lib[64]
แทน ไลบรารี VNDK-core จะไม่เกิดการโหลดซ้ำเนื่องจากข้อจำกัดของเนมสเปซที่เข้มงวดสำหรับแต่ละกระบวนการ
หากต้องการรวมไลบรารีใน VNDK-core ให้เพิ่มข้อมูลต่อไปนี้ลงใน Android.bp
vendor_available: true, vndk: { enabled: true, },
VNDK-SP
ไลบรารี VNDK-SP จะติดตั้งใน /system/lib[64]/vndk-sp-${VER}
และพร้อมใช้งานสำหรับกระบวนการของผู้ให้บริการและกระบวนการของระบบ (ผ่านไลบรารี SP-HAL ที่ติดตั้งในพาร์ติชันของผู้ให้บริการ) ไลบรารี VNDK-SP อาจมีการโหลดแบบคู่
หากต้องการรวมไลบรารีใน VNDK-SP ให้เพิ่มข้อมูลต่อไปนี้ลงใน Android.bp
vendor_available: true, vndk: { enabled: true, support_system_process: true, },
LL-NDK
ติดตั้งไลบรารี LL-NDK ใน /system/lib[64]
โมดูลของผู้ให้บริการสามารถใช้ไลบรารีสแต็บ LL-NDK เพื่อเข้าถึงสัญลักษณ์ที่เลือกไว้ล่วงหน้าของไลบรารี LL-NDK ไลบรารี LL-NDK ต้องใช้งานร่วมกับเวอร์ชันเก่าได้และ ABI ต้องเสถียรเพื่อให้โมดูลของผู้ให้บริการเวอร์ชันเก่าใช้ไลบรารี LL-NDK เวอร์ชันใหม่ได้
เนื่องจาก LL-NDK มีลักษณะ ABI ที่เสถียร สแนปชอต VNDK จึงไม่จำเป็นต้องรวมไลบรารี LL-NDK สำหรับรูปภาพเดิมของผู้ให้บริการ
เกี่ยวกับภาพรวม VNDK
Android 8.1 มีไลบรารี VNDK ที่สร้างขึ้นจากซอร์สโค้ด อย่างไรก็ตาม สำหรับ Android เวอร์ชันที่ใหม่กว่า คุณต้องบันทึก VNDK แต่ละเวอร์ชันเป็นสแนปชอตและระบุเป็นรุ่นก่อนสร้างเพื่อให้ลิงก์กับรูปภาพผู้ให้บริการเวอร์ชันเก่าได้
ตั้งแต่ Android 9 เป็นต้นไป Android เวอร์ชันใหม่จะมีสแนปชอตของไดเรกทอรี VNDK-core และ VNDK-SP สำหรับเวอร์ชันเก่าอย่างน้อย 1 รายการในซอร์สโค้ดของ Android เมื่อมีการสร้าง ระบบจะติดตั้งสแนปชอตที่จำเป็นใน /system/lib[64]/vndk-${VER}
และ /system/lib[64]/vndk-sp-${VER}
(ไดเรกทอรีที่พาร์ติชันของผู้ให้บริการใช้ได้) โดยที่ ${VER}
คือตัวแปรสตริงที่แสดงถึงชื่อเวอร์ชันของสแนปชอต VNDK
เนื่องจากไลบรารีภาพรวม VNDK อาจแตกต่างกันไปในแต่ละเวอร์ชัน VNDK ภาพรวม VNDK จึงมีการกําหนดค่าเนมสเปซของ linker ด้วย ซึ่งติดตั้งเป็น
etc/ld.config.${VER}.txt
,
/etc/llndk.libraries.${VER}.txt
และ
/etc/vndksp.libraries.${VER}.txt
ตัวอย่าง: อัปเกรดระบบและผู้ให้บริการ images
ไม่ต้องใช้สแนปชอต สามารถสร้างโดยไม่ต้องมีการกำหนดค่าเพิ่มเติมสำหรับสแนปชอต VNDK
ตัวอย่าง: อัปเกรดเฉพาะภาพระบบ
ต้องรวมสแนปชอต VNDK และไฟล์การกําหนดค่าเนมสเปซของ linker สําหรับอิมเมจของผู้ให้บริการในอิมเมจระบบ ไฟล์การกำหนดค่าเนมสเปซของโปรแกรมลิงก์จะได้รับการกําหนดค่าโดยอัตโนมัติให้ค้นหาไลบรารี VNDK ใน /system/lib[64]/vndk-${VER}
และ /system/lib[64]/vndk-sp-${VER}

ตัวอย่างเช่น อัปเกรดรูปภาพระบบ การเปลี่ยนแปลงรูปภาพเล็กน้อยของผู้ให้บริการ
ระบบยังไม่รองรับการสร้างอิมเมจของผู้ให้บริการจากสแนปชอต VNDK คุณจึงต้องสร้างอิมเมจของผู้ให้บริการแยกต่างหากด้วยซอร์สโค้ดต้นฉบับ จากนั้นจึงอัปเกรดอิมเมจระบบตามที่อธิบายไว้ในตัวอย่างก่อนหน้านี้
สถาปัตยกรรมภาพรวม VNDK
หากต้องการให้ระบบภาพ Android 9 เข้ากันได้กับระบบภาพผู้ให้บริการ Android 8.1 คุณต้องระบุภาพนิ่ง VNDK ที่ตรงกับระบบภาพผู้ให้บริการ Android 8.1 กับระบบภาพ Android 9 ดังที่แสดงด้านล่าง

การออกแบบภาพรวม VNDK มีวิธีการต่อไปนี้
- การสร้างสแนปชอตสำหรับไลบรารี VNDK-core และ VNDK-SP Android 9 มีสคริปต์ที่คุณสามารถใช้เพื่อสร้างสแนปชอตของบิลด์ VNDK ปัจจุบัน สคริปต์นี้จะรวมไลบรารีทั้งหมดใน
/system/lib[64]/vndk-28
และ/system/lib[64]/vndk-sp-28
ที่สร้างขึ้นจากแหล่งที่มาปัจจุบันเป็นสแนปชอต VNDK โดยที่28
คือ VNDK เวอร์ชัน Android 9 สแนปชอตยังมีไฟล์การกำหนดค่าเนมสเปซของโปรแกรมลิงก์/etc/ld.config.28.txt
,/etc/llndk.libraries.28.txt
และ/etc/vndksp.libraries.28.txt
ด้วย ระบบจะใช้สแนปชอตที่สร้างขึ้นกับ Android เวอร์ชันใหม่กว่า (สูงกว่า Android 9) - การติดตั้งไลบรารี VNDK-core และ VNDK-SP ที่คอมไพล์ไว้ล่วงหน้าจากสแนปชอต ใน Android 9 ภาพรวม VNDK จะมีชุดไลบรารี VNDK-core ที่คอมไพล์ไว้ล่วงหน้าและชุดไลบรารี VNDK-SP รวมถึงไฟล์การกําหนดค่าเนมสเปซของ linker เมื่อคุณระบุรายการเวอร์ชันสแนปชอต VNDK ที่จะติดตั้ง อิมเมจระบบจะติดตั้งไลบรารีสแนปชอต VNDK ลงใน
/system/lib[64]/vndk-${VER}
และไดเรกทอรี/system/lib[64]/vndk-sp-${VER}
รวมถึงไฟล์การกำหนดค่าเนมสเปซของลิงเกอร์สำหรับสแนปชอต VNDK เหล่านั้นลงในไดเรกทอรี/etc
ในเวลาที่สร้าง
การกำหนดเวอร์ชัน VNDK
Android แต่ละรุ่นจะมีสแนปชอต VNDK เพียงรายการเดียว และระบบจะใช้เวอร์ชัน SDK เป็นเวอร์ชัน VNDK (ซึ่งหมายความว่าเวอร์ชัน VNDK จะเป็นตัวเลขเต็ม เช่น 27 สำหรับ Android 8.1) เวอร์ชัน VNDK จะได้รับการแก้ไขเมื่อมีการเผยแพร่เวอร์ชัน Android ระบบจะจัดเก็บเวอร์ชัน VNDK ที่ใช้โดยพาร์ติชันของผู้ให้บริการโดยอัตโนมัติในพร็อพเพอร์ตี้ ro.vndk.version
ซึ่งสามารถอ่านได้เมื่อรันไทม์ จากนั้นระบบจะใช้เวอร์ชันนี้ในการระบุเวอร์ชัน VNDK ของผู้ให้บริการสำหรับไลบรารีบางรายการ และระบุเวอร์ชันสแนปชอต VNDK สำหรับการกําหนดค่าเนมสเปซ
สร้างไลบรารี VNDK
คำสั่ง make vndk
จะสร้างไลบรารีที่มี vndk:
{ enabled: true, … }
ซึ่งรวมถึงไฟล์การกำหนดค่า Dependency และเนมสเปซ หากตั้งค่า BOARD_VNDK_VERSION := current
ระบบจะสร้างไลบรารีเหล่านี้ด้วยคำสั่ง make
เนื่องจากบิลด์นี้ไม่ได้ติดตั้งไลบรารี VNDK จากสแนปชอต ไลบรารี VNDK ที่ติดตั้งจึงไม่มีเสถียรภาพ ABI อย่างไรก็ตาม เมื่อมีการเผยแพร่ Android เวอร์ชันหนึ่ง ABI สำหรับ VNDK เวอร์ชันปัจจุบันจะได้รับการแก้ไข เมื่อถึงจุดนี้ การหยุดทำงานของ ABI ใดๆ จะเป็นข้อผิดพลาดของบิลด์ ดังนั้นแพตช์สำหรับเวอร์ชัน Android ต้องไม่เปลี่ยนแปลง ABI สำหรับไลบรารี VNDK