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