প্যাকেজ

কিছু ব্যতিক্রম ছাড়া, HIDL ইন্টারফেস প্যাকেজগুলি hardware/interfaces বা vendor/ ডিরেক্টরিতে অবস্থিত। hardware/interfaces টপ-লেভেল ম্যাপ সরাসরি android.hardware প্যাকেজ নেমস্পেসের সাথে কানেক্ট করে; ভার্সন হল প্যাকেজ নেমস্পেসের অধীন একটি সাবডিরেক্টরি (ইন্টারফেস নয়)।

hidl-gen কম্পাইলার .hal ফাইলগুলিকে .h ও .cpp ফাইলের একটি সেটে কম্পাইল করে। এইসব অটোমেটিক তৈরি করা ফাইল থেকে, ক্লায়েন্ট/সার্ভার ইমপ্লিমেন্টেশন লিঙ্ক করা হয় এমন একটি শেয়ার করা লাইব্রেরি তৈরি করা হয়। এই শেয়ার করা লাইব্রেরি তৈরি করা Android.bp ফাইলটি hardware/interfaces/update-makefiles.sh স্ক্রিপ্ট দ্বারা অটোমেটিক তৈরি হয়। hardware/interfaces-এ প্রতিবার নতুন প্যাকেজ যোগ করলে অথবা আগে থেকে থাকা প্যাকেজে .hal ফাইল যোগ করলে/সরিয়ে দিলে, জেনারেট করা শেয়ার করা লাইব্রেরি আপ-টু-ডেট আছে কিনা তা নিশ্চিত করতে আপনাকে স্ক্রিপ্ট আবার চালাতে হবে।

যেমন, IFoo.hal স্যাম্পেল ফাইলটি hardware/interfaces/samples/1.0-এ থাকতে হবে। sample IFoo.hal ফাইলটি samples প্যাকেজে একটি IFoo ইন্টারফেস তৈরি করে:

package android.hardware.samples@1.0;
interface IFoo {
    struct Foo {
       int64_t someValue;
       handle  myHandle;
    };

    someMethod() generates (vec<uint32_t>);
    anotherMethod(Foo foo) generates (int32_t ret);
};

জেনারেট করা ফাইল

HIDL প্যাকেজে অটোমেটিক তৈরি হওয়া ফাইলগুলি প্যাকেজের (যেমন, android.hardware.samples@1.0) একই নামের একটি শেয়ার করা লাইব্রেরিতে লিঙ্ক করা থাকে। শেয়ার করা লাইব্রেরিটি একটি হেডার, IFoo.h এক্সপোর্ট করে, যা ক্লায়েন্ট ও সার্ভার অন্তর্ভুক্ত করতে পারে। ইনপুট হিসেবে IFoo.hal ইন্টারফেস ফাইল সহ hidl-gen কম্পাইলার ব্যবহার করলে, বাইন্ডারাইজড মোডে নিম্নলিখিত অটো-জেনারেটেড ফাইল থাকে:

কম্পাইলারের তৈরি করা ফাইল

ছবি ১. কম্পাইলারের মাধ্যমে তৈরি করা ফাইল।

  • IFoo.h. C++ ক্লাসে পিওর IFoo ইন্টারফেসের বর্ণনা দেয়; এতে IFoo.hal ফাইলে IFoo ইন্টারফেসে সংজ্ঞায়িত পদ্ধতি ও ধরন থাকে, যেখানে প্রয়োজন সেখানে C++ ধরনের সাথে অনুবাদ করা হয়। এই ইন্টারফেস প্রয়োগ করার জন্য ব্যবহৃত RPC মেকানিজম (যেমন, HwBinder) সম্পর্কিত বিবরণ নেই। ক্লাসটি প্যাকেজ ও ভার্সনের সাথে নেমস্পেস করা হয়, যেমন, ::android::hardware::samples::IFoo::V1_0। ক্লায়েন্ট ও সার্ভার, দু'টিতেই এই হেডার থাকে: ক্লায়েন্টদের ক্ষেত্রে এটিতে মেথড কল করার জন্য এবং সার্ভারদের ক্ষেত্রে সেইসব মেথড প্রয়োগ করার জন্য।
  • IHwFoo.h. ইন্টারফেসে ব্যবহৃত ডেটা টাইপকে সিরিয়ালাইজ করার জন্য ফাংশনের ঘোষণা সহ হেডার ফাইল। ডেভেলপারদের কখনই সরাসরি তার হেডার যোগ করা উচিত নয় (এতে কোনও ক্লাস থাকে না)।
  • BpHwFoo.h. একটি ক্লাস যা IFoo থেকে ইনহেরিট করে এবং ইন্টারফেসের HwBinder প্রক্সি (ক্লায়েন্ট-সাইড) ইমপ্লিমেন্টেশন বর্ণনা করে। ডেভেলপারদের কখনই সরাসরি এই ক্লাস উল্লেখ করা উচিত নয়।
  • BnHwFoo.h. এমন একটি ক্লাস যা IFoo ইমপ্লিমেন্টেশনের রেফারেন্স হোল্ড করে এবং ইন্টারফেসের HwBinder স্টাব (সার্ভার-সাইড) ইমপ্লিমেন্টেশন বর্ণনা করে। ডেভেলপারদের কখনই এই ক্লাসের সরাসরি উল্লেখ করা উচিত নয়।
  • FooAll.cpp. এমন একটি ক্লাস যাতে HwBinder প্রক্সি ও HwBinder স্টাব, দু'টিরই ইমপ্লিমেন্টেশন থাকে। কোনও ক্লায়েন্ট ইন্টারফেস মেথড কল করলে, প্রক্সি ক্লায়েন্ট থেকে অটোমেটিক আর্গুমেন্ট মার্শেল করে এবং ট্রানজ্যাকশন বাইন্ডার কার্নেল ড্রাইভারে পাঠায়, যা ট্রানজ্যাকশনটি অন্য দিকের স্টাবে ডেলিভার করে (যা তারপরে আসল সার্ভার ইমপ্লিমেন্টেশন কল করে)।

এই ফাইলগুলি aidl-cpp-এর (বিস্তারিত জানতে, HIDL ওভারভিউ-তে "পাসথ্রু মোড" দেখুন) তৈরি করা ফাইলের মতো করে স্ট্রাকচার করা হয়। HIDL-এর ব্যবহৃত RPC মেকানিজম থেকে স্বতন্ত্র একমাত্র অটোমেটিক তৈরি হওয়া ফাইল হল IFoo.h; অন্যান্য সব ফাইল HIDL-এর ব্যবহৃত HwBinder RPC মেকানিজমের সাথে যুক্ত। তাই, ক্লায়েন্ট ও সার্ভার ইমপ্লিমেন্টেশন কখনও IFoo ছাড়া অন্য কোনও কিছুর সাথে সরাসরি রেফার করা উচিত নয়। এটি করতে, শুধু IFoo.h অন্তর্ভুক্ত করুন এবং জেনারেট করা শেয়ার করা লাইব্রেরির বিপরীতে লিঙ্ক করুন।

কোনও প্যাকেজে কোনও ইন্টারফেস ব্যবহার করে এমন ক্লায়েন্ট বা সার্ভারকে অবশ্যই নিম্নলিখিত লোকেশনগুলির মধ্যে একটি (১)তে সেই প্যাকেজের শেয়ার করা লাইব্রেরি অন্তর্ভুক্ত করতে হবে:

  • Android.mk-এ:
    LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
  • Android.bp-এ:
    shared_libs: [
        /* ... */
        "android.hardware.samples@1.0",
    ],

আপনাকে যোগ করতে হতে পারে এমন অতিরিক্ত লাইব্রেরি:

libhidlbase এর মধ্যে স্ট্যান্ডার্ড HIDL ডেটার ধরন অন্তর্ভুক্ত। Android 10 থেকে শুরু করে, এতে আগে libhidltransport এবং libhwbinder-এ থাকা সমস্ত চিহ্নও রয়েছে।
libhidltransport বিভিন্ন RPC/IPC মেকানিজমের মাধ্যমে HIDL কলের ট্রান্সপোর্ট ম্যানেজ করে। Android 10 এই লাইব্রেরি বাতিল করে দেয়।
libhwbinder বাইন্ডার-নির্দিষ্ট চিহ্ন। Android 10 এই লাইব্রেরি আর ব্যবহার করা যাবে না।
libfmq ফাস্ট মেসেজ কিউ আইপিসি।

নেমস্পেস

Return<T> এবং Void()-এর মতো HIDL ফাংশন ও ধরন ::android::hardware নেমস্পেসে ঘোষণা করা হয়। প্যাকেজের C++ নেমস্পেস, প্যাকেজের নাম ও ভার্সন দ্বারা নির্ধারিত হয়। যেমন, mypackage প্যাকেজের ভার্সন 1.2 যা hardware/interfaces-এর অধীনে আছে, তার নিম্নলিখিত কোয়ালিটি আছে:

  • C++ নেমস্পেস হল ::android::hardware::mypackage::V1_2
  • ওই প্যাকেজে IMyInterface-এর সম্পূর্ণ নাম হল: ::android::hardware::mypackage::V1_2::IMyInterface। (IMyInterface হল একটি শনাক্তকারী, নেমস্পেসের অংশ নয়)।
  • প্যাকেজের types.hal ফাইলে সংজ্ঞায়িত ধরনগুলিকে এগুলি হিসেবে শনাক্ত করা হয়েছে: ::android::hardware::mypackage::V1_2::MyPackageType