เปิดใช้ VNDK

ชุดพัฒนาซอฟต์แวร์ (SDK) ดั้งเดิมของผู้ให้บริการ (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"
        }
        ...
    }

เมื่อมีการทำเครื่องหมายไลบรารีเป็น vendor_available:true ระบบจะสร้างไลบรารี 2 ครั้งดังนี้

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

ไลบรารีเวอร์ชันของผู้ให้บริการสร้างขึ้นด้วย -D__ANDROID_VNDK__ โดยจะปิดใช้คอมโพเนนต์ของระบบแบบส่วนตัวที่อาจมีการเปลี่ยนแปลงอย่างมากใน Android เวอร์ชันอนาคตด้วย Flag นี้ นอกจากนี้ ไลบรารีต่างๆ จะส่งออก ชุดส่วนหัวที่แตกต่างกัน (เช่น 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 มีการอ้างอิงคอมโพเนนต์ vendor คอมโพเนนต์ vendor จะต้องเปลี่ยนเป็นคอมโพเนนต์ core หรือต้องนำการอ้างอิงออกด้วยวิธีอื่น (เช่น นำการอ้างอิงออกหรือย้ายการอ้างอิงไปยังคอมโพเนนต์ vendor)

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

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

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

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

  • นำการอ้างอิงถึง private/android_filesystem_config.hออกโดยแทนที่มาโคร private/android_filesystem_config.h ทั้งหมดด้วยการเรียก getgrnam/ getpwnam หากเป็นไปได้AID_* เช่น
    • (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