การสนับสนุนระบบบิลด์ 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 คือแบนหรือ unflattened และสามารถใช้ได้จากเส้นทางที่ยอมรับ /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 ขึ้นอยู่กับที่ไม่ 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:
    *;
};

ขึ้นอยู่กับไฟล์สัญลักษณ์สร้างระบบจะสร้างต้นขั้วที่ใช้ร่วมกันห้องสมุดสำหรับโมดูลผู้ขายซึ่งเชื่อมโยงกับห้องสมุดเหล่านี้เมื่อ 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 ทั้งสองสายพันธุ์ (หลักและผู้ขาย) อาจจะสร้างขึ้น ตัวแปรหลักควรถือเป็นโมดูลเฟรมเวิร์ก และตัวแปรของผู้ขายควรถือเป็นโมดูลของผู้ขาย หากโมดูลเฟรมเวิร์กบางโมดูลขึ้นอยู่กับโมดูลนี้ ตัวแปรหลักจะถูกสร้างขึ้น หากโมดูลของผู้จัดจำหน่ายบางส่วนขึ้นอยู่กับโมดูลนี้ ตัวแปรของผู้จัดจำหน่ายจะถูกสร้างขึ้น ระบบบิลด์บังคับใช้การตรวจสอบการขึ้นต่อกันต่อไปนี้:

  • ตัวแปรหลักเป็นแบบเฟรมเวิร์กเท่านั้นและไม่สามารถเข้าถึงโมดูลผู้ขายได้
  • ตัวแปรของผู้จำหน่ายไม่สามารถเข้าถึงโมดูลเฟรมเวิร์กได้เสมอ
  • อ้างอิงทั้งหมดของผู้ขายที่แตกต่างกันซึ่งมีการระบุไว้ใน 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 อย่างเดียว ห้องสมุดสาธารณะมีการติดตั้งเข้า /vendor/lib[64]
true ไม่ถูกต้อง (ข้อผิดพลาดรูปร่าง)
true false สายพันธุ์ที่ผู้ขายมี VNDK ไลบรารีที่ใช้ร่วมกันได้รับการติดตั้งใน VNDK APEX
true สายพันธุ์ที่ผู้ขายมี VNDK-SP ไลบรารีที่ใช้ร่วมกันได้รับการติดตั้งใน VNDK APEX

false

false

false

ไม่มีผู้จำหน่ายรุ่นต่างๆ โมดูลนี้จะ FWK อย่างเดียว

true ไม่ถูกต้อง (ข้อผิดพลาดรูปร่าง)
true false สายพันธุ์ที่ผู้ขายมี VNDK เอกชน ไลบรารีที่ใช้ร่วมกันได้รับการติดตั้งใน VNDK APEX โมดูลเหล่านี้ต้องไม่ใช้โดยตรงโดยโมดูลผู้ขาย
true สายพันธุ์ที่ผู้ขายมี VNDK-SP เอกชน ไลบรารีที่ใช้ร่วมกันได้รับการติดตั้งใน VNDK APEX โมดูลเหล่านี้ต้องไม่ใช้โดยตรงโดยโมดูลผู้ขาย

นามสกุล VNDK

ส่วนขยาย VNDK คือไลบรารีที่ใช้ร่วมกันของ VNDK พร้อม API เพิ่มเติม ส่วนต่อขยายที่มีการติดตั้งการ /vendor/lib[64]/vndk[-sp] (ไม่มีรุ่นต่อท้าย) และแทนที่เดิมที่ใช้ร่วมกัน VNDK ห้องสมุดที่รันไทม์

การกำหนดส่วนขยาย VNDK

ใน Android 9 และสูงกว่า Android.bp natively สนับสนุนส่วนขยาย 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_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

ตามสองไฟล์นี้ ระบบบิลด์จะสร้างไลบรารีที่แบ่งใช้ด้วยสัญลักษณ์ที่เอ็กซ์พอร์ตดังต่อไปนี้:

เส้นทางการติดตั้ง สัญลักษณ์ที่ส่งออก
/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 ถูกสร้างขึ้นสำหรับการขยาย VNDK 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 ยาม อย่างไรก็ตาม ตรวจสอบให้แน่ใจว่าผู้ใช้ส่วนขยาย VNDK ทั้งหมดเพิ่มแฟล็ก define คุณอาจกำหนด 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 ระบุ executables, ห้องสมุดสาธารณะหรือแพคเกจที่ควรจะติดตั้งในอุปกรณ์ การพึ่งพาสกรรมกริยาของโมดูลที่ระบุได้รับการติดตั้งโดยปริยายในอุปกรณ์เช่นกัน

หาก 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