ใน Android 8.1 ขึ้นไป ระบบบิลด์จะรองรับ VNDK ในตัว เมื่อเปิดใช้การรองรับ VNDK ระบบบิลด์จะตรวจสอบการขึ้นต่อกันระหว่างโมดูล สร้างตัวแปรเฉพาะของผู้ให้บริการสำหรับโมดูลของผู้ให้บริการ และติดตั้งโมดูลเหล่านั้นลงในไดเรกทอรีที่กำหนดโดยอัตโนมัติ
ตัวอย่างการรองรับการสร้าง VNDK
  ในตัวอย่างนี้ คำจำกัดความของโมดูล Android.bp จะกำหนดไลบรารีชื่อ libexample พร็อพเพอร์ตี้ vendor_available
  ระบุว่าโมดูลเฟรมเวิร์กและโมดูลของผู้ให้บริการอาจขึ้นอยู่กับ
  libexample
  
เปิดใช้การรองรับ รูปที่ 1 แล้ว
  ทั้งไฟล์ที่เรียกใช้งานได้ของเฟรมเวิร์ก /system/bin/foo และไฟล์ที่เรียกใช้งานได้ของผู้ให้บริการ /vendor/bin/bar ขึ้นอยู่กับ libexample และมี libexample ในพร็อพเพอร์ตี้ shared_libs
  หากทั้งโมดูลเฟรมเวิร์กและโมดูลของผู้ให้บริการใช้ libexample ระบบจะสร้าง libexample 2 รูปแบบ โมเดลหลัก
  (ตั้งชื่อตาม libexample) ใช้โดยโมดูลเฟรมเวิร์ก และโมเดลของผู้ให้บริการ (ตั้งชื่อตาม libexample.vendor) ใช้โดยโมดูลของผู้ให้บริการ
 ระบบจะติดตั้งตัวแปรทั้ง 2 ไว้ในไดเรกทอรีที่แตกต่างกัน ดังนี้
- ระบบจะติดตั้งตัวแปรหลักใน
  
/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/includeframeworks/native/includeframeworks/native/opengl/includehardware/libhardware/includehardware/libhardware_legacy/includehardware/ril/includelibnativehelper/includelibnativehelper/include_deprecatedsystem/core/includesystem/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} APEX ของ VNDK จะรวมหรือไม่รวม และพร้อมใช้งานจากเส้นทาง Canonical /apex/com.android.vndk.v${VER} ทั้งนี้ขึ้นอยู่กับการกำหนดค่าอุปกรณ์

รูปที่ 2 VNDK APEX
คำจำกัดความของโมดูล
  หากต้องการสร้าง 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ขึ้นอยู่กับโมดูลที่ไม่ใช่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 แต่ละรายการ cc_library จะมีพร็อพเพอร์ตี้ llndk ที่มีไฟล์สัญลักษณ์
cc_library { name: "libvndksupport", llndk: { 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 3 รายการ ได้แก่ vendor_available, vndk.enabled และ
  vndk.support_system_process
  หาก vendor_available หรือ vndk.enabled เป็น
  true ระบบอาจสร้างตัวแปร 2 รายการ (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ระบบจะติดตั้ง Vendor Variant ลงใน VNDK APEX(com.android.vndk.v${VER}) 
 - หาก 
 
ตารางด้านล่างสรุปวิธีที่ระบบบิลด์จัดการตัวแปรของผู้ให้บริการ
| vendor_available | vndk enabled  | 
  vndk support_system_process  | 
  คำอธิบายตัวแปรของผู้ให้บริการ | 
|---|---|---|---|
true | 
  false | 
  false | 
  รูปแบบของผู้ให้บริการเป็น VND เท่านั้น ระบบจะติดตั้งไลบรารีที่ใช้ร่วมกันใน /vendor/lib[64] | 
 
true | 
  ไม่ถูกต้อง (ข้อผิดพลาดในการสร้าง) | ||
true | 
  false | 
  รูปแบบของผู้ให้บริการคือ VNDK ระบบจะติดตั้งไลบรารีที่ใช้ร่วมกัน ใน VNDK APEX | |
true | 
  ส่วนตัวแปรของผู้ให้บริการคือ VNDK-SP ระบบจะติดตั้งไลบรารีที่ใช้ร่วมกันใน VNDK APEX | ||
  | 
  
  | 
  
  | 
  ไม่มีผลิตภัณฑ์ย่อยของผู้ขาย โมดูลนี้เป็น FWK-ONLY  | 
 
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)
การคอมไพล์แบบมีเงื่อนไข
ส่วนนี้จะอธิบายวิธีจัดการกับความแตกต่างเล็กๆ น้อยๆ (เช่น การเพิ่มหรือนำฟีเจอร์ออกจากตัวแปรใดตัวแปรหนึ่ง) ระหว่างไลบรารีที่ใช้ร่วมกัน 3 รายการของ 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__ แล้ว คุณยังระบุ cflags หรือ
  cppflags อื่นๆ ใน Android.bp ได้ด้วย 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ตามไฟล์ทั้ง 2 นี้ ระบบบิลด์จะสร้างไลบรารีที่ใช้ร่วมกัน โดยมีสัญลักษณ์ที่ส่งออกต่อไปนี้
| เส้นทางการติดตั้ง | สัญลักษณ์ที่ส่งออก | 
|---|---|
/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 | 
 
ข้อกำหนดเกี่ยวกับสัญลักษณ์ที่ส่งออก
  เครื่องมือตรวจสอบ ABI ของ VNDK
  จะเปรียบเทียบ ABI ของตัวแปรของผู้ให้บริการ VNDK และ
  ส่วนขยาย VNDK กับการดัมพ์ ABI อ้างอิงภายใต้
  prebuilts/abi-dumps/vndk
- สัญลักษณ์ที่ส่งออกจากตัวแปรผู้ให้บริการ VNDK (เช่น
  
/apex/com.android.vndk.v${VER}/lib[64]/libexample.so) ต้องเหมือนกับ (ไม่ใช่ซูเปอร์เซ็ตของ) สัญลักษณ์ที่กำหนดไว้ใน ABI dumps - สัญลักษณ์ที่ส่งออกจากส่วนขยาย VNDK (เช่น
  
/vendor/lib[64]/vndk/libexample.so) ต้องเป็นซูเปอร์เซ็ตของ สัญลักษณ์ที่กำหนดไว้ในการดัมพ์ ABI 
หากตัวแปรของผู้ให้บริการ VNDK หรือส่วนขยาย VNDK ไม่เป็นไปตาม ข้อกำหนดข้างต้น ตัวตรวจสอบ ABI ของ VNDK จะแสดงข้อผิดพลาดในการสร้างและหยุด การสร้าง
ยกเว้นไฟล์ต้นฉบับหรือไลบรารีที่แชร์จากตัวแปรของผู้ให้บริการ
  หากต้องการยกเว้นไฟล์ต้นฉบับจากตัวแปรของผู้ให้บริการ ให้เพิ่มไฟล์ลงในพร็อพเพอร์ตี้ 
  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 เนื่องจากพร็อพเพอร์ตี้ exclude_srcs ไม่รวม fwk.c ในทำนองเดียวกัน จะขึ้นอยู่กับเฉพาะไลบรารีที่แชร์
  libboth เนื่องจากพร็อพเพอร์ตี้ exclude_shared_libs
  ยกเว้น libfwk_only
ส่งออกส่วนหัวจากส่วนขยาย VNDK
ส่วนขยาย VNDK อาจเพิ่มคลาสใหม่หรือฟังก์ชันใหม่ลงในไลบรารีที่ใช้ร่วมกันของ VNDK เราขอแนะนำให้คุณเก็บประกาศเหล่านั้นไว้ในส่วนหัวอิสระ และหลีกเลี่ยงการเปลี่ยนส่วนหัวที่มีอยู่
  ตัวอย่างเช่น ระบบจะสร้างไฟล์ส่วนหัวใหม่
  include-ext/example/ext/feature_name.h สำหรับส่วนขยาย VNDK
  libexample_ext ดังนี้
- Android.bp
 - include-ext/example/ext/feature_name.h
 - include/example/example.h
 - src/example.c
 - src/ext/feature_name.c
 
  ใน Android.bp ต่อไปนี้ libexample จะส่งออก
  เฉพาะ include ในขณะที่ libexample_ext จะส่งออกทั้ง
  include และ include-ext ซึ่งจะช่วยให้ผู้ใช้
  libexample ไม่รวม
  feature_name.h โดยไม่ถูกต้อง
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การ์ด อย่างไรก็ตาม โปรดตรวจสอบว่าผู้ใช้ส่วนขยาย VNDK ทุกคนได้เพิ่มแฟล็กกำหนดแล้ว คุณอาจกำหนด
  cc_defaults เพื่อเพิ่มแฟล็กกำหนดให้กับ cflags และลิงก์
  ไลบรารีที่ใช้ร่วมกันกับ shared_libs
  ตัวอย่างเช่น หากต้องการเพิ่มฟังก์ชันสมาชิกใหม่ Example2::get_b() ไปยังส่วนขยาย VNDK libexample2_ext คุณต้องแก้ไขไฟล์ส่วนหัวที่มีอยู่และเพิ่มการป้องกัน #ifdef ดังนี้
#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