উত্তরাধিকার HALs

একটি HAL হার্ডওয়্যার বিক্রেতাদের বাস্তবায়নের জন্য একটি আদর্শ ইন্টারফেস সংজ্ঞায়িত করে, যা অ্যান্ড্রয়েডকে নিম্ন-স্তরের ড্রাইভার বাস্তবায়ন সম্পর্কে অজ্ঞেয় হতে সক্ষম করে। HAL ব্যবহার করলে আপনি উচ্চ স্তরের সিস্টেমকে প্রভাবিত বা পরিবর্তন না করে কার্যকারিতা বাস্তবায়ন করতে পারবেন। এই পৃষ্ঠাটি পুরানো স্থাপত্যের বর্ণনা করে, যা আর Android 8.0 হিসাবে সমর্থিত নয়৷ Android 8.0 এবং উচ্চতর সংস্করণের জন্য, অনুগ্রহ করে HAL ওভারভিউ দেখুন।

HAL উপাদান

চিত্র 1. HAL উপাদান

আপনার পণ্য সরবরাহ করে এমন নির্দিষ্ট হার্ডওয়্যারের জন্য আপনাকে অবশ্যই সংশ্লিষ্ট HAL (এবং ড্রাইভার) প্রয়োগ করতে হবে। HAL বাস্তবায়নগুলি সাধারণত শেয়ার্ড লাইব্রেরি মডিউলে ( .so ফাইল) তৈরি করা হয়, কিন্তু যেহেতু অ্যান্ড্রয়েড HAL বাস্তবায়ন এবং ডিভাইস ড্রাইভারগুলির মধ্যে একটি আদর্শ মিথস্ক্রিয়া বাধ্যতামূলক করে না, তাই আপনি আপনার পরিস্থিতির জন্য সবচেয়ে ভাল করতে পারেন৷ যাইহোক, আপনার হার্ডওয়্যারের সাথে সঠিকভাবে ইন্টারঅ্যাক্ট করতে Android সিস্টেমকে সক্ষম করতে, আপনাকে অবশ্যই প্রতিটি হার্ডওয়্যার-নির্দিষ্ট HAL ইন্টারফেসে সংজ্ঞায়িত চুক্তি মেনে চলতে হবে।

HAL-এর একটি অনুমানযোগ্য কাঠামো রয়েছে তা নিশ্চিত করার জন্য, প্রতিটি হার্ডওয়্যার-নির্দিষ্ট HAL ইন্টারফেসের বৈশিষ্ট্যগুলি hardware/libhardware/include/hardware/hardware.h এ সংজ্ঞায়িত করা হয়েছে। এই ইন্টারফেসটি অ্যান্ড্রয়েড সিস্টেমকে আপনার HAL মডিউলগুলির সঠিক সংস্করণগুলিকে সামঞ্জস্যপূর্ণ উপায়ে লোড করার অনুমতি দেয়৷ একটি HAL ইন্টারফেস দুটি উপাদান নিয়ে গঠিত: মডিউল এবং ডিভাইস।

HAL মডিউল

একটি মডিউল আপনার প্যাকেজ করা HAL বাস্তবায়নের প্রতিনিধিত্ব করে, যা একটি শেয়ার্ড লাইব্রেরি ( .so file ) হিসাবে সংরক্ষণ করা হয়। hardware/libhardware/include/hardware/hardware.h হেডার ফাইলটি একটি struct ( hw_module_t ) সংজ্ঞায়িত করে যা একটি মডিউলকে উপস্থাপন করে এবং এতে মেটাডেটা থাকে যেমন সংস্করণ, নাম এবং মডিউলের লেখক। HAL মডিউল সঠিকভাবে খুঁজে পেতে এবং লোড করতে Android এই মেটাডেটা ব্যবহার করে।

উপরন্তু, hw_module_t struct-এ অন্য struct-এর জন্য একটি পয়েন্টার রয়েছে, hw_module_methods_t , যেটিতে মডিউলের জন্য একটি খোলা ফাংশনের জন্য একটি পয়েন্টার রয়েছে। এই খোলা ফাংশনটি হার্ডওয়্যারের সাথে যোগাযোগ শুরু করতে ব্যবহৃত হয় যার জন্য HAL একটি বিমূর্ততা হিসাবে পরিবেশন করছে। প্রতিটি হার্ডওয়্যার-নির্দিষ্ট HAL সাধারণত সেই নির্দিষ্ট হার্ডওয়্যারের জন্য অতিরিক্ত তথ্য সহ জেনেরিক hw_module_t স্ট্রাকটকে প্রসারিত করে। উদাহরণস্বরূপ, ক্যামেরা HAL-এ, camera_module_t struct-এ অন্যান্য ক্যামেরা-নির্দিষ্ট ফাংশন পয়েন্টারগুলির সাথে একটি hw_module_t স্ট্রাকট রয়েছে:

typedef struct camera_module {
    hw_module_t common;
    int (*get_number_of_cameras)(void);
    int (*get_camera_info)(int camera_id, struct camera_info *info);
} camera_module_t;

যখন আপনি একটি HAL বাস্তবায়ন করেন এবং মডিউল স্ট্রাকট তৈরি করেন, আপনাকে অবশ্যই এটির নাম দিতে হবে HAL_MODULE_INFO_SYM । নেক্সাস 9 অডিও HAL থেকে উদাহরণ:

struct audio_module HAL_MODULE_INFO_SYM = {
    .common = {
        .tag = HARDWARE_MODULE_TAG,
        .module_api_version = AUDIO_MODULE_API_VERSION_0_1,
        .hal_api_version = HARDWARE_HAL_API_VERSION,
        .id = AUDIO_HARDWARE_MODULE_ID,
        .name = "NVIDIA Tegra Audio HAL",
        .author = "The Android Open Source Project",
        .methods = &hal_module_methods,
    },
};

HAL ডিভাইস

একটি ডিভাইস আপনার পণ্যের হার্ডওয়্যারকে বিমূর্ত করে। উদাহরণস্বরূপ, একটি অডিও মডিউলে একটি প্রাথমিক অডিও ডিভাইস, একটি USB অডিও ডিভাইস, বা একটি ব্লুটুথ A2DP অডিও ডিভাইস থাকতে পারে।

একটি ডিভাইস hw_device_t গঠন দ্বারা প্রতিনিধিত্ব করা হয়। একটি মডিউলের মতো, প্রতিটি ধরণের ডিভাইস জেনেরিক hw_device_t এর একটি বিশদ সংস্করণ সংজ্ঞায়িত করে যাতে হার্ডওয়্যারের নির্দিষ্ট বৈশিষ্ট্যগুলির জন্য ফাংশন পয়েন্টার থাকে। উদাহরণস্বরূপ, audio_hw_device_t struct টাইপটিতে অডিও ডিভাইস অপারেশনের ফাংশন পয়েন্টার রয়েছে:

struct audio_hw_device {
    struct hw_device_t common;

    /**
     * used by audio flinger to enumerate what devices are supported by
     * each audio_hw_device implementation.
     *
     * Return value is a bitmask of 1 or more values of audio_devices_t
     */
    uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);
  ...
};
typedef struct audio_hw_device audio_hw_device_t;

এই স্ট্যান্ডার্ড বৈশিষ্ট্যগুলি ছাড়াও, প্রতিটি হার্ডওয়্যার-নির্দিষ্ট HAL ইন্টারফেস তার নিজস্ব বৈশিষ্ট্য এবং প্রয়োজনীয়তাগুলি সংজ্ঞায়িত করতে পারে। বিশদ বিবরণের জন্য, HAL রেফারেন্স ডকুমেন্টেশনের পাশাপাশি প্রতিটি HAL-এর জন্য পৃথক নির্দেশাবলী দেখুন।

HAL মডিউল তৈরি করুন

HAL বাস্তবায়নগুলি মডিউল ( .so ) ফাইলগুলিতে তৈরি করা হয় এবং উপযুক্ত হলে Android দ্বারা গতিশীলভাবে লিঙ্ক করা হয়। আপনি আপনার প্রতিটি HAL বাস্তবায়নের জন্য Android.mk ফাইল তৈরি করে এবং আপনার সোর্স ফাইলের দিকে নির্দেশ করে আপনার মডিউল তৈরি করতে পারেন। সাধারণভাবে, আপনার ভাগ করা লাইব্রেরিগুলির একটি নির্দিষ্ট বিন্যাসে নামকরণ করা আবশ্যক যাতে সেগুলি খুঁজে পাওয়া যায় এবং সঠিকভাবে লোড করা যায়৷ নামকরণের স্কিমটি মডিউল থেকে মডিউলে সামান্য পরিবর্তিত হয়, কিন্তু সাধারণ প্যাটার্ন অনুসরণ করে: <module_type>.<device_name>

উত্তরাধিকার HAL

লিগ্যাসি HAL শব্দটি বিস্তৃতভাবে সমস্ত প্রাক-Android 8.0 HAL-কে বোঝায় (Android 8-এ বাতিল করা হয়েছে)। বেশিরভাগ অ্যান্ড্রয়েড সিস্টেম ইন্টারফেস (ক্যামেরা, অডিও, সেন্সর, ইত্যাদি) 'হার্ডওয়্যার/লিবার্ডওয়্যার/ইনক্লুড/হার্ডওয়্যার' এর অধীনে সংজ্ঞায়িত করা হয়েছে এবং এর মোটামুটি সংস্করণ এবং একটি মোটামুটি স্থিতিশীল ABI রয়েছে। কয়েকটি সাবসিস্টেমের (ওয়াই-ফাই, রেডিও ইন্টারফেস লেয়ার, এবং ব্লুটুথ সহ) অন্যান্য অ-প্রমিত ইন্টারফেস আছে `libhadware_legacy`-এ বা পুরো কোডবেস জুড়ে বিভক্ত। লিগ্যাসি HALগুলি কখনই শক্ত স্থিতিশীলতার গ্যারান্টি দেয় না।