ชุดพัฒนาซอฟต์แวร์แบบเนทีฟสำหรับผู้ให้บริการ (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 สำหรับฐานของโค้ด
- กำหนดสิทธิ์โดยคำนวณขนาดที่ต้องใช้ของพาร์ติชัน
vendor.imgและsystem.img - เปิดใช้
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