সেন্সর মাল্টি HAL

সেন্সরস মাল্টি-এইচএএল হলো একটি ফ্রেমওয়ার্ক যা সেন্সর এইচএএল-গুলোকে অন্যান্য সেন্সর এইচএএল-এর পাশাপাশি চলতে দেয়। সেন্সরস মাল্টি-এইচএএল ভেন্ডর পার্টিশনে ডাইনামিক লাইব্রেরি হিসেবে সংরক্ষিত সেন্সরস সাব-এইচএএল-গুলোকে ডাইনামিকভাবে লোড করে এবং সেগুলোকে একটি কলব্যাক অবজেক্ট দেয় যা ইভেন্ট পোস্ট করা এবং ওয়েক লক অর্জন ও মুক্ত করার কাজ পরিচালনা করতে পারে। একটি সেন্সরস সাব-এইচএএল হলো এমন একটি সেন্সরস এইচএএল যা ভেন্ডর পার্টিশনের একটি শেয়ার্ড অবজেক্টে বিল্ট-ইন থাকে এবং মাল্টি-এইচএএল ফ্রেমওয়ার্ক দ্বারা ব্যবহৃত হয়। এই সাব-এইচএএল-গুলো একে অপরের উপর বা প্রসেসের প্রধান ফাংশন ধারণকারী মাল্টি-এইচএএল কোডের উপর নির্ভরশীল নয়।

সেন্সরস মাল্টি-এইচএএল ২.১, যা অ্যান্ড্রয়েড ১১ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতে উপলব্ধ, হলো সেন্সরস মাল্টি-এইচএএল ২.০-এর একটি সংস্করণ যা এমন সাব-এইচএএল লোড করা সমর্থন করে যা হিঞ্জ অ্যাঙ্গেল সেন্সর টাইপ প্রকাশ করতে পারে। এই সেন্সর টাইপ সমর্থন করার জন্য, সাব-এইচএএল-গুলিকে অবশ্যই ২.১ সাব-এইচএএল হেডারে সংজ্ঞায়িত সাব-এইচএএল এপিআই ব্যবহার করতে হবে।

Android 13 বা তার উচ্চতর সংস্করণে চালিত যে ডিভাইসগুলো Sensors AIDL HAL ব্যবহার করে, সেগুলোতে আপনি মাল্টি-HAL সক্ষমতা চালু করার জন্য মাল্টি-HAL শিম লেয়ার ব্যবহার করতে পারেন। বাস্তবায়নের বিস্তারিত তথ্যের জন্য, Sensors AIDL HAL-এর সাথে Sensors Multi-HAL-এর ব্যবহার দেখুন।

সেন্সর মাল্টি-এইচএএল ২ এবং সেন্সর এইচএএল ২ এর মধ্যে পার্থক্য

সেন্সরস মাল্টি-এইচএএল ২, যা অ্যান্ড্রয়েড ১০ বা তার উচ্চতর সংস্করণে চালিত ডিভাইসগুলিতে উপলব্ধ, এইচএএল এপিআই-এর সাথে ইন্টারঅ্যাক্ট করা সহজ করার জন্য সেন্সরস এইচএএল ২- এর উপরে বেশ কিছু অ্যাবস্ট্রাকশন নিয়ে এসেছে। সেন্সরস মাল্টি-এইচএএল ২, সেন্সরস এইচএএল ২ ইন্টারফেস এবং V2_1/SubHal (বা V2_0/SubHal ) ইন্টারফেস ইমপ্লিমেন্ট করার জন্য HalProxy ক্লাসটি চালু করেছে, যা HalProxy সাব-এইচএএল-গুলির সাথে ইন্টারঅ্যাক্ট করার সুযোগ দেয়।

ISensorsSubHal ইন্টারফেসটি 2.1/ISensors.hal (বা 2.0/ISensors.hal ) ইন্টারফেস থেকে নিম্নলিখিত উপায়ে ভিন্ন:

  • initialize মেথডটি দুটি FMQ এবং ISensorsCallback এর পরিবর্তে একটি IHalProxyCallback ক্লাস পাস করে।
  • বাগ রিপোর্টে ডিবাগিং তথ্য প্রদানের জন্য সাব-এইচএএল-গুলোকে অবশ্যই একটি ডিবাগ ফাংশন প্রয়োগ করতে হবে।
  • সাব-এইচএএল-গুলোকে অবশ্যই একটি নেম ফাংশন ইমপ্লিমেন্ট করতে হবে, যাতে লোড করা সাব-এইচএএল-টিকে অন্যান্য সাব-এইচএএল থেকে আলাদা করা যায়।

Sensors Multi-HAL 2 এবং Sensors HAL 2-এর মধ্যে প্রধান পার্থক্যটি হলো ইনিশিয়ালাইজ ফাংশনগুলোতে। FMQ সরবরাহ করার পরিবর্তে, IHalProxyCallback ইন্টারফেসটি দুটি মেথড প্রদান করে: একটি মেথড সেন্সর ফ্রেমওয়ার্কে সেন্সর ইভেন্ট পোস্ট করার জন্য এবং অন্যটি ওয়েক লক তৈরি করার জন্য। নেপথ্যে, Sensors Multi-HAL সমস্ত সাব-HAL-এর জন্য সেন্সর ইভেন্টের সময়মতো ডেলিভারি নিশ্চিত করতে FMQ-এর সাথে সমস্ত ইন্টারঅ্যাকশন পরিচালনা করে। সাব-HAL-গুলোকে জোরালোভাবে পরামর্শ দেওয়া হয় যেন তারা createScopedWakelock মেথডটি ব্যবহার করে, যার মাধ্যমে ওয়েক লকের টাইমআউটের ভার Sensors Multi-HAL-এর উপর অর্পণ করা যায় এবং পুরো Sensors Multi-HAL-এর জন্য একটি সাধারণ ওয়েক লকের মাধ্যমে এর ব্যবহারকে কেন্দ্রীভূত করা যায়, যা লকিং এবং আনলকিং কলের সংখ্যা কমিয়ে আনে।

সেন্সরস মাল্টি-এইচএএল ২-এ কিছু অন্তর্নির্মিত সুরক্ষা বৈশিষ্ট্যও রয়েছে। এটি এমন পরিস্থিতি সামাল দেয় যেখানে সেন্সর এফএমকিউ (FMQ) পূর্ণ হয়ে যায় অথবা যখন অ্যান্ড্রয়েড সেন্সর ফ্রেমওয়ার্ক পুনরায় চালু হয় এবং সেন্সরের অবস্থা রিসেট করার প্রয়োজন হয়। এছাড়াও, যখন HalProxy ক্লাসে ইভেন্ট পোস্ট করা হয় কিন্তু সেন্সর ফ্রেমওয়ার্ক তাৎক্ষণিকভাবে ইভেন্টগুলো গ্রহণ করতে পারে না, তখন সেন্সরস মাল্টি-এইচএএল ইভেন্টগুলোকে একটি ব্যাকগ্রাউন্ড থ্রেডে স্থানান্তর করতে পারে, যাতে ইভেন্টগুলো পোস্ট হওয়ার অপেক্ষায় থাকাকালীন সমস্ত সাব-এইচএএল (sub-HAL)-এ কাজ চলতে পারে।

সোর্স কোড এবং রেফারেন্স বাস্তবায়ন

সমস্ত সেন্সর মাল্টি-এইচএএল কোড hardware/interfaces/sensors/common/default/2.X/multihal/ -এ পাওয়া যায়। এখানে কিছু রিসোর্সের লিঙ্ক দেওয়া হলো।

  • HalProxy.h : HalProxy অবজেক্টটি Sensors multi-HAL দ্বারা ইনস্ট্যানশিয়েট করা হয় এবং এটি সাব-HAL-গুলো থেকে সেন্সর ফ্রেমওয়ার্কে ডেটা প্রেরণের কাজটি পরিচালনা করে।
  • HalProxy.cpp : HalProxy এর বাস্তবায়নে সাব-HAL এবং সেন্সর ফ্রেমওয়ার্কের মধ্যে যোগাযোগ মাল্টিপ্লেক্স করার জন্য প্রয়োজনীয় সমস্ত লজিক রয়েছে।
  • SubHal.h : ISensorsSubHal ইন্টারফেসটি সেই ইন্টারফেসকে সংজ্ঞায়িত করে যা HalProxy সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য সাব-HAL-গুলোকে অবশ্যই অনুসরণ করতে হয়। সাব-HAL-টি initialize মেথডটি ইমপ্লিমেন্ট করে, যাতে HalProxyCallback অবজেক্টটি postEvents এবং createScopedWakelock জন্য ব্যবহার করা যায়।

    Multi-HAL 2.0 বাস্তবায়নের জন্য, SubHal.h এর 2.0 সংস্করণ ব্যবহার করুন।

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/ : এই ইউনিট টেস্টগুলো HalProxy বাস্তবায়ন যাচাই করে।

  • hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ : এই উদাহরণ সাব-এইচএএল (sub-HAL) ইমপ্লিমেন্টেশনটি নকল ডেটা তৈরি করার জন্য নকল সেন্সর ব্যবহার করে। একটি ডিভাইসে একাধিক সাব-এইচএএল কীভাবে একে অপরের সাথে কাজ করে, তা পরীক্ষা করার জন্য এটি উপযোগী।

বাস্তবায়ন

এই বিভাগে নিম্নলিখিত পরিস্থিতিগুলিতে সেন্সর মাল্টি-এইচএএল (Sensors Multi-HAL) কীভাবে প্রয়োগ করতে হয় তা বর্ণনা করা হয়েছে:

Sensors AIDL HAL-এর সাথে Sensors Multi-HAL ব্যবহার করুন

Sensors AIDL HAL-এর সাথে মাল্টি-HAL সক্ষমতা চালু করতে, AIDL Multi-HAL শিম লেয়ার মডিউলটি ইম্পোর্ট করুন, যা hardware/interfaces/sensors/aidl/default/multihal/ -এ পাওয়া যায়। এই মডিউলটি AIDL এবং HIDL সেন্সর HAL ডেফিনিশন টাইপগুলোর মধ্যে রূপান্তর পরিচালনা করে এবং Implementing Sensors Multi-HAL 2.1- এ বর্ণিত মাল্টি-HAL ইন্টারফেসের চারপাশে একটি র‍্যাপার সংজ্ঞায়িত করে। AIDL মাল্টি-HAL শিম লেয়ারটি সেইসব ডিভাইসের সাথে সামঞ্জস্যপূর্ণ যেগুলো Sensors Multi-HAL 2.1 ইমপ্লিমেন্ট করে।

AIDL মাল্টি-HAL শিম লেয়ার আপনাকে Sensors AIDL HAL-এ হেড ট্র্যাকার এবং লিমিটেড-অ্যাক্সিস IMU সেন্সর টাইপগুলো প্রকাশ করার সুযোগ দেয়। AIDL HAL ইন্টারফেস দ্বারা সংজ্ঞায়িত এই সেন্সর টাইপগুলো ব্যবহার করতে, getSensorsList_2_1() ইমপ্লিমেন্টেশনে SensorInfo struct-এর type ফিল্ডটি সেট করুন। এটি নিরাপদ, কারণ AIDL এবং HIDL sensors HAL-এর ইন্টিজার-ভিত্তিক সেন্সর টাইপ ফিল্ডগুলো একে অপরের সাথে ওভারল্যাপ করে না।

সেন্সর মাল্টি-এইচএএল ২.১ বাস্তবায়ন করুন

নতুন ডিভাইসে Sensors Multi-HAL 2.1 প্রয়োগ করতে, এই ধাপগুলো অনুসরণ করুন:

  1. SubHal.h এ বর্ণিত পদ্ধতি অনুসারে ISensorsSubHal ইন্টারফেসটি প্রয়োগ করুন।
  2. SubHal.hsensorsHalGetSubHal_2_1 পদ্ধতি প্রয়োগ করুন।
  3. নতুনভাবে প্রয়োগ করা সাব-এইচএএল (sub-HAL) বিল্ড করার জন্য একটি cc_library_shared টার্গেট যোগ করুন। টার্গেটটি যোগ করার সময়:

    1. নিশ্চিত করুন যে টার্গেটটি ডিভাইসের ভেন্ডর পার্টিশনের কোনো একটি স্থানে পুশ করা হয়েছে।
    2. /vendor/etc/sensors/hals.conf এ অবস্থিত কনফিগারেশন ফাইলে, একটি নতুন লাইনে লাইব্রেরির পাথটি যোগ করুন। প্রয়োজনে, hals.conf ফাইলটি তৈরি করুন।

    সাব-এইচএএল লাইব্রেরি তৈরির জন্য Android.bp ফাইলের একটি উদাহরণ এন্ট্রির জন্য hardware/interfaces/sensors/common/default/2.X/multihal/tests/Android.bp দেখুন।

  4. manifest.xml ফাইল থেকে android.hardware.sensors সমস্ত এন্ট্রি মুছে ফেলুন, যেটিতে ডিভাইসে সমর্থিত HAL-গুলোর তালিকা রয়েছে।

  5. device.mk ফাইল থেকে android.hardware.sensors service এবং service.rc ফাইলগুলো মুছে ফেলুন এবং PRODUCT_PACKAGESandroid.hardware.sensors@2.1-service.multihalandroid.hardware.sensors@2.1-service.multihal.rc যোগ করুন।

বুট করার সময়, HalProxy চালু হয়, নতুনভাবে বাস্তবায়িত সাব-HAL-টি খোঁজে এবং sensorsHalGetSubHal_2_1 কল করার মাধ্যমে সেটিকে ইনিশিয়ালাইজ করে।

সেন্সর মাল্টি-এইচএএল ২.০ থেকে মাল্টি-এইচএএল ২.১-এ পোর্ট করুন

Multi-HAL 2.0 থেকে Multi-HAL 2.1-এ পোর্ট করার জন্য, SubHal ইন্টারফেসটি ইমপ্লিমেন্ট করুন এবং আপনার সাব-HAL পুনরায় কম্পাইল করুন।

২.০ এবং ২.১ SubHal ইন্টারফেসের মধ্যে পার্থক্যগুলো হলো:

  • IHalProxyCallback ISensors.hal স্পেসিফিকেশনের ২.১ সংস্করণে তৈরি টাইপগুলো ব্যবহার করে।
  • initialize() ফাংশনটি 2.0 SubHal ইন্টারফেসের IHalProxyCallback-এর পরিবর্তে একটি নতুন IHalProxyCallback পাস করে।
  • সাব-এইচএএল-গুলোকে অবশ্যই getSensorsList এবং injectSensorData এর পরিবর্তে getSensorsList_2_1 এবং injectSensorData_2_1 ইমপ্লিমেন্ট করতে হবে, কারণ এই মেথডগুলো ISensors.hal স্পেসিফিকেশনের ২.১ সংস্করণে যুক্ত হওয়া নতুন টাইপগুলো ব্যবহার করে।
  • মাল্টি-এইচএএল দ্বারা সাব-এইচএএলগুলোকে সংস্করণ ২.১ সাব-এইচএএল হিসেবে গণ্য করার জন্য, সেগুলোকে sensorsHalGetSubHal এর পরিবর্তে sensorsHalGetSubHal_2_1 প্রকাশ করতে হবে।

সেন্সর HAL 2.0 থেকে পোর্ট

Sensors HAL 2.0 থেকে Sensors Multi-HAL 2.0-তে আপগ্রেড করার সময়, নিশ্চিত করুন যে HAL ইমপ্লিমেন্টেশনটি নিম্নলিখিত প্রয়োজনীয়তাগুলি পূরণ করে।

HAL শুরু করুন

Sensors HAL 2.0-তে একটি initialize ফাংশন আছে যা সেন্সর সার্ভিসকে FMQ এবং একটি ডাইনামিক সেন্সর কলব্যাক পাস করার সুযোগ দেয়। Sensors Multi-HAL 2.0-তে, initialize() ফাংশনটি একটিমাত্র কলব্যাক পাস করে যা সেন্সর ইভেন্ট পোস্ট করতে, ওয়েক লক পেতে এবং ডাইনামিক সেন্সর সংযোগ ও সংযোগ বিচ্ছিন্ন হওয়ার বিষয়ে অবহিত করতে অবশ্যই ব্যবহার করতে হবে।

মাল্টি-এইচএএল বাস্তবায়নে সেন্সর ইভেন্টগুলি পোস্ট করুন

FMQ-এর মাধ্যমে সেন্সর ইভেন্ট পোস্ট করার পরিবর্তে, সেন্সর ইভেন্ট উপলব্ধ হলে সাব-HAL-কে অবশ্যই IHalProxyCallback এ সেই ইভেন্টগুলো লিখতে হবে।

ওয়েক_আপ ইভেন্টগুলি

Sensors HAL 2.0-তে, HAL তার নিজস্ব ইমপ্লিমেন্টেশনের জন্য ওয়েক লক পরিচালনা করতে পারে। Sensors Multi-HAL 2.0-তে, সাব-HAL-গুলো Multi-HAL ইমপ্লিমেন্টেশনকে ওয়েক লক পরিচালনা করার সুযোগ দেয় এবং createScopedWakelock কল করার মাধ্যমে একটি ওয়েক লক অ্যাকোয়ার করার জন্য অনুরোধ করতে পারে। Multi-HAL ইমপ্লিমেন্টেশনে ওয়েক আপ ইভেন্ট পোস্ট করার সময়, একটি লক করা স্কোপড ওয়েক লক অবশ্যই অ্যাকোয়ার করতে হবে এবং postEvents এ পাস করতে হবে।

ডায়নামিক সেন্সর

সেন্সর মাল্টি-এইচএএল ২.০-এর জন্য প্রয়োজন যে, যখনই ডাইনামিক সেন্সর সংযোগ পরিবর্তিত হয়, IHalProxyCallback এর মধ্যে থাকা onDynamicSensorsConnected এবং onDynamicSensorsDisconnected কলব্যাকগুলো কল করা হয়। এই কলব্যাকগুলো initialize() ফাংশনের মাধ্যমে সরবরাহ করা IHalProxyCallback পয়েন্টারের অংশ হিসেবে পাওয়া যায়।

সেন্সর HAL 1.0 থেকে পোর্ট

Sensors HAL 1.0 থেকে Sensors Multi-HAL 2.0-তে আপগ্রেড করার সময়, নিশ্চিত করুন যে HAL ইমপ্লিমেন্টেশনটি নিম্নলিখিত প্রয়োজনীয়তাগুলো পূরণ করে।

HAL শুরু করুন

সাব-এইচএএল এবং মাল্টি-এইচএএল ইমপ্লিমেন্টেশনের মধ্যে কলব্যাক স্থাপনের জন্য initialize() ফাংশনটি অবশ্যই সমর্থিত হতে হবে।

উপলব্ধ সেন্সরগুলি উন্মোচন করুন

সেন্সর মাল্টি-এইচএএল ২.০-তে, একটিমাত্র ডিভাইস বুটের সময় getSensorsList() ফাংশনটিকে অবশ্যই একই মান রিটার্ন করতে হবে, এমনকি সেন্সর এইচএএল রিস্টার্টের পরেও। এর ফলে সিস্টেম সার্ভার রিস্টার্ট হলে ফ্রেমওয়ার্কটি সেন্সর সংযোগগুলো পুনরায় স্থাপন করার চেষ্টা করতে পারে। ডিভাইসটি রিবুট করার পর getSensorsList() দ্বারা রিটার্ন করা মান পরিবর্তিত হতে পারে।

মাল্টি-এইচএএল বাস্তবায়নে সেন্সর ইভেন্টগুলি পোস্ট করুন

Sensors HAL 2.0-তে, poll() কল হওয়ার জন্য অপেক্ষা করার পরিবর্তে, সাব-HAL-কে অবশ্যই সক্রিয়ভাবে IHalProxyCallback এ সেন্সর ইভেন্টগুলো লিখতে হবে যখনই সেন্সর ইভেন্ট পাওয়া যায়।

ওয়েক_আপ ইভেন্টগুলি

সেন্সরস এইচএএল ১.০-তে, এইচএএল তার নিজস্ব ইমপ্লিমেন্টেশনের জন্য ওয়েক লক পরিচালনা করতে পারে। সেন্সরস মাল্টি-এইচএএল ২.০-তে, সাব-এইচএএলগুলো মাল্টি-এইচএএল ইমপ্লিমেন্টেশনকে ওয়েক লক পরিচালনা করার সুযোগ দেয় এবং createScopedWakelock কল করার মাধ্যমে একটি ওয়েক লক অ্যাকোয়ার করার জন্য অনুরোধ করতে পারে। মাল্টি-এইচএএল ইমপ্লিমেন্টেশনে ওয়েক আপ ইভেন্ট পোস্ট করার সময়, একটি লক করা স্কোপড ওয়েক লক অবশ্যই অ্যাকোয়ার করতে হবে এবং postEvents এ পাস করতে হবে।

ডায়নামিক সেন্সর

Sensors HAL 1.0-এ, ` poll() ফাংশনের মাধ্যমে ডাইনামিক সেন্সরগুলো রিটার্ন করা হয়। Sensors Multi-HAL 2.0-এর জন্য প্রয়োজন যে, যখনই ডাইনামিক সেন্সর সংযোগ পরিবর্তিত হয়, IHalProxyCallback এর মধ্যে থাকা onDynamicSensorsConnected এবং onDynamicSensorsDisconnected কলব্যাকগুলো কল করা হয়। এই কলব্যাকগুলো initialize() ফাংশনের মাধ্যমে সরবরাহ করা IHalProxyCallback পয়েন্টারের অংশ হিসেবে পাওয়া যায়।

সেন্সর মাল্টি-এইচএএল ১.০ থেকে পোর্ট

Sensors Multi-HAL 1.0 থেকে বিদ্যমান কোনো ইমপ্লিমেন্টেশন পোর্ট করতে, এই ধাপগুলো অনুসরণ করুন।

  1. নিশ্চিত করুন যে সেন্সরগুলির HAL কনফিগারেশন /vendor/etc/sensors/hals.conf এ অবস্থিত। এর জন্য /system/etc/sensors/hals.conf এ অবস্থিত ফাইলটি সরানোর প্রয়োজন হতে পারে।
  2. hardware/hardware.h এবং hardware/sensors.h এর সমস্ত উল্লেখ মুছে ফেলুন, কারণ HAL 2.0-এর জন্য এগুলো সমর্থিত নয়।
  3. Sensors Hal 1.0 থেকে পোর্ট করার বর্ণনানুযায়ী সাব-HAL গুলিকে পোর্ট করুন।
  4. 'সেন্সর মাল্টি-এইচএএল ২.০ বাস্তবায়ন' বিভাগের ৩ এবং ৪ নম্বর ধাপ অনুসরণ করে সেন্সর মাল্টি-এইচএএল ২.০-কে নির্ধারিত এইচএএল (HAL) হিসেবে সেট করুন।

বৈধতা

রান ভিটিএস

যখন আপনি Sensors Multi-Hal 2.1-এর সাথে এক বা একাধিক সাব-HAL সংহত করবেন, তখন আপনার সাব-HAL বাস্তবায়নগুলো Sensors HAL ইন্টারফেস দ্বারা নির্ধারিত সমস্ত প্রয়োজনীয়তা পূরণ করছে কিনা তা নিশ্চিত করতে ভেন্ডর টেস্ট স্যুট (VTS) ব্যবহার করুন।

হোস্ট মেশিনে VTS সেট আপ করা থাকলে, শুধুমাত্র সেন্সরগুলির VTS টেস্ট চালানোর জন্য নিম্নলিখিত কমান্ডগুলি চালান:

vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsHalSensorsV2_0Target && \
  vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsHalSensorsV2_1Target

আপনি যদি AIDL Multi-HAL শিম লেয়ারটি ব্যবহার করেন, তাহলে VtsAidlHalSensorsTargetTest চালান।

vts-tradefed run commandAndExit vts \
    --skip-all-system-status-check \
    --primary-abi-only \
    --skip-preconditions \
    --module VtsAidlHalSensorsTargetTest

ইউনিট টেস্ট চালান

HalProxy_test.cpp ফাইলের ইউনিট টেস্টগুলো নকল সাব-HAL ব্যবহার করে HalProxy পরীক্ষা করে, যেগুলো ইউনিট টেস্টের মধ্যেই ইনস্ট্যানশিয়েট করা হয় এবং ডাইনামিকভাবে লোড করা হয় না। একটি নতুন সাব-HAL তৈরি করার সময়, নতুন সাব-HAL-টি সঠিকভাবে ইমপ্লিমেন্ট করা হয়েছে কিনা তা যাচাই করার জন্য ইউনিট টেস্ট কীভাবে যোগ করতে হবে, সে বিষয়ে এই টেস্টগুলো একটি নির্দেশিকা হিসেবে কাজ করবে।

টেস্টগুলো চালানোর জন্য, নিম্নলিখিত কমান্ডগুলো চালান:

cd $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests
atest

নকল সাব-এইচএএল দিয়ে পরীক্ষা করুন

নকল সাব-এইচএএলগুলো হলো ISensorsSubHal ইন্টারফেসের ডামি ইমপ্লিমেন্টেশন। সাব-এইচএএলগুলো বিভিন্ন সেন্সরের তালিকা প্রকাশ করে। যখন সেন্সরগুলো সক্রিয় করা হয়, তখন সেগুলো একটি নির্দিষ্ট সেন্সর অনুরোধে উল্লেখিত বিরতি অনুসারে পর্যায়ক্রমে স্বয়ংক্রিয়ভাবে তৈরি সেন্সর ইভেন্টগুলো HalProxy তে পোস্ট করে।

সিস্টেমে লোড করা অন্যান্য সাব-এইচএএল-এর সাথে সম্পূর্ণ মাল্টি-এইচএএল কোডটি কীভাবে কাজ করে তা পরীক্ষা করতে এবং সেন্সর মাল্টি-এইচএএল কোডের বিভিন্ন দিকের উপর চাপ সৃষ্টি করতে নকল সাব-এইচএএল-গুলো ব্যবহার করা যেতে পারে।

hardware/interfaces/sensors/common/default/2.X/multihal/tests/fake_subhal/ দুটি নকল সাব-এইচএএল (sub-HAL) পাওয়া যাবে।

নকল সাব-এইচএএল তৈরি করে একটি ডিভাইসে পাঠানোর জন্য, নিম্নলিখিত ধাপগুলো অনুসরণ করুন:

  1. ডিভাইসে তিনটি ভিন্ন ফেক সাব-এইচএএল তৈরি ও পুশ করতে নিম্নলিখিত কমান্ডগুলো চালান:

    $ANDROID_BUILD_TOP/hardware/interfaces/sensors/common/default/2.X/multihal/tests/
    mma
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
    adb push \
      $ANDROID_BUILD_TOP/out/target/product/<device>/symbols/vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so \
      /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
  2. ফেক সাব-HAL-গুলোর পাথ দিয়ে /vendor/etc/sensors/hals.conf এ থাকা সেন্সর HAL কনফিগ আপডেট করুন।

    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config1.so
    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config2.so
    /vendor/lib64/android.hardware.sensors@2.X-fakesubhal-config3.so
    
  3. HalProxy পুনরায় চালু করুন এবং কনফিগে তালিকাভুক্ত নতুন সাব-HAL-গুলো লোড করুন।

    adb shell stop
    adb shell start

ডিবাগিং

ডেভেলপাররা lshal কমান্ড ব্যবহার করে ফ্রেমওয়ার্কটি ডিবাগ করতে পারেন। Sensors HAL-এর ডিবাগ আউটপুট অনুরোধ করতে, নিম্নলিখিত কমান্ডটি চালান:

adb root
adb shell lshal debug android.hardware.sensors@2.1::ISensors/default

এরপর HalProxy এবং এর সাব-HAL-গুলোর বর্তমান অবস্থা সম্পর্কিত তথ্য টার্মিনালে আউটপুট করা হয়। নিচে HalProxy অবজেক্ট এবং ফেক সাব-HAL-গুলোর জন্য কমান্ড আউটপুটের একটি উদাহরণ দেখানো হলো।

Internal values:
  Threads are running: true
  Wakelock timeout start time: 200 ms ago
  Wakelock timeout reset time: 73208 ms ago
  Wakelock ref count: 0
  # of events on pending write queue: 0
  # of non-dynamic sensors across all subhals: 8
  # of dynamic sensors across all subhals: 0
SubHals (2):
  Name: FakeSubHal-OnChange
  Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2
  Name: FakeSubHal-OnChange
  Debug dump:
Available sensors:
Name: Ambient Temp Sensor
Min delay: 40000
Flags: 2
Name: Light Sensor
Min delay: 200000
Flags: 2
Name: Proximity Sensor
Min delay: 200000
Flags: 3
Name: Relative Humidity Sensor
Min delay: 40000
Flags: 2

# of events on pending write queue সংখ্যা যদি অনেক বেশি হয় (১০০০ বা তার বেশি), তবে এটি নির্দেশ করে যে সেন্সর ফ্রেমওয়ার্কে লেখার জন্য অনেকগুলো ইভেন্ট অপেক্ষায় রয়েছে। এর থেকে বোঝা যায় যে সেন্সর সার্ভিসটি ডেডলক হয়ে গেছে বা ক্র্যাশ করেছে এবং সেন্সর ইভেন্টগুলো প্রসেস করছে না, অথবা সম্প্রতি কোনো সাব-এইচএএল (sub-HAL) থেকে সেন্সর ইভেন্টের একটি বড় ব্যাচ পোস্ট করা হয়েছে।

যদি ওয়েক লক রেফ কাউন্ট 0 এর বেশি হয়, এর মানে হলো HalProxy একটি ওয়েক লক অর্জন করেছে। এটি কেবল তখনই 0 এর বেশি হওয়া উচিত, যদি ইচ্ছাকৃতভাবে একটি ScopedWakelock ধরে রাখা হয় অথবা যদি HalProxy তে ওয়েকআপ ইভেন্ট পাঠানো হয় এবং সেন্সর ফ্রেমওয়ার্ক দ্বারা তা প্রক্রিয়াজাত না হয়ে থাকে।

HalProxy এর debug মেথডে পাস করা ফাইল ডেসক্রিপ্টরটি প্রতিটি সাব-HAL-এ পাঠানো হয়, তাই ডেভেলপারদের অবশ্যই ISensorsSubHal ইন্টারফেসের অংশ হিসেবে debug মেথডটি ইমপ্লিমেন্ট করতে হবে।