VNDK সক্ষম করুন

ভেন্ডর নেটিভ ডেভেলপমেন্ট কিট (VNDK) ব্যবহারের জন্য ভেন্ডর এবং সিস্টেমের মধ্যে দায়িত্ব পৃথক করতে কোডবেসে বেশ কিছু পরিবর্তন প্রয়োজন হয়। একটি ভেন্ডর/ওইএম (OEM) কোডবেসে VNDK সক্রিয় করতে নিম্নলিখিত নির্দেশিকাটি ব্যবহার করুন।

সিস্টেম লাইব্রেরি তৈরি করুন

বিল্ড সিস্টেমে লাইব্রেরি (শেয়ার্ড, স্ট্যাটিক বা হেডার) এবং বাইনারিসহ বিভিন্ন ধরনের অবজেক্ট থাকে।

সিস্টেম লাইব্রেরি তৈরি করুন

চিত্র ১. বিল্ড সিস্টেম লাইব্রেরিসমূহ।

  • core লাইব্রেরিগুলো সিস্টেম ইমেজ দ্বারা, সিস্টেম ইমেজেই ব্যবহৃত হয়। এই লাইব্রেরিগুলো vendor , vendor_available , vndk , বা vndk-sp লাইব্রেরি দ্বারা ব্যবহার করা যায় না।
    cc_library {
        name: "libThatIsCore",
        ...
    }
  • vendor-only (বা proprietary ) লাইব্রেরিগুলো ভেন্ডর ইমেজেই ব্যবহৃত হয়।
    cc_library {
        name: "libThatIsVendorOnly",
        proprietary: true,
        # or: vendor: true, # (for things in AOSP)
        ...
    }
  • vendor_available লাইব্রেরিগুলো ভেন্ডর ইমেজে ব্যবহৃত হয় (এতে core এর ডুপ্লিকেট থাকতে পারে)।
    cc_library {
        name: "libThatIsVendorAvailable",
        vendor_available: true,
        ...
    }
  • সিস্টেম ইমেজে, ভেন্ডর ইমেজ দ্বারা vndk লাইব্রেরিগুলো ব্যবহৃত হয়।
    cc_library {
        name: "libThatIsVndk",
        vendor_available: true,
        vndk: {
            enabled: true,
        }
        ...
    }
  • vndk-sp লাইব্রেরিগুলো ভেন্ডর ইমেজ এবং পরোক্ষভাবে সিস্টেম ইমেজ দ্বারাও ব্যবহৃত হয়।
    cc_library {
        name: "libThatIsVndkSp",
        vendor_available: true,
        vndk: {
            enabled: true,
            support_system_process: true,
        }
        ...
    }
  • llndk লাইব্রেরিগুলো সিস্টেম এবং ভেন্ডর ইমেজ উভয় ক্ষেত্রেই ব্যবহৃত হয়।
    cc_library {
        name: "libThatIsLlndk",
        llndk: {
            symbol_file: "libthatisllndk.map.txt"
        }
        ...
    }

যখন কোনো লাইব্রেরিকে vendor_available:true হিসেবে চিহ্নিত করা হয়, তখন সেটি দুইবার বিল্ড করা হয়:

  • প্ল্যাটফর্মের জন্য একবার (এবং সেই কারণে /system/lib এ ইনস্টল করা হয়)
  • ভেন্ডরের জন্য একবার (এবং সেই কারণে /vendor/lib বা VNDK APEX-এ ইনস্টল করা হয়)

লাইব্রেরির ভেন্ডর সংস্করণগুলো -D__ANDROID_VNDK__ দিয়ে বিল্ড করা হয়। অ্যান্ড্রয়েডের ভবিষ্যৎ সংস্করণগুলোতে উল্লেখযোগ্যভাবে পরিবর্তিত হতে পারে এমন প্রাইভেট সিস্টেম কম্পোনেন্টগুলো এই ফ্ল্যাগ দিয়ে নিষ্ক্রিয় করা হয়। এছাড়াও, বিভিন্ন লাইব্রেরি ভিন্ন ভিন্ন হেডার সেট এক্সপোর্ট করে (যেমন liblog )। কোনো টার্গেটের ভেন্ডর ভ্যারিয়েন্টের জন্য নির্দিষ্ট অপশনগুলো একটি Android.bp ফাইলে উল্লেখ করা যেতে পারে:

target: { vendor: { … } }

একটি কোডবেসের জন্য VNDK সক্রিয় করুন

একটি কোডবেসের জন্য VNDK সক্রিয় করতে:

  1. vendor.img এবং system.img পার্টিশনগুলোর প্রয়োজনীয় আকার গণনা করে যোগ্যতা নির্ধারণ করুন।
  2. BOARD_VNDK_VERSION=current সক্রিয় করুন। আপনি এটি BoardConfig.mk এ যোগ করতে পারেন অথবা সরাসরি এটি দিয়ে কম্পোনেন্ট তৈরি করতে পারেন (উদাহরণস্বরূপ, m -j BOARD_VNDK_VERSION=current MY-LIB )।

BOARD_VNDK_VERSION=current সক্রিয় করার পর, বিল্ড সিস্টেম নিম্নলিখিত ডিপেন্ডেন্সি এবং হেডার আবশ্যকতাগুলো প্রয়োগ করে।

নির্ভরতা পরিচালনা করুন

যে vendor অবজেক্টটি এমন কোনো core কম্পোনেন্টের উপর নির্ভর করে যা vndk তে বা vendor অবজেক্ট হিসেবে বিদ্যমান নেই, সেটিকে অবশ্যই নিম্নলিখিত বিকল্পগুলির মধ্যে একটি ব্যবহার করে সমাধান করতে হবে:

  • নির্ভরতাটি দূর করা যেতে পারে।
  • যদি core উপাদানটি vendor মালিকানাধীন হয়, তবে এটিকে vendor_available বা vendor হিসেবে চিহ্নিত করা যেতে পারে।
  • কোর অবজেক্টকে vndk এর অংশ করার কোনো পরিবর্তন গুগলে আপস্ট্রিম করা হতে পারে।

এছাড়াও, যদি কোনো core কম্পোনেন্টের কোনো vendor কম্পোনেন্টের উপর নির্ভরতা থাকে, তবে vendor কম্পোনেন্টটিকে অবশ্যই একটি core কম্পোনেন্টে পরিণত করতে হবে অথবা অন্য কোনো উপায়ে নির্ভরতাটি দূর করতে হবে (উদাহরণস্বরূপ, নির্ভরতাটি অপসারণ করে বা নির্ভরতাটিকে একটি vendor কম্পোনেন্টে স্থানান্তর করে)।

হেডার পরিচালনা করুন

গ্লোবাল হেডার নির্ভরতাগুলো অবশ্যই অপসারণ করতে হবে, যাতে বিল্ড সিস্টেম বুঝতে পারে যে হেডারগুলো -D__ANDROID_VNDK__ সহ বা ছাড়া বিল্ড করা হবে কিনা। উদাহরণস্বরূপ, utils/StrongPointer.h এর মতো libutils হেডারগুলো এখনও libutils_headers হেডার লাইব্রেরি ব্যবহার করে অ্যাক্সেস করা যায়।

কিছু হেডার (যেমন unistd.h ) এখন আর ট্রানজিটিভলি অন্তর্ভুক্ত করা যায় না, কিন্তু লোকালি অন্তর্ভুক্ত করা যায়।

অবশেষে, private/android_filesystem_config.h এর পাবলিক অংশটি cutils/android_filesystem_config.h এ স্থানান্তর করা হয়েছে। এই হেডারগুলো পরিচালনা করতে, নিম্নলিখিতগুলির মধ্যে একটি করুন:

  • সম্ভব হলে, private/android_filesystem_config.h এর সমস্ত AID_* ম্যাক্রোকে getgrnam / getpwnam কল দিয়ে প্রতিস্থাপন করে এর উপর নির্ভরতা দূর করুন। উদাহরণস্বরূপ:
    • (uid_t)AID_WIFI হয়ে যায় getpwnam("wifi")->pw_uid
    • (gid_t)AID_SDCARD_R হয়ে যায় getgrnam("sdcard_r")->gr_gid
    বিস্তারিত জানতে private/android_filesystem_config.h দেখুন।
  • হার্ড-কোডেড AIS-এর জন্য, cutils/android_filesystem_config.h অন্তর্ভুক্ত করুন।