การออกแบบภาพรวมของ VNDK

อิมเมจระบบสามารถใช้ภาพรวม 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}

รูปที่ 1 อัปเกรดระบบเท่านั้น

ตัวอย่างเช่น อัปเกรดรูปภาพระบบ การเปลี่ยนแปลงรูปภาพเล็กน้อยของผู้ให้บริการ

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

สถาปัตยกรรมภาพรวม VNDK

หากต้องการให้ระบบภาพ Android 9 เข้ากันได้กับระบบภาพผู้ให้บริการ Android 8.1 คุณต้องระบุภาพนิ่ง VNDK ที่ตรงกับระบบภาพผู้ให้บริการ Android 8.1 กับระบบภาพ Android 9 ดังที่แสดงด้านล่าง

รูปที่ 2 สถาปัตยกรรมสแนปชอต VNDK

การออกแบบภาพรวม 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