VNDK বিল্ড সিস্টেম সমর্থন

অ্যান্ড্রয়েড 8.1 এবং উচ্চতর, বিল্ড সিস্টেমে বিল্ট-ইন ভিএনডিকে সমর্থন রয়েছে। VNDK সমর্থন সক্রিয় করা হলে, বিল্ড সিস্টেম মডিউলগুলির মধ্যে নির্ভরতা পরীক্ষা করে, বিক্রেতা মডিউলগুলির জন্য একটি বিক্রেতা-নির্দিষ্ট বৈকল্পিক তৈরি করে এবং স্বয়ংক্রিয়ভাবে সেই মডিউলগুলিকে মনোনীত ডিরেক্টরিগুলিতে ইনস্টল করে।

ভিএনডিকে বিল্ড সমর্থন উদাহরণ

এই উদাহরণে, Android.bp মডিউল সংজ্ঞা libexample নামে একটি লাইব্রেরি সংজ্ঞায়িত করে। vendor_available প্রপার্টি নির্দেশ করে ফ্রেমওয়ার্ক মডিউল এবং ভেন্ডর মডিউল libexample এর উপর নির্ভর করতে পারে:

libexample vendor_available:true এবং vndk.enabled:true

চিত্র 1. সমর্থন সক্রিয়।

ফ্রেমওয়ার্ক এক্সিকিউটেবল /system/bin/foo এবং ভেন্ডর এক্সিকিউটেবল /vendor/bin/bar উভয়ই libexample এর উপর নির্ভর করে এবং তাদের shared_libs বৈশিষ্ট্যে libexample আছে।

যদি libexample উভয় ফ্রেমওয়ার্ক মডিউল এবং ভেন্ডর মডিউল দ্বারা ব্যবহৃত হয়, libexample এর দুটি রূপ তৈরি করা হয়। মূল ভেরিয়েন্ট ( libexample এর নামানুসারে) ফ্রেমওয়ার্ক মডিউল দ্বারা ব্যবহৃত হয় এবং ভেন্ডর ভেরিয়েন্ট ( libexample.vendor নামানুসারে) ভেন্ডর মডিউল ব্যবহার করে। দুটি ভেরিয়েন্ট বিভিন্ন ডিরেক্টরিতে ইনস্টল করা হয়েছে:

  • মূল ভেরিয়েন্টটি /system/lib[64]/libexample.so এ ইনস্টল করা হয়েছে।
  • ভেন্ডর ভেরিয়েন্ট VNDK APEX-এ ইনস্টল করা হয়েছে কারণ vndk.enabled true

আরো বিস্তারিত জানার জন্য, মডিউল সংজ্ঞা দেখুন।

বিল্ড সমর্থন কনফিগার করুন

একটি পণ্য ডিভাইসের জন্য সম্পূর্ণ বিল্ড সিস্টেম সমর্থন সক্ষম করতে, BoardConfig.mkBOARD_VNDK_VERSION যোগ করুন :

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 সাথে নির্ভরতাগুলি নির্দিষ্ট করতে হবে (স্পষ্টভাবে)।

ভিএনডিকে এপেক্স

অ্যান্ড্রয়েড 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} থেকে পাওয়া যায়।

ভিএনডিকে এপেক্স

চিত্র 2. VNDK APEX.

মডিউল সংজ্ঞা

BOARD_VNDK_VERSION এর সাথে Android তৈরি করতে, আপনাকে অবশ্যই 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 নেই।

নির্ভরতা চেক Android.bpheader_libs , static_libs , এবং shared_libs এবং Android.mkLOCAL_HEADER_LIBRARIES , LOCAL_STATIC_LIBRARIES এবং LOCAL_SHARED_LIBRARIES এ প্রযোজ্য।

এলএল-এনডিকে

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:
    *;
};

প্রতীক ফাইলের উপর ভিত্তি করে, বিল্ড সিস্টেম বিক্রেতা মডিউলগুলির জন্য একটি স্টাব শেয়ার্ড লাইব্রেরি তৈরি করে, যা BOARD_VNDK_VERSION সক্রিয় থাকলে এই লাইব্রেরির সাথে লিঙ্ক করে। স্টাব শেয়ার্ড লাইব্রেরিতে একটি প্রতীক অন্তর্ভুক্ত করা হয় শুধুমাত্র যদি এটি:

  • বিভাগটির শেষে _PRIVATE বা _PLATFORM দিয়ে সংজ্ঞায়িত করা হয়নি,
  • #platform-only ট্যাগ নেই, এবং
  • #introduce* ট্যাগ নেই বা ট্যাগ টার্গেটের সাথে মেলে না।

ভিএনডিকে

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
সমর্থন_একই_প্রক্রিয়া
বিক্রেতা বৈকল্পিক বিবরণ
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-Private । শেয়ার্ড লাইব্রেরি VNDK APEX-এ ইনস্টল করা আছে। এইগুলি সরাসরি বিক্রেতা মডিউল দ্বারা ব্যবহার করা উচিত নয়৷

VNDK এক্সটেনশন

VNDK এক্সটেনশন হল অতিরিক্ত API সহ VNDK শেয়ার করা লাইব্রেরি। এক্সটেনশনগুলি /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 এক্সটেনশন ব্যবহার করুন

যদি একটি বিক্রেতা মডিউল VNDK এক্সটেনশন দ্বারা সংজ্ঞায়িত অতিরিক্ত API-এর উপর নির্ভর করে, মডিউলটিকে অবশ্যই তার shared_libs সম্পত্তিতে VNDK এক্সটেনশনের নাম উল্লেখ করতে হবে:

// 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 )

শর্তাধীন কম্পাইলার পতাকা

অ্যান্ড্রয়েড বিল্ড সিস্টেম ডিফল্টরূপে ভেন্ডর ভেরিয়েন্ট এবং VNDK এক্সটেনশনের জন্য __ANDROID_VNDK__ সংজ্ঞায়িত করে। আপনি সি প্রিপ্রসেসর গার্ডের সাথে কোডটি রক্ষা করতে পারেন:

void all() { }

#if !defined(__ANDROID_VNDK__)
void framework_only() { }
#endif

#if defined(__ANDROID_VNDK__)
void vndk_only() { }
#endif

__ANDROID_VNDK__ ছাড়াও, Android.bp এ বিভিন্ন cflags বা cppflags নির্দিষ্ট করা হতে পারে। target.vendor এ নির্দিষ্ট করা cflags বা cppflags বিক্রেতা ভেরিয়েন্টের জন্য নির্দিষ্ট।

উদাহরণস্বরূপ, নিম্নলিখিত 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 চেকার VNDK ভেন্ডর ভেরিয়েন্টের ABI এবং VNDK এক্সটেনশনগুলিকে prebuilts/abi-dumps/vndk অধীনে রেফারেন্স ABI ডাম্পের সাথে তুলনা করে।

  • VNDK ভেন্ডর ভেরিয়েন্ট দ্বারা রপ্তানি করা প্রতীকগুলি (যেমন /apex/com.android.vndk.v${VER}/lib[64]/libexample.so ) অবশ্যই ABI ডাম্পে সংজ্ঞায়িত প্রতীকগুলির সাথে (এর সুপারসেট নয়) অভিন্ন হতে হবে৷
  • VNDK এক্সটেনশন দ্বারা রপ্তানি করা প্রতীকগুলি (যেমন /vendor/lib[64]/vndk/libexample.so ) অবশ্যই 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 ভাগ করা লাইব্রেরিতে নতুন ক্লাস বা নতুন ফাংশন যোগ করতে পারে। এই ঘোষণাগুলিকে স্বাধীন শিরোনামে রাখার এবং বিদ্যমান শিরোনামগুলি পরিবর্তন করা এড়াতে পরামর্শ দেওয়া হয়।

উদাহরণস্বরূপ, VNDK এক্সটেনশন libexample_ext এর জন্য একটি নতুন হেডার ফাইল include-ext/example/ext/feature_name.h তৈরি করা হয়েছে :

  • 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 । এটি নিশ্চিত করে 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 এক্সটেনশন ব্যবহারকারীরা সংজ্ঞায়িত ফ্ল্যাগগুলি যুক্ত করেছে৷ আপনি cflags এ ডিফাইন ফ্ল্যাগ যোগ করতে cc_defaults নির্ধারণ করতে পারেন এবং shared_libs সাথে শেয়ার্ড লাইব্রেরি লিঙ্ক করতে পারেন।

উদাহরণস্বরূপ, VNDK এক্সটেনশন libexample2_ext এ একটি নতুন সদস্য ফাংশন Example2::get_b() যোগ করতে, আপনাকে অবশ্যই বিদ্যমান হেডার ফাইলটি সংশোধন করতে হবে এবং একটি #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_

libexample2_ext_defaults নামের একটি cc_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 এর ব্যবহারকারীরা তাদের defaults সম্পত্তিতে libexample2_ext_defaults অন্তর্ভুক্ত করতে পারে:

cc_binary {
    name: "example2_user_executable",
    defaults: ["libexample2_ext_defaults"],
    vendor: true,
}

পণ্য প্যাকেজ

অ্যান্ড্রয়েড বিল্ড সিস্টেমে, ভেরিয়েবল 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 ইনস্টল করতে, PRODUCT_PACKAGESlibexample.vendor যোগ করুন:

PRODUCT_PACKAGES += libexample.vendor