การออกแบบสแนปชอต VNDK

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

การออกแบบสแน็ปช็อต VNDK มีวิธีการ สร้างสแน็ปช็อต VNDK ล่วงหน้า จากอิมเมจระบบปัจจุบัน และ ติดตั้ง libs ที่สร้างไว้ล่วงหน้าเหล่านั้น ลงในพาร์ติชันระบบของ Android เวอร์ชันใหม่กว่า

เกี่ยวกับห้องสมุด VNDK

HIDL-HALs ซึ่งเปิดตัวใน 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 เวอร์ชันใหม่ เนื่องจากคุณลักษณะที่เสถียรของ ABI ของ LL-NDK สแน็ปช็อต VNDK จึงไม่จำเป็นต้องรวมไลบรารี LL-NDK สำหรับอิมเมจของผู้จำหน่ายเก่า

เกี่ยวกับสแน็ปช็อต VNDK

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

เริ่มตั้งแต่ Android 9 เป็นต้นไป Android เวอร์ชันใหม่จะรวมสแนปช็อตของไดเร็กทอรี VNDK-core และ VNDK-SP อย่างน้อยหนึ่งรายการสำหรับเวอร์ชันเก่าในซอร์สโค้ด Android ณ เวลาสร้าง สแน็ปช็อตที่จำเป็นจะถูกติดตั้งใน /system/lib[64]/vndk-${VER} และ /system/lib[64]/vndk-sp-${VER} (ไดเร็กทอรีที่ผู้จำหน่ายสามารถใช้ได้ partition) โดยที่ ${VER} คือตัวแปรสตริงที่แสดงถึงชื่อเวอร์ชันของสแน็ปช็อต VNDK

เนื่องจากไลบรารีสแน็ปช็อต VNDK อาจแตกต่างกันในแต่ละเวอร์ชันของ VNDK สแน็ปช็อต VNDK จึงรวมการกำหนดค่าเนมสเปซตัวเชื่อมโยง ซึ่งติดตั้งเป็น etc/ld.config.${VER}.txt , /etc/llndk.libraries.${VER}.txt และ /etc/vndksp.libraries.${VER}.txt

ตัวอย่าง: การอัพเกรดระบบและอิมเมจของผู้ขาย

ไม่จำเป็นต้องมีสแนปช็อต สร้างโดยไม่มีการกำหนดค่าเพิ่มเติมสำหรับสแน็ปช็อต VNDK

ตัวอย่าง: การอัพเกรดอิมเมจระบบเท่านั้น

ต้องมีสแน็ปช็อต VNDK และไฟล์การกำหนดค่าเนมสเปซตัวเชื่อมโยงสำหรับอิมเมจของผู้จำหน่ายในอิมเมจระบบ ไฟล์การกำหนดค่าเนมสเปซตัวเชื่อมโยงได้รับการกำหนดค่าโดยอัตโนมัติเพื่อค้นหาไลบรารี 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 รวมถึงไฟล์การกำหนดค่าเนมสเปซของลิงก์เกอร์ เมื่อคุณระบุรายการเวอร์ชันสแน็ปช็อต VNDK ที่จะติดตั้ง ณ เวลาสร้าง อิมเมจระบบจะติดตั้งไลบรารีสแน็ปช็อต VNDK ไปที่ /system/lib[64]/vndk-${VER} และ /system/lib[64]/vndk-sp-${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, … } รวมถึงการขึ้นต่อกันและไฟล์คอนฟิกูเรชันเนมสเปซ หากตั้งค่า BOARD_VNDK_VERSION := current ไลบรารีเหล่านี้จะถูกสร้างขึ้นด้วยคำสั่ง make

เนื่องจากบิลด์นี้ไม่ได้ติดตั้งไลบรารี VNDK จากสแน็ปช็อต ไลบรารี VNDK ที่ติดตั้งจึงไม่เสถียรของ ABI อย่างไรก็ตาม เมื่อมีการเปิดตัวเวอร์ชัน Android ABI สำหรับเวอร์ชัน VNDK ปัจจุบันจะได้รับการแก้ไข ณ จุดนี้ การแตกหักของ ABI ใดๆ ถือเป็นข้อผิดพลาดของบิลด์ ดังนั้นแพตช์สำหรับเวอร์ชัน Android จะต้องไม่เปลี่ยน ABI สำหรับไลบรารี VNDK