Android 8, ডিভাইস-নিরপেক্ষ Android প্ল্যাটফর্ম এবং ডিভাইস ও ভেন্ডর-নির্দিষ্ট কোডের মধ্যে স্পষ্ট ইন্টারফেস নির্ধারণ করতে Android OS-কে নতুন করে ডিজাইন করে।
Android ইতিমধ্যেই HAL ইন্টারফেসের আকারে এই ধরনের অনেক ইন্টারফেসকে সংজ্ঞায়িত করে,
hardware/libhardware-এ C হেডার হিসেবে সংজ্ঞায়িত করা হয়েছে। HIDL এই HAL ইন্টারফেসগুলিকে স্টেবল, ভার্সন করা ইন্টারফেস দিয়ে প্রতিস্থাপন করে, যা C++ (নিচে বর্ণিত) বা Java-তে ক্লায়েন্ট- এবং সার্ভার-সাইড HIDL ইন্টারফেস হতে পারে।
এই বিভাগের পৃষ্ঠাগুলিতে HIDL ইন্টারফেসের C++ ইমপ্লিমেন্টেশন সম্পর্কে বর্ণনা করা হয়েছে,
এর মধ্যে hidl-gen কম্পাইলারের মাধ্যমে HIDL .hal
ফাইল থেকে অটো-জেনারেট হওয়া ফাইল সম্পর্কিত বিবরণ, কীভাবে এই ফাইলগুলি প্যাকেজ করা হয় এবং
যে C++ কোড এগুলি ব্যবহার করে তার সাথে কীভাবে এই ফাইলগুলি ইন্টিগ্রেট করা যায় তা অন্তর্ভুক্ত।
ক্লায়েন্ট ও সার্ভার ইমপ্লিমেন্টেশন
HIDL ইন্টারফেসে ক্লায়েন্ট ও সার্ভার ইমপ্লিমেন্টেশন থাকে:
- HIDL ইন্টারফেসের ক্লায়েন্ট হল সেই কোড যা ইন্টারফেসের মেথড কল করে সেটি ব্যবহার করে।
- সার্ভার হল HIDL ইন্টারফেসের একটি প্রয়োগ যা ক্লায়েন্টদের থেকে কল গ্রহণ করে এবং ফলাফল (প্রয়োজন হলে) ফেরত দেয়।
libhardware HAL থেকে HIDL HAL-এ ট্রানজিশন করার সময়, HAL
ইমপ্লিমেন্টেশন সার্ভার হয়ে যায় এবং HAL-এ কল করা প্রসেস
ক্লায়েন্ট হয়ে যায়। ডিফল্ট ইমপ্লিমেন্টেশন, পাসথ্রু ও বাইন্ডারাইজড
HAL, দুটিই পরিবেশন করতে পারে এবং সময়ের সাথে সাথে পরিবর্তন হতে পারে:

ছবি ১. পুরনো HAL-এর জন্য ডেভেলপমেন্ট প্রগ্রেশন।
HAL ক্লায়েন্ট তৈরি করুন
মেকফাইলে HAL লাইব্রেরি অন্তর্ভুক্ত করে শুরু করুন:
- তৈরি:
LOCAL_SHARED_LIBRARIES += android.hardware.nfc@1.0 - Soong:
shared_libs: [ …, android.hardware.nfc@1.0 ]
এরপর, HAL হেডার ফাইল অন্তর্ভুক্ত করুন:
#include <android/hardware/nfc/1.0/IFoo.h> … // in code: sp<IFoo> client = IFoo::getService(); client->doThing();
HAL সার্ভার তৈরি করা
HAL ইমপ্লিমেন্টেশন তৈরি করতে, আপনার কাছে অবশ্যই .hal ফাইল থাকতে হবে
যা আপনার HAL-কে উপস্থাপন করে এবং hidl-gen-এ -Lmakefile বা -Landroidbp ব্যবহার করে
আপনার HAL-এর জন্য আগে থেকেই মেকফাইল তৈরি করেছে
(./hardware/interfaces/update-makefiles.sh ইন্টার্নাল HAL ফাইলের জন্য এটি করে
এবং এটি একটি ভালো রেফারেন্স)। HAL-এর মাধ্যমে
libhardware থেকে ট্রান্সফার করার সময়, আপনি c2hal ব্যবহার করে এই কাজগুলির বেশিরভাগই সহজে করতে পারবেন।
আপনার HAL প্রয়োগ করার জন্য প্রয়োজনীয় ফাইল তৈরি করতে:
PACKAGE=android.hardware.nfc@1.0 LOC=hardware/interfaces/nfc/1.0/default/ m -j hidl-gen hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport $PACKAGE hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces \ -randroid.hidl:system/libhidl/transport $PACKAGE
পাসথ্রু মোডে HAL-এর কাজ করার জন্য, আপনার কাছে অবশ্যই
HIDL_FETCH_IModuleName ফাংশন থাকতে হবে যা
/(system|vendor|...)/lib(64)?/hw/android.hardware.package@3.0-impl(OPTIONAL_IDENTIFIER).so-এ থাকে
যেখানে OPTIONAL_IDENTIFIER হল পাসথ্রু
ইমপ্লিমেন্টেশন শনাক্তকারী স্ট্রিং। উপরে উল্লেখ করা কমান্ডগুলি অটোমেটিক পাস-থ্রু মোডের প্রয়োজনীয়তা পূরণ করে, যা android.hardware.nfc@1.0-impl
টার্গেটও তৈরি করে, তবে যেকোনও এক্সটেনশন ব্যবহার করা যেতে পারে। যেমন,
android.hardware.nfc@1.0-impl-foo নিজেকে আলাদা করতে -foo ব্যবহার করে।
কোনও HAL যদি অন্য কোনও HAL-এর মাইনর ভার্সন বা এক্সটেনশন হয়, তাহলে এই বাইনারির নাম দেওয়ার জন্য বেস HAL ব্যবহার করা উচিত।
যেমন,
android.hardware.graphics.mapper@2.1-এর প্রয়োগ
এখনও android.hardware.graphics.mapper@2.0-impl(OPTIONAL_IDENTIFIER) নামক
বাইনারিতে থাকতে হবে।
সাধারণত, এখানে OPTIONAL_IDENTIFIER-এ প্রকৃত HAL
ভার্সন অন্তর্ভুক্ত থাকে। বাইনারিকে এইভাবে নাম দিলে, 2.0 ক্লায়েন্টরা এটি সরাসরি রিট্রিভ করতে পারবে,
এবং 2.1 ক্লায়েন্টরা ইমপ্লিমেন্টেশন আপকাস্ট করতে পারবে।
এরপরে, ফাংশনালিটি সহ স্টাব পূরণ করুন এবং একটি ডেমোন সেট-আপ করুন। উদাহরণ ডেমন কোড (পাসথ্রু সাপোর্ট করে):
#include <hidl/LegacySupport.h> int main(int /* argc */, char* /* argv */ []) { return defaultPassthroughServiceImplementation<INfc>("nfc"); }
প্রদত্ত -impl লাইব্রেরির জন্য defaultPassthroughServiceImplementation কল
dlopen() করে এবং এটিকে
বাইন্ডারাইজড পরিষেবা হিসেবে প্রদান করে। ডেমন কোডের উদাহরণ (পিওর বাইন্ডারাইজড পরিষেবার জন্য):
int main(int /* argc */, char* /* argv */ []) { // This function must be called before you join to ensure the proper // number of threads are created. The threadpool never exceeds // size one because of this call. ::android::hardware::configureRpcThreadpool(1 /*threads*/, true /*willJoin*/); sp<INfc> nfc = new Nfc(); const status_t status = nfc->registerAsService(); if (status != ::android::OK) { return 1; // or handle error } // Adds this thread to the threadpool, resulting in one total // thread in the threadpool. We could also do other things, but // would have to specify 'false' to willJoin in configureRpcThreadpool. ::android::hardware::joinRpcThreadpool(); return 1; // joinRpcThreadpool should never return }
এই ডেমন সাধারণত $PACKAGE + "-service-suffix"-এ থাকে (যেমন, android.hardware.nfc@1.0-service), তবে এটি যেকোনও জায়গায় থাকতে পারে।
নির্দিষ্ট
ক্লাসের HAL-এর জন্য sepolicy হল অ্যাট্রিবিউট hal_<module> (যেমন,
hal_nfc). এই অ্যাট্রিবিউটটি অবশ্যই ডেমনকে প্রয়োগ করতে হবে যা একটি নির্দিষ্ট HAL চালায় (যদি একই প্রক্রিয়া একাধিক HAL-কে পরিষেবা দেয়, তবে একাধিক অ্যাট্রিবিউট এতে প্রয়োগ করা যেতে পারে)।