VNDK ต้องการการเปลี่ยนแปลงโค้ดเบสหลายประการเพื่อแยกข้อกังวลระหว่างผู้จำหน่ายและระบบ ใช้คำแนะนำต่อไปนี้เพื่อเปิดใช้งาน VNDK ในฐานรหัสของผู้จำหน่าย/OEM
สร้างไลบรารีระบบ
ระบบบิลด์ประกอบด้วยอ็อบเจ็กต์หลายประเภท รวมถึงไลบรารี (แบบแบ่งใช้ สแตติก หรือส่วนหัว) และไบนารี
- ไลบรารี
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
มันจะถูกสร้างขึ้นสองครั้ง:
- หนึ่งครั้งสำหรับแพลตฟอร์ม (และติดตั้งลงใน
/system/lib
) - หนึ่งครั้งสำหรับผู้จำหน่าย (และติดตั้งลงใน
/vendor/lib
หรือ VNDK APEX)
libs เวอร์ชันผู้ขายถูกสร้างขึ้นด้วย -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
แล้ว ระบบบิลด์จะบังคับใช้การขึ้นต่อกันและข้อกำหนดส่วนหัวต่อไปนี้
การจัดการการพึ่งพา
วัตถุ vendor
ที่ขึ้นอยู่กับองค์ประกอบ core
ที่ไม่มีอยู่ใน vndk
หรือเป็นวัตถุ vendor
ต้องได้รับการแก้ไขโดยใช้หนึ่งในตัวเลือกต่อไปนี้:
- การพึ่งพาสามารถลบออกได้
- หาก
vendor
เป็นเจ้าของส่วนประกอบcore
ก็สามารถทำเครื่องหมายเป็นvendor_available
หรือvendor
ได้ - การเปลี่ยนแปลงที่ทำให้วัตถุหลักเป็นส่วนหนึ่งของ
vndk
อาจถูกอัปสตรีมไปยัง Google
นอกจากนี้ หากส่วนประกอบ core
มีการพึ่งพาส่วนประกอบของ vendor
ส่วนประกอบ vendor
จะต้องถูกทำให้เป็นส่วนประกอบ core
หรือ การขึ้นต่อกันจะต้องถูกลบออกด้วยวิธีอื่น (ตัวอย่างเช่น โดยการเอาการขึ้นต่อกันออก หรือโดยการย้ายการขึ้นต่อกันไปยังส่วนประกอบ vendor
).
การจัดการส่วนหัว
ต้องลบการพึ่งพาส่วนหัวส่วนกลางออกเพื่อให้ระบบ build ทราบว่าจะสร้างส่วนหัวโดยมีหรือไม่มี -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