প্যাকেজ

কিছু ব্যতিক্রম ছাড়া, 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 এ অবস্থিত হওয়া উচিত। নমুনা IFoo.hal ফাইল নমুনা প্যাকেজে একটি 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 কম্পাইলার ব্যবহার করে, বাইন্ডারাইজড মোডে নিম্নলিখিত স্বয়ংক্রিয়ভাবে তৈরি ফাইল রয়েছে:

কম্পাইলার দ্বারা উত্পন্ন ফাইল

চিত্র 1. কম্পাইলার দ্বারা উত্পন্ন ফাইল।

  • 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 ডেটা প্রকার অন্তর্ভুক্ত। অ্যান্ড্রয়েড 10 থেকে শুরু করে, এটিতে পূর্বে libhidltransport এবং libhwbinder এর সমস্ত চিহ্ন রয়েছে।
libhidltransport বিভিন্ন RPC/IPC মেকানিজমের মাধ্যমে HIDL কলের পরিবহন পরিচালনা করে। অ্যান্ড্রয়েড 10 এই লাইব্রেরিটি বাতিল করে।
libhwbinder বাইন্ডার-নির্দিষ্ট প্রতীক। অ্যান্ড্রয়েড 10 এই লাইব্রেরিটি বাতিল করে।
libfmq ফাস্ট মেসেজ কিউ আইপিসি।

নামস্থান

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

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