ใน Android 8.1 ขึ้นไป ระบบบิลด์มีการรองรับ VNDK ในตัว เมื่อเปิดใช้งานการสนับสนุน VNDK ระบบบิลด์จะตรวจสอบการขึ้นต่อกันระหว่างโมดูล สร้างตัวแปรเฉพาะผู้ขายสำหรับโมดูลผู้ขาย และติดตั้งโมดูลเหล่านั้นลงในไดเร็กทอรีที่กำหนดโดยอัตโนมัติ
ตัวอย่างการสนับสนุนบิลด์ VNDK
ในตัวอย่างนี้ นิยามโมดูล Android.bp
กำหนดไลบรารีชื่อ libexample
คุณสมบัติ vendor_available
บ่งชี้ว่าโมดูลเฟรมเวิร์กและโมดูลผู้ขายอาจขึ้นอยู่กับ libexample
:
ทั้งเฟรมเวิร์กที่เรียกใช้งานได้ /system/bin/foo
และผู้จำหน่ายที่เรียกใช้งานได้ /vendor/bin/bar
ขึ้นอยู่กับ libexample
และมี libexample
ในคุณสมบัติ shared_libs
ถ้า libexample
ถูกใช้โดยทั้งโมดูลเฟรมเวิร์กและโมดูลผู้ขาย libexample
สองตัวแปรจะถูกสร้างขึ้น ตัวแปรหลัก (ตั้งชื่อตาม libexample
) ถูกใช้โดยโมดูลเฟรมเวิร์ก และตัวแปรของผู้ขาย (ตั้งชื่อตาม libexample.vendor
) ถูกใช้โดยโมดูลผู้ขาย ตัวแปรทั้งสองถูกติดตั้งในไดเร็กทอรีที่ต่างกัน:
- มีการติดตั้งตัวแปรหลักใน
/system/lib[64]/libexample.so
- ตัวแปรของผู้จัดจำหน่ายได้รับการติดตั้งใน VNDK APEX เนื่องจาก
vndk.enabled
เป็นtrue
สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ คำจำกัดความของโมดูล
การกำหนดค่าการสนับสนุนการสร้าง
หากต้องการเปิดใช้งานการสนับสนุนระบบบิลด์อย่างเต็มรูปแบบสำหรับอุปกรณ์ผลิตภัณฑ์ ให้เพิ่ม BOARD_VNDK_VERSION
ใน BoardConfig.mk
:
BOARD_VNDK_VERSION := current
การตั้งค่านี้มีผล ทั่วโลก : เมื่อกำหนดใน BoardConfig.mk
โมดูลทั้งหมดจะถูกตรวจสอบ เนื่องจากไม่มีกลไกในการขึ้นบัญชีดำหรือไวท์ลิสต์โมดูลที่ละเมิด คุณควรล้างการพึ่งพาที่ไม่จำเป็นทั้งหมดก่อนที่จะเพิ่ม BOARD_VNDK_VERSION
คุณสามารถทดสอบและคอมไพล์โมดูลโดยการตั้งค่า BOARD_VNDK_VERSION
ในตัวแปรสภาพแวดล้อมของคุณ:
$ BOARD_VNDK_VERSION=current m module_name.vendor
เมื่อเปิดใช้งาน BOARD_VNDK_VERSION
เส้นทางการค้นหาส่วนหัวส่วนกลางที่เป็นค่าเริ่มต้นหลายรายการจะ ถูกลบออก ซึ่งรวมถึง:
-
frameworks/av/include
-
frameworks/native/include
-
frameworks/native/opengl/include
-
hardware/libhardware/include
-
hardware/libhardware_legacy/include
-
hardware/ril/include
-
libnativehelper/include
-
libnativehelper/include_deprecated
-
system/core/include
-
system/media/audio/include
หากโมดูลขึ้นอยู่กับส่วนหัวจากไดเร็กทอรีเหล่านี้ คุณต้องระบุ (อย่างชัดเจน) การพึ่งพาด้วย header_libs
, static_libs
และ/หรือ shared_libs
VNDK APEX
ใน Android 10 และต่ำกว่า โมดูลที่มี vndk.enabled
ถูกติดตั้งใน /system/lib[64]/vndk[-sp]-${VER}
ใน Android 11 ขึ้นไป ไลบรารี VNDK จะได้รับการบรรจุในรูปแบบ APEX และชื่อของ VNDK APEX คือ com.android.vndk.v${VER}
ขึ้นอยู่กับการกำหนดค่าอุปกรณ์ VNDK APEX ถูก ทำให้แบน หรือไม่แบน และพร้อมใช้งานจากเส้นทางตามรูปแบบบัญญัติ /apex/com.android.vndk.v${VER}
คำจำกัดความของโมดูล
ในการสร้าง Android ด้วย BOARD_VNDK_VERSION
คุณต้องแก้ไขข้อกำหนดโมดูลใน Android.mk
หรือ Android.bp
ส่วนนี้อธิบายประเภทต่างๆ ของข้อกำหนดโมดูล คุณสมบัติโมดูลที่เกี่ยวข้องกับ VNDK ต่างๆ และการตรวจสอบการขึ้นต่อกันที่นำไปใช้ในระบบบิลด์
โมดูลผู้จำหน่าย
โมดูลผู้จำหน่ายเป็นไฟล์เรียกทำงานเฉพาะผู้จำหน่ายหรือไลบรารีที่แบ่งใช้ซึ่งต้องติดตั้งลงในพาร์ติชันของผู้จัดจำหน่าย ในไฟล์ Android.bp
โมดูลผู้ขายต้องตั้งค่าผู้ขายหรือทรัพย์สินที่เป็นกรรมสิทธิ์เป็น true
ในไฟล์ Android.mk
โมดูลผู้ขายต้องตั้งค่า LOCAL_VENDOR_MODULE
หรือ LOCAL_PROPRIETARY_MODULE
true
หากมีการกำหนด BOARD_VNDK_VERSION
จะไม่อนุญาตให้มีการพึ่งพาระหว่างโมดูลผู้ขายและโมดูลเฟรมเวิร์ก และปล่อยข้อผิดพลาดหาก:
- โมดูลที่ไม่มี
vendor:true
ขึ้นอยู่กับโมดูลที่มีvendor:true
หรือ - โมดูลที่มี
vendor:true
ขึ้นอยู่กับโมดูล non-llndk_library
ที่ไม่มีvendor:true
หรือvendor_available:true
การตรวจสอบการพึ่งพาใช้กับ header_libs
, static_libs
และ shared_libs
ใน Android.bp
และกับ LOCAL_HEADER_LIBRARIES
, LOCAL_STATIC_LIBRARIES
และ LOCAL_SHARED_LIBRARIES
ใน Android.mk
LL-NDK
ไลบรารีที่แบ่งใช้ LL-NDK เป็นไลบรารีที่ใช้ร่วมกันที่มี ABI ที่เสถียร ทั้งเฟรมเวิร์กและโมดูลผู้ขายใช้ร่วมกันและการใช้งานล่าสุด สำหรับแต่ละไลบรารีที่ใช้ร่วมกัน LL-NDK Android.bp
มีคำจำกัดความโมดูล llndk_library
:
llndk_library { name: "libvndksupport", symbol_file: "libvndksupport.map.txt", }
ข้อกำหนดโมดูลนี้ระบุชื่อโมดูลและไฟล์สัญลักษณ์ที่อธิบายสัญลักษณ์ที่โมดูลผู้ขายมองเห็นได้ ตัวอย่างเช่น:
LIBVNDKSUPPORT { global: android_load_sphal_library; # llndk android_unload_sphal_library; # llndk local: *; };
ตามไฟล์สัญลักษณ์ ระบบบิลด์จะสร้างไลบรารีที่ใช้ร่วมกันของ stub สำหรับโมดูลผู้ขาย ซึ่งเชื่อมโยงกับไลบรารีเหล่านี้เมื่อเปิดใช้งาน BOARD_VNDK_VERSION
สัญลักษณ์จะรวมอยู่ในไลบรารีที่ใช้ร่วมกันของ stub เฉพาะในกรณีที่:
- ไม่ได้กำหนดไว้ในส่วนที่ลงท้ายด้วย
_PRIVATE
หรือ_PLATFORM
- ไม่มีแท็ก
#platform-only
และ - ไม่มีแท็ก
#introduce*
หรือแท็กที่ตรงกับเป้าหมาย
VNDK
ในไฟล์ Android.bp
cc_library
, cc_library_static
, cc_library_shared
และ cc_library_headers
ข้อกำหนดโมดูลรองรับคุณสมบัติที่เกี่ยวข้องกับ VNDK สามรายการ: vendor_available
, vndk.enabled
และ vndk.support_system_process
หาก vendor_available
หรือ vndk.enabled
เป็น true
อาจมีการสร้างสองตัวแปร ( core และ vendor ) ตัวแปรหลักควรถือเป็นโมดูลเฟรมเวิร์ก และตัวแปรของผู้ขายควรถือเป็นโมดูลของผู้ขาย หากโมดูลเฟรมเวิร์กบางโมดูลขึ้นอยู่กับโมดูลนี้ ตัวแปรหลักจะถูกสร้างขึ้น หากโมดูลของผู้จัดจำหน่ายบางส่วนขึ้นอยู่กับโมดูลนี้ ตัวแปรของผู้จัดจำหน่ายจะถูกสร้างขึ้น ระบบบิลด์บังคับใช้การตรวจสอบการขึ้นต่อกันต่อไปนี้:
- ตัวแปรหลักเป็นแบบเฟรมเวิร์กเท่านั้นและไม่สามารถเข้าถึงโมดูลผู้ขายได้
- ตัวแปรของผู้จำหน่ายไม่สามารถเข้าถึงโมดูลเฟรมเวิร์กได้เสมอ
- การขึ้นต่อกันทั้งหมดของตัวแปรผู้ขาย ซึ่งระบุไว้ใน
header_libs
,static_libs
และ/หรือshared_libs
ต้องเป็นllndk_library
หรือโมดูลที่มีvendor_available
หรือvndk.enabled
- หาก
vendor_available
เป็นtrue
ตัวแปรของผู้ขายจะสามารถเข้าถึงได้จากโมดูลผู้ขายทั้งหมด - หาก
vendor_available
เป็นfalse
ตัวแปรของผู้จำหน่ายจะสามารถเข้าถึงได้เฉพาะกับโมดูล VNDK หรือ VNDK-SP อื่น ๆ เท่านั้น (เช่น โมดูลที่มีvendor:true
ไม่สามารถเชื่อมโยงvendor_available:false
โมดูลได้)
พาธการติดตั้งเริ่มต้นสำหรับ cc_library
หรือ cc_library_shared
ถูกกำหนดโดยกฎต่อไปนี้:
- มีการติดตั้งตัวแปรหลัก
/system/lib[64]
- เส้นทางการติดตั้งตัวแปรของผู้จำหน่ายอาจแตกต่างกันไป:
- หาก
vndk.enabled
เป็นfalse
ตัวแปรของผู้จำหน่ายจะถูกติดตั้งใน/vendor/lib[64]
- หาก
vndk.enabled
เป็นtrue
ตัวแปรของผู้จำหน่ายจะถูกติดตั้งใน VNDK APEX(com.android.vndk.v${VER}
)
- หาก
ตารางด้านล่างสรุปวิธีที่ระบบบิลด์จัดการกับตัวแปรของผู้จัดจำหน่าย:
vendor_available | vndk เปิดใช้งาน | vndk support_same_process | คำอธิบายตัวแปรของผู้จำหน่าย |
---|---|---|---|
true | false | false | ตัวแปรของผู้จัดจำหน่ายคือ VND-ONLY เท่านั้น ไลบรารีที่ใช้ร่วมกันถูกติดตั้งใน /vendor/lib[64] |
true | ไม่ถูกต้อง (ข้อผิดพลาดในการสร้าง) | ||
true | false | ตัวแปรของผู้จัดจำหน่ายคือ VNDK ไลบรารีที่ใช้ร่วมกันได้รับการติดตั้งใน VNDK APEX | |
true | ตัวแปรของผู้จัดจำหน่ายคือ VNDK-SP ไลบรารีที่ใช้ร่วมกันได้รับการติดตั้งใน VNDK APEX | ||
| | | ไม่มีผู้จำหน่ายรุ่นต่างๆ โมดูลนี้เป็น FWK เท่านั้น |
true | ไม่ถูกต้อง (ข้อผิดพลาดในการสร้าง) | ||
true | false | ตัวแปรของผู้จัดจำหน่ายคือ VNDK-Private ไลบรารีที่ใช้ร่วมกันได้รับการติดตั้งใน VNDK APEX โมดูลเหล่านี้ต้องไม่ใช้โดยตรงโดยโมดูลผู้ขาย | |
true | ตัวแปรของผู้จัดจำหน่ายคือ VNDK-SP-Private ไลบรารีที่ใช้ร่วมกันได้รับการติดตั้งใน VNDK APEX โมดูลเหล่านี้ต้องไม่ใช้โดยตรงโดยโมดูลผู้ขาย |
นามสกุล VNDK
ส่วนขยาย VNDK คือไลบรารีที่ใช้ร่วมกันของ VNDK พร้อม API เพิ่มเติม ส่วนขยายได้รับการติดตั้งใน /vendor/lib[64]/vndk[-sp]
(ไม่มีส่วนต่อท้ายเวอร์ชัน) และแทนที่ไลบรารีที่ใช้ร่วมกัน VNDK ดั้งเดิมที่รันไทม์
การกำหนดส่วนขยาย VNDK
ใน Android 9 ขึ้นไป Android.bp
รองรับส่วนขยาย VNDK ในการสร้างส่วนขยาย VNDK ให้กำหนดโมดูลอื่นด้วย vendor:true
และคุณสมบัติ extends
:
cc_library { name: "libvndk", vendor_available: true, vndk: { enabled: true, }, } cc_library { name: "libvndk_ext", vendor: true, vndk: { enabled: true, extends: "libvndk", }, }
โมดูลที่มี vendor:true
, vndk.enabled:true
และ extends
คุณสมบัติกำหนดส่วนขยาย VNDK:
- คุณสมบัติ
extends
ต้องระบุชื่อไลบรารีที่แบ่งใช้ VNDK ฐาน (หรือชื่อไลบรารีที่ใช้ร่วมกัน VNDK-SP) - ส่วนขยาย VNDK (หรือส่วนขยาย VNDK-SP) ได้รับการตั้งชื่อตามชื่อโมดูลฐานที่ขยายออกไป ตัวอย่างเช่น ไบนารีเอาต์พุตของ
libvndk_ext
คือlibvndk.so
แทนที่จะเป็นlibvndk_ext.so
- ส่วนขยาย VNDK ได้รับการติดตั้งใน
/vendor/lib[64]/vndk
- ส่วนขยาย VNDK-SP ได้รับการติดตั้งใน
/vendor/lib[64]/vndk-sp
- ไลบรารีที่แบ่งใช้พื้นฐานต้องมีทั้ง
vndk.enabled:true
และvendor_available:true
ส่วนขยาย VNDK-SP ต้องขยายจากไลบรารีที่ใช้ร่วมกัน VNDK-SP ( vndk.support_system_process
ต้องเท่ากัน):
cc_library { name: "libvndk_sp", vendor_available: true, vndk: { enabled: true, support_system_process: true, }, } cc_library { name: "libvndk_sp_ext", vendor: true, vndk: { enabled: true, extends: "libvndk_sp", support_system_process: true, }, }
ส่วนขยาย VNDK (หรือส่วนขยาย VNDK-SP) อาจขึ้นอยู่กับไลบรารีที่ใช้ร่วมกันของผู้จำหน่ายรายอื่น:
cc_library { name: "libvndk", vendor_available: true, vndk: { enabled: true, }, } cc_library { name: "libvndk_ext", vendor: true, vndk: { enabled: true, extends: "libvndk", }, shared_libs: [ "libvendor", ], } cc_library { name: "libvendor", vendor: true, }
การใช้ส่วนขยาย VNDK
หากโมดูลผู้ขายขึ้นอยู่กับ API เพิ่มเติมที่กำหนดโดยส่วนขยาย VNDK โมดูลต้องระบุชื่อของส่วนขยาย VNDK ในคุณสมบัติ shared_libs
:
// A vendor shared library example cc_library { name: "libvendor", vendor: true, shared_libs: [ "libvndk_ext", ], } // A vendor executable example cc_binary { name: "vendor-example", vendor: true, shared_libs: [ "libvndk_ext", ], }
หากโมดูลผู้ขายขึ้นอยู่กับส่วนขยาย VNDK ส่วนขยาย VNDK เหล่านั้นจะถูกติดตั้งไปที่ /vendor/lib[64]/vndk[-sp]
โดยอัตโนมัติ หากโมดูลไม่ขึ้นอยู่กับส่วนขยาย VNDK อีกต่อไป ให้เพิ่มขั้นตอนที่สะอาดใน CleanSpec.mk
เพื่อลบไลบรารีที่แบ่งใช้ ตัวอย่างเช่น:
$(call add-clean-step, rm -rf $(TARGET_OUT_VENDOR)/lib/libvndk.so)
การรวบรวมแบบมีเงื่อนไข
ส่วนนี้อธิบายวิธีจัดการกับ ความแตกต่าง ที่ละเอียดอ่อน (เช่น การเพิ่มหรือลบคุณลักษณะจากหนึ่งในตัวแปร) ระหว่างไลบรารีที่ใช้ร่วมกัน VNDK สามรายการต่อไปนี้:
- ตัวแปรหลัก (เช่น
/system/lib[64]/libexample.so
) - ตัวแปรของผู้จำหน่าย (เช่น
/apex/com.android.vndk.v${VER}/lib[64]/libexample.so
) - ส่วนขยาย VNDK (เช่น
/vendor/lib[64]/vndk[-sp]/libexample.so
)
แฟล็กคอมไพเลอร์แบบมีเงื่อนไข
ระบบบิลด์ของ Android กำหนด __ANDROID_VNDK__
สำหรับตัวแปรของผู้จำหน่ายและส่วนขยาย VNDK ตามค่าเริ่มต้น คุณสามารถปกป้องรหัสด้วยตัวป้องกันล่วงหน้า C:
void all() { } #if !defined(__ANDROID_VNDK__) void framework_only() { } #endif #if defined(__ANDROID_VNDK__) void vndk_only() { } #endif
นอกเหนือจาก __ANDROID_VNDK__
แล้ว Android.bp
อาจระบุ cflags
หรือ cppflags
ที่แตกต่างกัน cflags
หรือ cppflags
ที่ระบุใน target.vendor
เป็นตัวแปรเฉพาะของผู้จำหน่าย
ตัวอย่างเช่น Android.bp
ต่อไปนี้กำหนด libexample
และ libexample_ext
:
cc_library { name: "libexample", srcs: ["src/example.c"], vendor_available: true, vndk: { enabled: true, }, target: { vendor: { cflags: ["-DLIBEXAMPLE_ENABLE_VNDK=1"], }, }, } cc_library { name: "libexample_ext", srcs: ["src/example.c"], vendor: true, vndk: { enabled: true, extends: "libexample", }, cflags: [ "-DLIBEXAMPLE_ENABLE_VNDK=1", "-DLIBEXAMPLE_ENABLE_VNDK_EXT=1", ], }
และนี่คือรายการรหัสของ src/example.c
:
void all() { } #if !defined(LIBEXAMPLE_ENABLE_VNDK) void framework_only() { } #endif #if defined(LIBEXAMPLE_ENABLE_VNDK) void vndk() { } #endif #if defined(LIBEXAMPLE_ENABLE_VNDK_EXT) void vndk_ext() { } #endif
ตามสองไฟล์นี้ ระบบบิลด์จะสร้างไลบรารีที่แบ่งใช้ด้วยสัญลักษณ์ที่เอ็กซ์พอร์ตดังต่อไปนี้:
เส้นทางการติดตั้ง | สัญลักษณ์ที่ส่งออก |
---|---|
/system/lib[64]/libexample.so | all , framework_only |
/apex/com.android.vndk.v${VER}/lib[64]/libexample.so | all , vndk |
/vendor/lib[64]/vndk/libexample.so | all , vndk , vndk_ext |
ข้อกำหนดเกี่ยวกับสัญลักษณ์ที่ส่งออก
ตัวตรวจสอบ VNDK ABI เปรียบเทียบ ABI ของ ตัวแปรผู้ขาย VNDK และส่วนขยาย VNDK กับการถ่ายโอนข้อมูล ABI อ้างอิงภายใต้ prebuilts/abi-dumps/vndk
- สัญลักษณ์ที่ส่งออกโดยตัวแปรของ ผู้จำหน่าย VNDK (เช่น
/apex/com.android.vndk.v${VER}/lib[64]/libexample.so
) ต้องเหมือนกัน (ไม่ใช่ supersets ของ) สัญลักษณ์ที่กำหนดไว้ในการทิ้ง ABI - สัญลักษณ์ที่ส่งออกโดย ส่วนขยาย VNDK (เช่น
/vendor/lib[64]/vndk/libexample.so
) ต้องเป็น supersets ของสัญลักษณ์ที่กำหนดไว้ในการทิ้ง ABI
หาก ตัวแปรของผู้จำหน่าย VNDK หรือส่วนขยาย VNDK ไม่ปฏิบัติตามข้อกำหนดข้างต้น ตัวตรวจสอบ VNDK ABI จะปล่อยข้อผิดพลาดของบิลด์และหยุดการสร้าง
ไม่รวมไฟล์ต้นฉบับหรือไลบรารีที่ใช้ร่วมกันจากตัวแปรของผู้จำหน่าย
หากต้องการแยกไฟล์ต้นทางออกจากตัวแปรของผู้จัดจำหน่าย ให้เพิ่มไฟล์ดังกล่าวในคุณสมบัติ exclude_srcs
ในทำนองเดียวกัน เพื่อให้แน่ใจว่าไลบรารีที่แบ่งใช้ไม่ได้เชื่อมโยงกับตัวแปรของผู้จำหน่าย ให้เพิ่มไลบรารีเหล่านั้นไปยังคุณสมบัติ exclude_shared_libs
ตัวอย่างเช่น:
cc_library { name: "libexample_cond_exclude", srcs: ["fwk.c", "both.c"], shared_libs: ["libfwk_only", "libboth"], vendor_available: true, target: { vendor: { exclude_srcs: ["fwk.c"], exclude_shared_libs: ["libfwk_only"], }, }, }
ในตัวอย่างนี้ ตัวแปรหลักของ libexample_cond_exclude
รวมโค้ดจาก fwk.c
และ both.c
และขึ้นอยู่กับไลบรารีที่แบ่งใช้ libfwk_only
และ libboth
ตัวแปรผู้จำหน่ายของ libexample_cond_exclude
รวมเฉพาะโค้ดจาก both.c
เนื่องจาก fwk.c
ไม่รวม exclude_srcs
ในทำนองเดียวกัน ขึ้นอยู่กับไลบรารีที่แบ่งใช้ libboth
เนื่องจาก libfwk_only
ถูกแยก exclude_shared_libs
ส่งออกส่วนหัวจากส่วนขยาย VNDK
ส่วนขยาย VNDK อาจเพิ่มคลาสใหม่หรือฟังก์ชันใหม่ให้กับไลบรารีที่ใช้ร่วมกันของ VNDK ขอแนะนำให้เก็บการประกาศเหล่านั้นไว้ในส่วนหัวที่เป็นอิสระและหลีกเลี่ยงการเปลี่ยนส่วนหัวที่มีอยู่
ตัวอย่างเช่น ไฟล์ส่วนหัวใหม่ include-ext/example/ext/feature_name.h
ถูกสร้างขึ้นสำหรับส่วนขยาย libexample_ext
:
- Android.bp
- include-ext/example/ext/feature_name.h
- รวม/ตัวอย่าง/ตัวอย่าง.h
- src/example.c
- src/ext/feature_name.c
ใน Android.bp
ต่อไปนี้ การส่งออก libexample
จะ include
ไว้เท่านั้น ในขณะที่การส่งออก libexample_ext
ทั้งสองรายการ include
และ include-ext
เพื่อให้แน่ใจว่า feature_name.h
จะไม่ถูกรวมโดยผู้ใช้ libexample
อย่างไม่ถูกต้อง:
cc_library { name: "libexample", srcs: ["src/example.c"], export_include_dirs: ["include"], vendor_available: true, vndk: { enabled: true, }, } cc_library { name: "libexample_ext", srcs: [ "src/example.c", "src/ext/feature_name.c", ], export_include_dirs: [ "include", "include-ext", ], vendor: true, vndk: { enabled: true, extends: "libexample", }, }
หากไม่สามารถแยกส่วนขยายเป็นไฟล์ส่วนหัวอิสระ ทางเลือกอื่นคือเพิ่ม #ifdef
guards อย่างไรก็ตาม ตรวจสอบให้แน่ใจว่าผู้ใช้ส่วนขยาย VNDK ทั้งหมดเพิ่มแฟล็ก define คุณอาจกำหนด cc_defaults
เพื่อเพิ่มการกำหนดแฟล็กให้กับ cflags
และเชื่อมโยงไลบรารีที่แบ่งใช้ด้วย shared_libs
ตัวอย่างเช่น ในการเพิ่มฟังก์ชันสมาชิกใหม่ Example2::get_b()
ให้กับส่วนขยาย libexample2_ext
คุณต้องแก้ไขไฟล์ส่วนหัวที่มีอยู่และเพิ่ม #ifdef
guard:
#ifndef LIBEXAMPLE2_EXAMPLE_H_ #define LIBEXAMPLE2_EXAMPLE_H_ class Example2 { public: Example2(); void get_a(); #ifdef LIBEXAMPLE2_ENABLE_VNDK_EXT void get_b(); #endif private: void *impl_; }; #endif // LIBEXAMPLE2_EXAMPLE_H_
cc_defaults
ชื่อ libexample2_ext_defaults
ถูกกำหนดไว้สำหรับผู้ใช้ libexample2_ext
:
cc_library { name: "libexample2", srcs: ["src/example2.cpp"], export_include_dirs: ["include"], vendor_available: true, vndk: { enabled: true, }, } cc_library { name: "libexample2_ext", srcs: ["src/example2.cpp"], export_include_dirs: ["include"], vendor: true, vndk: { enabled: true, extends: "libexample2", }, cflags: [ "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1", ], } cc_defaults { name: "libexample2_ext_defaults", shared_libs: [ "libexample2_ext", ], cflags: [ "-DLIBEXAMPLE2_ENABLE_VNDK_EXT=1", ], }
ผู้ใช้ libexample2_ext
อาจรวม libexample2_ext_defaults
ไว้ในคุณสมบัติ defaults
:
cc_binary { name: "example2_user_executable", defaults: ["libexample2_ext_defaults"], vendor: true, }
แพ็คเกจสินค้า
ในระบบบิลด์ของ Android ตัวแปร PRODUCT_PACKAGES
จะระบุไฟล์เรียกทำงาน ไลบรารีที่ใช้ร่วมกัน หรือแพ็คเกจที่ควรติดตั้งลงในอุปกรณ์ การพึ่งพาสกรรมกริยาของโมดูลที่ระบุได้รับการติดตั้งโดยปริยายในอุปกรณ์เช่นกัน
หากเปิดใช้งาน BOARD_VNDK_VERSION
โมดูลที่มี vendor_available
หรือ vndk.enabled
จะได้รับการดูแลเป็นพิเศษ หากโมดูลเฟรมเวิร์กขึ้นอยู่กับโมดูลที่มี vendor_available
หรือ vndk.enabled
ตัวแปรหลักจะรวมอยู่ในชุดการติดตั้งทรานซิทีฟ หากโมดูลผู้ขายขึ้นอยู่กับโมดูลที่มี vendor_available
ตัวแปรของผู้ขายจะรวมอยู่ในชุดการติดตั้งแบบสกรรมกริยา อย่างไรก็ตาม ตัวแปรผู้จำหน่ายของโมดูลที่มี vndk.enabled
จะถูกติดตั้งไม่ว่าจะถูกใช้โดยโมดูลของผู้ขายหรือไม่ก็ตาม
เมื่อการพึ่งพานั้นมองไม่เห็นในระบบบิลด์ (เช่น ไลบรารีที่ใช้ร่วมกันที่อาจเปิดด้วย dlopen()
ในรันไทม์) คุณควรระบุชื่อโมดูลใน PRODUCT_PACKAGES
เพื่อติดตั้งโมดูลเหล่านั้นอย่างชัดเจน
หากโมดูลมี vendor_available
หรือ vndk.enabled
ชื่อโมดูลจะย่อมาจากตัวแปรหลัก หากต้องการระบุตัวแปรของผู้ขายอย่างชัดเจนใน PRODUCT_PACKAGES
ให้ต่อท้าย .vendor
กับชื่อโมดูล ตัวอย่างเช่น:
cc_library { name: "libexample", srcs: ["example.c"], vendor_available: true, }
ในตัวอย่างนี้ libexample
ย่อมาจาก /system/lib[64]/libexample.so
และ libexample.vendor
ย่อมาจาก /vendor/lib[64]/libexample.so
ในการติดตั้ง /vendor/lib[64]/libexample.so
ให้เพิ่ม libexample.vendor
ใน PRODUCT_PACKAGES
:
PRODUCT_PACKAGES += libexample.vendor