เปิดใช้ VNDK

Vendor Native Development Kit (VNDK) ต้องมีการเปลี่ยนแปลงหลายอย่างกับ Codebase เพื่อแยก ข้อกังวลระหว่างผู้ให้บริการและระบบ ใช้คำแนะนำต่อไปนี้เพื่อเปิดใช้ VNDK ในผู้ให้บริการ/OEM ฐานของโค้ด

สร้างไลบรารีระบบ

ระบบบิลด์มีออบเจ็กต์หลายประเภท รวมถึงไลบรารี (แชร์ คงที่ หรือส่วนหัว) และไบนารี

สร้างไลบรารีระบบ

รูปที่ 1 สร้างไลบรารีระบบ

  • อิมเมจระบบใช้ไลบรารี core ในอิมเมจของระบบ เหล่านี้ vendor, vendor_available ใช้ไลบรารีไม่ได้ vndk หรือ vndk-sp ไลบรารี
    cc_library {
        name: "libThatIsCore",
        ...
    }
    
  • ไลบรารีใช้ไลบรารี vendor-only (หรือ proprietary) รูปภาพผู้ให้บริการ ในรูปภาพผู้ให้บริการ
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
    
  • อิมเมจผู้ให้บริการใช้ไลบรารี vendor_available รายการจากผู้ให้บริการ รูปภาพ (อาจมี core ที่ซ้ำกัน)
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
    
  • อิมเมจผู้ให้บริการใช้ไลบรารี vndk ในอิมเมจของระบบ
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
    
  • ไลบรารี vndk-sp รายการมีการใช้งานโดยอิมเมจผู้ให้บริการ และโดยอิมเมจของระบบ โดยอ้อม
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
    
  • ไลบรารี llndk รายการมีการใช้งานโดยทั้งอิมเมจระบบและอิมเมจของผู้ให้บริการ
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }
    

เมื่อทำเครื่องหมาย lib เป็น vendor_available:true ระบบจะถือว่ารูปนั้นสร้างขึ้น 2 ครั้ง:

  • ครั้งเดียวสำหรับแพลตฟอร์ม (จึงติดตั้งใน /system/lib)
  • ครั้งเดียวสำหรับผู้ให้บริการ (และจึงติดตั้งใน /vendor/lib หรือ VNDK APEX)

ไลบรารีเวอร์ชันของผู้ให้บริการสร้างขึ้นด้วย -D__ANDROID_VNDK__ คอมโพเนนต์ระบบส่วนตัวที่อาจมีการเปลี่ยนแปลงอย่างมากในเวอร์ชันต่อๆ ไปของ Android ถูกปิดใช้ด้วยการแจ้งว่าไม่เหมาะสมนี้ นอกจากนี้ ไลบรารีต่างๆ ยังส่งออก ชุดส่วนหัวต่างๆ (เช่น liblog) ตัวเลือกเฉพาะสำหรับ สามารถระบุรูปแบบผู้ให้บริการของเป้าหมายในไฟล์ Android.bp ได้ ใน:

target: { vendor: { … } }

เปิดใช้ VNDK สำหรับฐานของโค้ด

วิธีเปิดใช้ VNDK สำหรับฐานของโค้ด

  1. กําหนดการมีสิทธิ์โดยคํานวณขนาดที่จําเป็นของ พาร์ติชัน vendor.img และ system.img
  2. เปิดใช้ BOARD_VNDK_VERSION=current คุณสามารถเพิ่ม BoardConfig.mk หรือสร้างคอมโพเนนต์โดยใช้ URL ดังกล่าวโดยตรง (เช่น m -j BOARD_VNDK_VERSION=current MY-LIB)

หลังจากเปิดใช้ BOARD_VNDK_VERSION=current ระบบบิลด์ บังคับใช้ข้อกำหนดด้านทรัพยากร Dependency และส่วนหัวต่อไปนี้

จัดการทรัพยากร Dependency

ออบเจ็กต์ vendor ที่ขึ้นอยู่กับคอมโพเนนต์ core ที่ไม่มีอยู่ใน vndk หรือเป็นออบเจ็กต์ vendor ต้องแก้ไขปัญหาโดยใช้ตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้

  • นำทรัพยากร Dependency ออกได้
  • หาก vendor เป็นเจ้าของคอมโพเนนต์ core ก็จะสามารถ ทำเครื่องหมายเป็น vendor_available หรือ vendor
  • การเปลี่ยนแปลงที่ทำให้ออบเจ็กต์หลักของ vndk อาจจะเป็น เป็น Google

นอกจากนี้ หากคอมโพเนนต์ core มีทรัพยากร Dependency ใน คอมโพเนนต์ vendor ต้องสร้างคอมโพเนนต์ vendor ลงในคอมโพเนนต์ core หรือทรัพยากร Dependency ต้องเป็น ด้วยวิธีการอื่น (เช่น การนำทรัพยากร Dependency ออกหรือการย้ายข้อมูล ที่พึ่งพิงในคอมโพเนนต์ vendor)

จัดการส่วนหัว

ต้องนำการพึ่งพาส่วนหัวร่วมออกเพื่อให้ระบบของบิลด์ทราบ สร้างส่วนหัวโดยมีหรือไม่มี -D__ANDROID_VNDK__ ตัวอย่างเช่น ส่วนหัว libutils เช่น utils/StrongPointer.h สามารถ ยังคงเข้าถึงได้โดยใช้ไลบรารีส่วนหัว libutils_headers

ส่วนหัวบางรายการ (เช่น unistd.h) ไม่สามารถรวมแบบทางอ้อมได้อีกต่อไป แต่สามารถใส่ลงในเครื่องได้

สุดท้ายนี้ ส่วนสาธารณะของ private/android_filesystem_config.h ถูกย้ายไปที่ cutils/android_filesystem_config.h แล้ว เพื่อจัดการ ส่วนหัวเหล่านี้ โปรดดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้

  • นำการอ้างอิงกับ private/android_filesystem_config.h โดยแทนที่ทั้งหมด มาโคร AID_* รายการที่มี getgrnam/ getpwnam สายหากเป็นไปได้ ดังตัวอย่างต่อไปนี้
    • (uid_t)AID_WIFI เปลี่ยนเป็น getpwnam("wifi")->pw_uid
    • (gid_t)AID_SDCARD_R เปลี่ยนเป็น getgrnam("sdcard_r")->gr_gid
    โปรดดูรายละเอียดที่ private/android_filesystem_config.h
  • สําหรับ AIS แบบฮาร์ดโค้ด ให้ใส่ข้อมูลต่อไปนี้ cutils/android_filesystem_config.h