เปิดใช้ VNDK

ชุดพัฒนาซอฟต์แวร์แบบเนทีฟสำหรับผู้ให้บริการ (VNDK) ต้องมีการเปลี่ยนแปลงฐานของโค้ดหลายอย่างเพื่อแยกความกังวลระหว่างผู้ให้บริการและระบบ ใช้คำแนะนำต่อไปนี้เพื่อเปิดใช้ 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 ระบบจะสร้าง lib 2 ครั้ง ดังนี้

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

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

target: { vendor: { … } }

เปิดใช้ VNDK สำหรับโค้ดเบส

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

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

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

จัดการการอ้างอิง

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

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

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

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

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

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

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

  • นำทรัพยากร Dependency ไปยัง 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