เปิดใช้ 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 library จะใช้โดยรูปภาพผู้ให้บริการในรูปภาพระบบ
    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)
  • 1 ครั้งสำหรับผู้ให้บริการ (และติดตั้งลงใน /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 หรือสร้างคอมโพเนนต์ด้วย BoardConfig.mk โดยตรง (เช่น m -j BOARD_VNDK_VERSION=current MY-LIB)

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

จัดการ Dependency

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

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

นอกจากนี้ หากคอมโพเนนต์ core มีการอ้างอิงคอมโพเนนต์ vendor คุณต้องเปลี่ยนคอมโพเนนต์ vendor เป็นคอมโพเนนต์ core หรือนําการอ้างอิงออกด้วยวิธีอื่น (เช่น นําการอ้างอิงออกหรือย้ายการอ้างอิงไปยังคอมโพเนนต์ 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