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