การสนับสนุนระบบบิลด์ VNDK

จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ

ใน Android 8.1 ขึ้นไป ระบบบิลด์มีการรองรับ VNDK ในตัว เมื่อเปิดใช้งานการสนับสนุน VNDK ระบบบิลด์จะตรวจสอบการขึ้นต่อกันระหว่างโมดูล สร้างตัวแปรเฉพาะผู้ขายสำหรับโมดูลผู้ขาย และติดตั้งโมดูลเหล่านั้นลงในไดเร็กทอรีที่กำหนดโดยอัตโนมัติ

ตัวอย่างการสนับสนุนบิลด์ VNDK

ในตัวอย่างนี้ นิยามโมดูล Android.bp กำหนดไลบรารีชื่อ libexample คุณสมบัติ vendor_available บ่งชี้ว่าโมดูลเฟรมเวิร์กและโมดูลผู้ขายอาจขึ้นอยู่กับ libexample :

libexample vendor_available:true และ vndk.enabled:true

รูปที่ 1 เปิดใช้งานการสนับสนุน VNDK

ทั้งเฟรมเวิร์กที่เรียกใช้งานได้ /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}

VNDK APEX

รูปที่ 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 ขึ้นอยู่กับโมดูล 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

false

false

false

ไม่มีผู้จำหน่ายรุ่นต่างๆ โมดูลนี้เป็น 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