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"
        }
        ...
    }

কোনও lib-কে vendor_available:true হিসেবে চিহ্নিত করা হলে, এটি দু'বার তৈরি করা হয়:

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

libs-এর ভেন্ডর ভার্সন -D__ANDROID_VNDK__-এর সাথে তৈরি করা হয়। Android-এর ভবিষ্যতের ভার্সনে উল্লেখযোগ্যভাবে পরিবর্তিত হতে পারে এমন ব্যক্তিগত সিস্টেম কম্পোনেন্ট এই ফ্ল্যাগের মাধ্যমে বন্ধ করা হয়েছে। এছাড়াও, বিভিন্ন লাইব্রেরি বিভিন্ন হেডার সেট এক্সপোর্ট করে (যেমন 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 চালু করার পরে, বিল্ড সিস্টেম নিম্নলিখিত ডিপেন্ডেন্সি ও হেডার সংক্রান্ত প্রয়োজনীয়তা এনফোর্স করে।

ডিপেন্ডেন্সি ম্যানেজ করুন

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

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

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

হেডার ম্যানেজ করুন

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

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

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

  • সম্ভব হলে, getgrnam/ getpwnam কলের মাধ্যমে সব AID_* ম্যাক্রো পরিবর্তন করে private/android_filesystem_config.h-এর উপর নির্ভরতা সরিয়ে দিন। যেমন:
    • (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 যোগ করুন।