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