ชุดพัฒนา Native ของผู้ขาย (VNDK)

Vendor Native Development Kit (VNDK) เป็นชุดของไลบรารีเฉพาะสำหรับผู้ขายเพื่อปรับใช้ HAL ของตน เรือ VNDK ใน system.img และมีการเชื่อมโยงแบบไดนามิกรหัสผู้ขายที่รันไทม์

ทำไมต้อง VNDK?

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

การอัปเดตเฉพาะเฟรมเวิร์กรวมถึงความท้าทายต่อไปนี้:

  • การพึ่งพาระหว่างโมดูลกรอบและโมดูลผู้ขาย ก่อน Android 8.0 โมดูลจากทั้งสองฝ่ายสามารถเชื่อมโยงกับโมดูลจากอีกด้านหนึ่งได้ อย่างไรก็ตาม การขึ้นต่อกันจากโมดูลผู้ขายกำหนดข้อจำกัดที่ไม่ต้องการสำหรับการพัฒนาโมดูลเฟรมเวิร์ก
  • ส่วนขยายไปยังห้องสมุด AOSP Android 8.0 ขึ้นไปกำหนดให้อุปกรณ์ Android ทั้งหมดต้องผ่าน CTS เมื่อพาร์ติชันระบบถูกแทนที่ด้วย Generic System Image (GSI) มาตรฐาน อย่างไรก็ตาม เนื่องจากผู้จำหน่ายขยายไลบรารี AOSP เพื่อเพิ่มประสิทธิภาพหรือเพิ่มฟังก์ชันพิเศษสำหรับการใช้งาน HIDL การแฟลชพาร์ติชันระบบด้วย GSI มาตรฐานอาจทำให้การใช้งาน HIDL ของผู้ขายเสียหาย (สำหรับแนวทางในการป้องกันการแตกหักเช่นดู นามสกุล VNDK .)

เพื่อรับมือกับความท้าทายเหล่านี้ Android 8.0 เปิดตัวหลายเทคนิคเช่น VNDK (อธิบายในส่วนนี้) HIDL , hwbinder, อุปกรณ์ต้นไม้ซ้อนทับ และ sepolicy ซ้อนทับ

ทรัพยากร VNDK

ส่วนนี้ประกอบด้วยทรัพยากร VNDK ต่อไปนี้:

  • แนวคิด VNDK (ด้านล่าง) อธิบายกรอบห้องสมุดที่ใช้ร่วมกัน HALs กระบวนการเดียวกัน (SP-HALs) และ VNDK คำศัพท์
  • VNDK นามสกุล เปลี่ยนแปลงรายการจัดประเภทผู้ขายที่เฉพาะเจาะจงเป็นหมวดหมู่ ตัวอย่างเช่น ไลบรารีที่มีฟังก์ชันเพิ่มเติมซึ่งโมดูลผู้ขายพึ่งพาจะต้องถูกคัดลอกลงในพาร์ติชันของผู้จัดจำหน่าย แต่ห้ามการเปลี่ยนแปลงที่เข้ากันไม่ได้ของ ABI
  • สนับสนุนระบบ VNDK รูปร่าง อธิบายถึงการกำหนดค่าการสร้างระบบและไวยากรณ์นิยามโมดูลที่เกี่ยวข้องกับ VNDK
  • VNDK นิยามเครื่องมือ ช่วยแหล่งต้นไม้โยกย้ายคุณเป็น Android 8.0 และสูงกว่า
  • Linker Namespace ให้การควบคุมที่ละเอียดกว่าการเชื่อมโยงห้องสมุดที่ใช้ร่วมกัน
  • ไดเรกทอรีหลักเกณฑ์และ sepolicy กำหนดโครงสร้างไดเรกทอรีสำหรับอุปกรณ์ที่ใช้ Android 8.0 และสูงกว่ากฎ VNDK และ sepolicy เกี่ยวข้อง
  • VNDK ออกแบบ การนำเสนอแสดงให้เห็นถึงแนวคิด VDNK พื้นฐานที่ใช้ใน Android 8.0 และสูงกว่า

แนวคิด VNDK

ในอุดมคติของ Android 8.0 และโลกที่สูงกว่า กระบวนการของเฟรมเวิร์กจะไม่โหลดไลบรารีที่ใช้ร่วมกันของผู้ขาย กระบวนการของผู้ขายทั้งหมดจะโหลดเฉพาะไลบรารีที่ใช้ร่วมกันของผู้ขาย (และส่วนของเฟรมเวิร์กไลบรารีที่ใช้ร่วมกัน) และการสื่อสารระหว่างกระบวนการเฟรมเวิร์กและกระบวนการของผู้ขายถูกควบคุมโดย HIDL และฮาร์ดแวร์ เครื่องผูก

โลกดังกล่าวมีความเป็นไปได้ที่ API สาธารณะที่เสถียรจากไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กอาจไม่เพียงพอสำหรับนักพัฒนาโมดูลผู้ขาย (แม้ว่า API สามารถเปลี่ยนแปลงระหว่างรุ่น Android ได้) ซึ่งกำหนดให้กระบวนการของผู้จำหน่ายสามารถเข้าถึงบางส่วนของเฟรมเวิร์กไลบรารีที่ใช้ร่วมกันได้ นอกจากนี้ เนื่องจากข้อกำหนดด้านประสิทธิภาพอาจนำไปสู่การประนีประนอม HAL ที่มีความสำคัญต่อเวลาตอบสนองบางอย่างจึงต้องได้รับการปฏิบัติแตกต่างออกไป

ส่วนต่อไปนี้ให้รายละเอียดวิธีที่ VNDK จัดการไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กสำหรับผู้ขายและ HAL กระบวนการเดียวกัน (SP-HAL)

กรอบงานไลบรารีที่ใช้ร่วมกันสำหรับผู้จำหน่าย

ส่วนนี้อธิบายเกณฑ์สำหรับการจัดประเภทไลบรารีที่ใช้ร่วมกันที่กระบวนการของผู้จัดจำหน่ายสามารถเข้าถึงได้ มีสองวิธีในการสนับสนุนโมดูลผู้ขายใน Android หลายรุ่น:

  1. รักษาเสถียรภาพของ ABIs / APIs ของกรอบที่ใช้ร่วมกันห้องสมุด โมดูลเฟรมเวิร์กใหม่และโมดูลผู้ขายเก่าสามารถใช้ไลบรารีที่ใช้ร่วมกันเดียวกันเพื่อลดพื้นที่หน่วยความจำและขนาดหน่วยเก็บข้อมูล ไลบรารีที่ใช้ร่วมกันที่ไม่ซ้ำกันยังช่วยหลีกเลี่ยงปัญหาการโหลดซ้ำหลายครั้งอีกด้วย อย่างไรก็ตาม ต้นทุนในการพัฒนาเพื่อรักษา ABI/API ให้เสถียรนั้นสูง และทำให้ ABI/APIs เสถียรทั้งหมดที่ส่งออกโดยไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กทุกอันนั้นไม่สมเหตุสมผล
  2. คัดลอกกรอบที่ใช้ร่วมกันห้องสมุดเก่า มาพร้อมกับข้อจำกัดที่แข็งแกร่งสำหรับช่องสัญญาณด้านข้าง ซึ่งกำหนดเป็นกลไกทั้งหมดในการสื่อสารระหว่างโมดูลเฟรมเวิร์กและโมดูลผู้ขาย ซึ่งรวมถึง (แต่ไม่จำกัดเพียง) ตัวประสาน ซ็อกเก็ต ไพพ์ หน่วยความจำที่ใช้ร่วมกัน ไฟล์ที่ใช้ร่วมกัน และคุณสมบัติของระบบ ต้องไม่มีการสื่อสารเว้นแต่โปรโตคอลการสื่อสารจะถูกระงับและเสถียร (เช่น HIDL ผ่าน hwbinder) การโหลดไลบรารีที่แบ่งใช้สองครั้งอาจทำให้เกิดปัญหาได้เช่นกัน ตัวอย่างเช่น ถ้าวัตถุที่สร้างโดยไลบรารีใหม่ถูกส่งผ่านไปยังฟังก์ชันจากไลบรารีเก่า ข้อผิดพลาดอาจเกิดขึ้นเนื่องจากไลบรารีเหล่านี้อาจตีความอ็อบเจ็กต์ต่างกัน

มีการใช้วิธีการที่แตกต่างกันขึ้นอยู่กับลักษณะของไลบรารีที่แบ่งใช้ ด้วยเหตุนี้ ไลบรารีที่แบ่งใช้ของเฟรมเวิร์กถูกจัดประเภทเป็นสามหมวดหมู่ย่อย:

  • LL-NDK ห้องสมุดมีห้องสมุดที่ใช้ร่วมกันกรอบที่เป็นที่รู้จักที่จะมีเสถียรภาพ นักพัฒนาของพวกเขามุ่งมั่นที่จะรักษาความเสถียรของ API/ABI
    • LL-NDK รวมถึงห้องสมุดต่อไปนี้: libEGL.so , libGLESv1_CM.so , libGLESv2.so , libGLESv3.so , libandroid_net.so , libc.so , libdl.so , liblog.so , libm.so , libnativewindow.so , libneuralnetworks.so , libsync.so , libvndksupport.so และ libvulkan.so ,
  • มีสิทธิ์ VNDK ห้องสมุด (VNDK) เป็นกรอบห้องสมุดที่ใช้ร่วมกันที่มีความปลอดภัยที่จะคัดลอกครั้งที่สอง กรอบโมดูลและโมดูลผู้ขายสามารถเชื่อมโยงกับสำเนาของตัวเอง ไลบรารีที่ใช้ร่วมกันของเฟรมเวิร์กสามารถกลายเป็นไลบรารี VNDK ที่มีสิทธิ์ได้ก็ต่อเมื่อตรงตามเกณฑ์ต่อไปนี้:
    • ไม่ส่ง/รับ IPC ไปยัง/จากเฟรมเวิร์ก
    • ไม่เกี่ยวข้องกับเครื่องเสมือน ART
    • ไม่อ่าน/เขียนไฟล์/พาร์ติชั่นที่มีรูปแบบไฟล์ที่ไม่เสถียร
    • ไม่มีใบอนุญาตซอฟต์แวร์พิเศษซึ่งต้องมีการตรวจสอบทางกฎหมาย
    • เจ้าของรหัสไม่มีการคัดค้านการใช้งานของผู้ขาย
  • กรอบเท่านั้นห้องสมุด (FWK อย่างเดียว) จะกรอบห้องสมุดที่ใช้ร่วมกันที่ไม่ได้อยู่ในประเภทดังกล่าวข้างต้น ห้องสมุดเหล่านี้:
    • ถือเป็นกรอบรายละเอียดการดำเนินการภายใน
    • ต้องไม่สามารถเข้าถึงได้โดยโมดูลผู้ขาย
    • มี ABI/API ที่ไม่เสถียรและไม่มีการรับประกันความเข้ากันได้ของ API/ABI
    • ไม่ถูกคัดลอก

HAL กระบวนการเดียวกัน (SP-HAL)

เดียวกันกระบวนการ HAL (SP-HAL) เป็นชุดของ HAL ที่กำหนดไว้ดำเนินการเป็นผู้ให้บริการห้องสมุดที่ใช้ร่วมกันและโหลดลงในกระบวนการกรอบ SP-HAL ถูกแยกโดยเนมสเปซตัวเชื่อมโยง (ควบคุมไลบรารีและสัญลักษณ์ที่มองเห็นได้ในไลบรารีที่แบ่งใช้) SP-HALs ต้องขึ้นอยู่เฉพาะใน LL-NDK และ VNDK-SP

VNDK-SP คือชุดย่อยที่กำหนดไว้ล่วงหน้าของไลบรารี VNDK ที่มีสิทธิ์ ไลบรารี VNDK-SP ได้รับการตรวจสอบอย่างรอบคอบเพื่อให้แน่ใจว่าไลบรารี VNDK-SP ที่โหลดซ้ำในกระบวนการเฟรมเวิร์กจะไม่ทำให้เกิดปัญหา Google เป็นผู้กำหนดทั้ง SP-HAL และ VNDK-SP

ไลบรารีต่อไปนี้ได้รับการอนุมัติ SP-HALs:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

VNDK-SP ห้องสมุดระบุ vndk: { support_system_process: true } ในแฟ้ม Android.bp ของพวกเขา หาก vendor_available: false ที่ระบุไว้ยังแล้วห้องสมุดเหล่านี้จะเรียกว่า VNDK-SP เอกชนและพวกเขาจะมองไม่เห็น SP-HALS

ต่อไปนี้เป็นห้องสมุดกรอบเท่านั้นมีข้อยกเว้นอาร์เอส (FWK อย่างเดียวอาร์เอส):

  • libft2.so (RenderScript)
  • libmediandk.so (RenderScript)

คำศัพท์ VNDK

  • โมดูลหมายถึงทั้งที่ใช้ร่วมกันหรือห้องสมุด Executables
  • กระบวนการมีการดำเนินงานที่เกิดจากระบบการสั่งการ
  • กรอบ -qualified แง่อ้างถึงแนวคิดที่เกี่ยวข้องกับพาร์ทิชันระบบ
  • ผู้ขายแง่ -qualified อ้างถึงแนวคิดที่เกี่ยวข้องกับพาร์ทิชันของผู้ขาย

ตัวอย่างเช่น:

  • กรอบ Executables อ้างถึง executables ใน /system/bin หรือ /system/xbin
  • กรอบที่ใช้ร่วมกันห้องสมุดหมายถึงห้องสมุดที่ใช้ร่วมกันภายใต้ /system/lib[64]
  • กรอบโมดูลหมายถึงทั้งกรอบห้องสมุดที่ใช้ร่วมกันและกรอบ Executables
  • กระบวนการ Framework เป็นกระบวนการที่เกิดจากกรอบ Executables (เช่น /system/bin/app_process )
  • Executables ผู้ขายอ้างถึงใน executables /vendor/bin
  • ผู้ขายที่ใช้ร่วมกันห้องสมุดหมายถึงห้องสมุดสาธารณะภายใต้ /vendor/lib[64]
  • ผู้ขายโมดูลหมายถึงทั้งผู้ขายและผู้ขาย Executables ห้องสมุดที่ใช้ร่วมกัน
  • กระบวนการของผู้ขายเป็นกระบวนการที่เกิดจากผู้ขาย Executables (เช่น
  • /vendor/bin/android.hardware.camera.provider@2.4-service )

การกำหนดเวอร์ชัน VNDK

ใน Android 9 ไลบรารีที่แชร์ VNDK มีเวอร์ชัน:

  • ro.vndk.version คุณสมบัติระบบเพิ่มโดยอัตโนมัติไป /vendor/default.prop
  • VNDK ที่ใช้ร่วมกันห้องสมุดมีการติดตั้งเพื่อ /system/lib[64]/vndk-${ro.vndk.version}
  • VNDK-SP ที่ใช้ร่วมกันห้องสมุดมีการติดตั้งเพื่อ /system/lib[64]/vndk-sp-${ro.vndk.version}
  • แฟ้มการกำหนดค่าแบบไดนามิกลิงเกอร์มีการติดตั้ง /system/etc/ld.config.${ro.vndk.version}.txt

ค่าของ ro.vndk.version ถูกเลือกโดยขั้นตอนวิธีการดังต่อไปนี้:

  • หาก BOARD_VNDK_VERSION ไม่เท่ากับ current ใช้ BOARD_VNDK_VERSION
  • หาก BOARD_VNDK_VERSION เท่ากับ current :
    • หาก PLATFORM_VERSION_CODENAME เป็น REL ใช้ PLATFORM_SDK_VERSION (เช่น 28 )
    • มิฉะนั้นการใช้ PLATFORM_VERSION_CODENAME (เช่น P )

อัพเกรดอุปกรณ์

หากมีการปิดการใช้งาน VNDK บังคับใช้เวลาทำงานอุปกรณ์ 8.x Android โดยถูกสร้างขึ้นโดยไม่ต้อง BOARD_VNDK_VERSION ก็อาจเพิ่ม PRODUCT_USE_VNDK_OVERRIDE := false เพื่อ BoardConfig.mk ในระหว่างการอัพเกรดเป็น Android 9

หาก PRODUCT_USE_VNDK_OVERRIDE เป็น false ที่ ro.vndk.lite ทรัพย์สินจะถูกเพิ่มโดยอัตโนมัติเพื่อ /vendor/default.prop และความคุ้มค่าของมันจะเป็น true ดังนั้นลิงเกอร์แบบไดนามิกจะโหลดการกำหนดค่าตัวเชื่อมโยง namespace จาก /system/etc/ld.config.vndk_lite.txt ซึ่งแยกเฉพาะ SP-HAL และ VNDK-SP

ในการอัปเกรดระบบปฏิบัติการ Android 7.0 หรือลดอุปกรณ์ Android 9 เพิ่ม PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := false เพื่อ BoardConfig.mk

ชุดทดสอบผู้ขาย (VTS)

หุ่นยนต์ที่ 9 ผู้ขาย Test Suite (VTS) เอกสารไม่ว่างเปล่า ro.vndk.version คุณสมบัติ อุปกรณ์ทั้งสองเพิ่งเปิดตัวและอุปกรณ์การอัพเกรดจะต้องกำหนด ro.vndk.version บางกรณีทดสอบ VNDK (เช่น VtsVndkFilesTest และ VtsVndkDependencyTest ) พึ่งพา ro.vndk.version คุณสมบัติในการโหลดตรงกันที่มีสิทธิ์ห้องสมุด VNDK ข้อมูลชุด

หาก ro.product.first_api_level ทรัพย์สินมีค่ามากกว่า 27 ro.vndk.lite คุณสมบัติจะต้องไม่ถูกกำหนดไว้ VtsTreblePlatformVersionTest จะล้มเหลวถ้า ro.vndk.lite ถูกกำหนดไว้ในอุปกรณ์ Android 9 เพิ่งเปิดตัว

ประวัติเอกสาร

ส่วนนี้ติดตามการเปลี่ยนแปลงเอกสาร VNDK

Android 9 เปลี่ยนไป

  • เพิ่มส่วนการกำหนดเวอร์ชัน VNDK
  • เพิ่มส่วน VTS
  • มีการเปลี่ยนชื่อหมวดหมู่ VNDK บางประเภท:
    • LL-NDK-Indirect ถูกเปลี่ยนชื่อเป็น LL-NDK-Private
    • VNDK-ทางอ้อมถูกเปลี่ยนชื่อเป็น VNDK-Private
    • VNDK-SP-Indirect-Private ถูกเปลี่ยนชื่อเป็น VNDK-SP-Private
    • VNDK-SP-Indirect ถูกลบออก

การเปลี่ยนแปลงของ Android 8.1

  • รวมไลบรารี SP-NDK เข้ากับไลบรารี LL-NDK แล้ว
  • แทนที่ libui.so กับ libft2.so ในอาร์เอสส่วน namespace มันเป็นข้อผิดพลาดที่จะรวม libui.so
  • เพิ่ม libGLESv3.so และ libandroid_net.so ห้องสมุด LL-NDK
  • เพิ่ม libion.so ห้องสมุด VNDK-SP
  • นำ libstdc++.so จากห้องสมุด LL-NDK ใช้ libc++.so แทน บางรุ่น toolchains แบบสแตนด์อโลนอาจเพิ่ม -lstdc++ ธงลิงเกอร์เริ่มต้น เพื่อปิดการใช้ค่าเริ่มต้นให้เพิ่ม -nodefaultlibs -lc -lm -ldl จะ LDFLAGS
  • ย้าย libz.so จาก LL-NDK ห้องสมุด VNDK-SP ในการกำหนดค่าบาง libz.so อาจจะยังคงเป็น LL-NDK อย่างไรก็ตาม ไม่ควรมีความแตกต่างที่สังเกตได้