অ্যান্ড্রয়েড ১১-এ, healthd সমস্ত কোড libhealthloop এবং libhealth2impl এ রিফ্যাক্টর করা হয় এবং তারপর health@2.1 HAL ইমপ্লিমেন্ট করার জন্য পরিবর্তন করা হয়। এই দুটি লাইব্রেরি health@2.0-impl-2.1 দ্বারা স্ট্যাটিক্যালি লিঙ্ক করা হয়, যা Health 2.1-এর পাসথ্রু ইমপ্লিমেন্টেশন। স্ট্যাটিক্যালি লিঙ্ক করা লাইব্রেরিগুলো health@2.0-impl-2.1 healthd মতোই কাজ করতে সক্ষম করে, যেমন healthd_mainloop চালানো এবং পোলিং করা। init-এর সময়, health@2.1-service hwservicemanager এ IHealth ইন্টারফেসের একটি ইমপ্লিমেন্টেশন রেজিস্টার করে। অ্যান্ড্রয়েড ৮.x বা ৯ ভেন্ডর ইমেজ এবং অ্যান্ড্রয়েড ১১ ফ্রেমওয়ার্কসহ ডিভাইস আপগ্রেড করার সময়, ভেন্ডর ইমেজটি health@2.1 সার্ভিসটি নাও দিতে পারে। পুরোনো ভেন্ডর ইমেজগুলোর সাথে ব্যাকওয়ার্ড কম্প্যাটিবিলিটি ডেপ্রিকেশন শিডিউল দ্বারা নিশ্চিত করা হয়।
পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্য নিশ্চিত করতে:
- সিস্টেম ডেমন হওয়া সত্ত্বেও,
healthdIHealthকেhwservicemanagerএ রেজিস্টার করে।IHealthসিস্টেম ম্যানিফেস্টে "backup" ইনস্ট্যান্স নামটি দিয়ে যুক্ত করা হয়। - ফ্রেমওয়ার্ক এবং
storagedbinderপরিবর্তেhwbinderমাধ্যমেhealthdসাথে যোগাযোগ করে। - framework এবং
storagedএর কোড পরিবর্তন করা হয়েছে, যাতে এটি উপলব্ধ থাকলে প্রথমে 'default' ইনস্ট্যান্স এবং তারপর 'backup' ইনস্ট্যান্সটি ফেচ করে।- C++ ক্লায়েন্ট কোড
libhealthhalutilsএ সংজ্ঞায়িত লজিক ব্যবহার করে। - জাভা ক্লায়েন্ট কোড
HealthServiceWrapperএ সংজ্ঞায়িত লজিক ব্যবহার করে।
- C++ ক্লায়েন্ট কোড
- IHealth/default ব্যাপকভাবে সহজলভ্য হওয়ার পর এবং Android 8.1 ভেন্ডর ইমেজগুলো অপ্রচলিত হয়ে গেলে, IHealth/backup এবং
healthdও অপ্রচলিত হয়ে যেতে পারে।
হেলথডি-এর জন্য বোর্ড-নির্দিষ্ট বিল্ড ভেরিয়েবল
BOARD_PERIODIC_CHORES_INTERVAL_* হলো বোর্ড-নির্দিষ্ট ভেরিয়েবল যা healthd বিল্ড করতে ব্যবহৃত হয়। সিস্টেম/ভেন্ডর বিল্ড বিভাজনের অংশ হিসেবে, সিস্টেম মডিউলগুলোর জন্য বোর্ড-নির্দিষ্ট মান সংজ্ঞায়িত করা যায় না । এই মানগুলো পূর্বে অপ্রচলিত ফাংশন healthd_board_init এ ওভাররাইড করা হতো।
health@2.1-এ, ভেন্ডররা health ইমপ্লিমেন্টেশন ক্লাসের কনস্ট্রাক্টরে পাস করার আগে healthd_config স্ট্রাকচারে এই দুটি পর্যায়ক্রমিক কাজের ব্যবধানের মান ওভাররাইড করতে পারে। health ইমপ্লিমেন্টেশন ক্লাসটিকে অবশ্যই android::hardware::health::V2_1::implementation::Health থেকে ইনহেরিট করতে হবে।
স্বাস্থ্য ২.১ পরিষেবাটি বাস্তবায়ন করুন
হেলথ ২.১ সার্ভিসটি বাস্তবায়ন করার তথ্যের জন্য, hardware/interfaces/health/2.1/README.md দেখুন।
স্বাস্থ্য গ্রাহকদের
health@2.x-এর নিম্নলিখিত ক্লায়েন্ট রয়েছে:
- চার্জার।
libbatterymonitorএবংhealthd_commonকোডের ব্যবহারhealth@2.0-implএর মধ্যে অন্তর্ভুক্ত করা হয়েছে। - পুনরুদ্ধার।
libbatterymonitorএর সাথে সংযোগটিhealth@2.0-implএর মধ্যে মোড়ানো আছে।BatteryMonitorএর সমস্ত কলHealthইমপ্লিমেন্টেশন ক্লাসের কল দ্বারা প্রতিস্থাপিত হয়। BatteryManager.
BatteryManager.queryProperty(int id)ছিলIBatteryPropertiesRegistrar.getPropertyএর একমাত্র ক্লায়েন্ট।IBatteryPropertiesRegistrar.getPropertyhealthdসরবরাহ করত এবং এটি সরাসরি/sys/class/power_supplyথেকে ডেটা পড়ত।নিরাপত্তাজনিত কারণে, অ্যাপগুলোকে সরাসরি হেলথ HAL-এ কল করার অনুমতি দেওয়া হয় না। অ্যান্ড্রয়েড ৯ এবং এর পরবর্তী সংস্করণগুলোতে,
IBatteryPropertiesRegistrarবাইন্ডার সার্ভিসটিhealthdএর পরিবর্তেBatteryServiceদ্বারা সরবরাহ করা হয়। অনুরোধকৃত তথ্য পুনরুদ্ধার করার জন্যBatteryServiceকল করার দায়িত্বটি হেলথ HAL-এর ওপর অর্পণ করে।BatteryService। অ্যান্ড্রয়েড ৯ এবং এর পরবর্তী সংস্করণগুলিতে,
BatteryServiceভেন্ডরের ডিফল্ট হেলথ সার্ভিস ইনস্ট্যান্স ব্যবহার করবে, নাকিvendorhealthdথেকে ব্যাকআপ হেলথ সার্ভিস ইনস্ট্যান্স ব্যবহার করবে, তা নির্ধারণ করতেHealthServiceWrapperব্যবহার করে। এরপরBatteryServiceIHealth.registerCallbackএর মাধ্যমে হেলথ ইভেন্টগুলির জন্য অপেক্ষা করে।স্টোরেজড (Stored) অ্যান্ড্রয়েড ৯ এবং এর পরবর্তী সংস্করণগুলিতে,
vendorডিফল্ট হেলথ সার্ভিস ইনস্ট্যান্স ব্যবহার করবে নাকিhealthdএর ব্যাকআপ হেলথ সার্ভিস ইনস্ট্যান্স ব্যবহার করবে, তা নির্ধারণ করতেstoragedlibhealthhalutilsব্যবহার করে। এরপরstoragedIHealth.registerCallbackএর মাধ্যমে হেলথ ইভেন্ট শোনে এবং স্টোরেজের তথ্য সংগ্রহ করে।
SELinux পরিবর্তন
health@2.1 HAL-এ প্ল্যাটফর্মে নিম্নলিখিত SELinux পরিবর্তনগুলো অন্তর্ভুক্ত রয়েছে:
-
file_contextsএandroid.hardware.health@2.1-serviceযোগ করে।
যেসব ডিভাইসের নিজস্ব বাস্তবায়ন রয়েছে, সেগুলোর ক্ষেত্রে বিক্রেতার SELinux-এ কিছু পরিবর্তন প্রয়োজন হতে পারে। উদাহরণ:
# device/<manufacturer>/<device>/sepolicy/vendor/hal_health_default.te
# Add device specific permissions to hal_health_default domain, especially
# if it links to board-specific libhealthd or implements storage APIs.
কার্নেল ইন্টারফেস
healthd ডেমন এবং এর ডিফল্ট ইমপ্লিমেন্টেশন android.hardware.health@2.0-impl-2.1 ব্যাটারির তথ্য সংগ্রহের জন্য নিম্নলিখিত কার্নেল ইন্টারফেসগুলো অ্যাক্সেস করে:
-
/sys/class/power_supply/*/capacity_level(হেলথ ২.১-এ যোগ করা হয়েছে) -
/sys/class/power_supply/*/capacity -
/sys/class/power_supply/*/charge_counter -
/sys/class/power_supply/*/charge_full -
/sys/class/power_supply/*/charge_full_design(হেলথ ২.১-এ যোগ করা হয়েছে) -
/sys/class/power_supply/*/current_avg -
/sys/class/power_supply/*/current_max -
/sys/class/power_supply/*/current_now -
/sys/class/power_supply/*/cycle_count -
/sys/class/power_supply/*/health -
/sys/class/power_supply/*/online -
/sys/class/power_supply/*/present -
/sys/class/power_supply/*/status -
/sys/class/power_supply/*/technology -
/sys/class/power_supply/*/temp -
/sys/class/power_supply/*/time_to_full_now(হেলথ ২.১-এ যোগ করা হয়েছে) -
/sys/class/power_supply/*/type -
/sys/class/power_supply/*/voltage_max -
/sys/class/power_supply/*/voltage_now
যেকোনো ডিভাইস-নির্দিষ্ট হেলথ HAL ইমপ্লিমেন্টেশন যা libbatterymonitor ব্যবহার করে, তা ডিফল্টরূপে এই কার্নেল ইন্টারফেসগুলো অ্যাক্সেস করে, যদি না হেলথ ইমপ্লিমেন্টেশন ক্লাসের কনস্ট্রাক্টরে তা ওভাররাইড করা হয়।
যদি এই ফাইলগুলি অনুপস্থিত থাকে অথবা healthd বা ডিফল্ট পরিষেবা থেকে অ্যাক্সেসযোগ্য না হয় (উদাহরণস্বরূপ, ফাইলটি কোনো ভেন্ডর-নির্দিষ্ট ফোল্ডারের একটি সিমলিঙ্ক যা ভুলভাবে কনফিগার করা SELinux পলিসির কারণে অ্যাক্সেস অস্বীকার করে), তাহলে সেগুলি সঠিকভাবে কাজ নাও করতে পারে। তাই ডিফল্ট ইমপ্লিমেন্টেশন ব্যবহার করা হলেও অতিরিক্ত ভেন্ডর-নির্দিষ্ট SELinux পরিবর্তনের প্রয়োজন হতে পারে।
Health 2.1-এ ব্যবহৃত কিছু কার্নেল ইন্টারফেস, যেমন /sys/class/power_supply/*/capacity_level এবং /sys/class/power_supply/*/time_to_full_now , ঐচ্ছিক হতে পারে। তবে, অনুপস্থিত কার্নেল ইন্টারফেসের কারণে ফ্রেমওয়ার্কের ভুল আচরণ প্রতিরোধ করার জন্য, Health HAL 2.1 সার্ভিসটি বিল্ড করার আগে CL 1398913 চেরি-পিক করার পরামর্শ দেওয়া হয়।
পরীক্ষা
অ্যান্ড্রয়েড ১১-এ health@2.1 HAL-এর জন্য বিশেষভাবে লেখা নতুন VTS টেস্ট অন্তর্ভুক্ত করা হয়েছে। যদি কোনো ডিভাইস তার ডিভাইস ম্যানিফেস্টে health@2.1 HAL ঘোষণা করে, তবে তাকে অবশ্যই সংশ্লিষ্ট VTS টেস্টগুলো পাস করতে হবে। এই টেস্টগুলো ডিফল্ট ইনস্ট্যান্স (ডিভাইসটি HAL সঠিকভাবে প্রয়োগ করছে কিনা তা নিশ্চিত করতে) এবং ব্যাকআপ ইনস্ট্যান্স (এটি সরিয়ে ফেলার আগে healthd সঠিকভাবে কাজ করে চলেছে কিনা তা নিশ্চিত করতে) উভয়ের জন্যই লেখা হয়েছে।
ব্যাটারি সংক্রান্ত তথ্যের প্রয়োজনীয়তা
হেলথ ২.০ এইচএএল (Health 2.0 HAL) ইন্টারফেসের জন্য কিছু আবশ্যিক শর্ত উল্লেখ করে, কিন্তু সংশ্লিষ্ট ভিটিএস (VTS) টেস্টগুলো সেগুলো প্রয়োগের ক্ষেত্রে তুলনামূলকভাবে শিথিল। অ্যান্ড্রয়েড ১১-এ, অ্যান্ড্রয়েড ১১ এবং তার পরবর্তী সংস্করণসহ চালু হওয়া ডিভাইসগুলোতে নিম্নলিখিত আবশ্যিক শর্তগুলো প্রয়োগ করার জন্য নতুন ভিটিএস টেস্ট যুক্ত করা হয়েছে:
- ব্যাটারির মোট এবং গড় তড়িৎ প্রবাহের একক অবশ্যই মাইক্রোঅ্যাম্পিয়ার (μA) হতে হবে।
- তাৎক্ষণিক ও গড় ব্যাটারি কারেন্টের চিহ্ন অবশ্যই সঠিক হতে হবে। বিশেষত:
- ব্যাটারির অবস্থা
UNKNOWNথাকলে কারেন্ট == ০ - ব্যাটারির অবস্থা
CHARGINGথাকলে কারেন্ট > ০ - ব্যাটারির অবস্থা চার্জ হচ্ছে
NOT_CHARGINGহলে কারেন্ট <= 0 - ব্যাটারির অবস্থা
DISCHARGINGহলে কারেন্ট < ০ - ব্যাটারির অবস্থা
FULLহলে এটি কার্যকর হয় না।
- ব্যাটারির অবস্থা
- বিদ্যুৎ উৎস সংযুক্ত থাকুক বা না থাকুক, ব্যাটারির অবস্থা অবশ্যই সঠিক হতে হবে। বিশেষত:
- যদি কোনো পাওয়ার সোর্স সংযুক্ত থাকে, তবেই ব্যাটারির স্ট্যাটাস অবশ্যই
CHARGING,NOT_CHARGINGবাFULLএর মধ্যে যেকোনো একটি হতে হবে। - শুধুমাত্র বিদ্যুৎ সংযোগ বিচ্ছিন্ন করা হলেই ব্যাটারির অবস্থা
DISCHARGINGহতে হবে।
- যদি কোনো পাওয়ার সোর্স সংযুক্ত থাকে, তবেই ব্যাটারির স্ট্যাটাস অবশ্যই
আপনার বাস্তবায়নে যদি আপনি libbatterymonitor ব্যবহার করেন এবং কার্নেল ইন্টারফেস থেকে মান প্রেরণ করেন, তবে নিশ্চিত করুন যে sysfs নোডগুলি সঠিক মান রিপোর্ট করছে:
- ব্যাটারির কারেন্ট সঠিক চিহ্ন এবং একক সহ রিপোর্ট করা নিশ্চিত করুন। এর মধ্যে নিম্নলিখিত sysfs নোডগুলি অন্তর্ভুক্ত রয়েছে:
-
/sys/class/power_supply/*/current_avg -
/sys/class/power_supply/*/current_max -
/sys/class/power_supply/*/current_now - ধনাত্মক মান ব্যাটারিতে আগত বিদ্যুৎ প্রবাহ নির্দেশ করে।
- মানগুলো মাইক্রোঅ্যাম্পিয়ার (μA) এককে হতে হবে।
-
- ব্যাটারির ভোল্টেজ মাইক্রোভোল্টে (μV) রিপোর্ট করা নিশ্চিত করুন। এর মধ্যে নিম্নলিখিত sysfs নোডগুলো অন্তর্ভুক্ত:
-
/sys/class/power_supply/*/voltage_max -
/sys/class/power_supply/*/voltage_now - উল্লেখ্য যে, ডিফল্ট HAL ইমপ্লিমেন্টেশন
voltage_now1000 দিয়ে ভাগ করে মানগুলো মিলভোল্টে (mV) প্রকাশ করে। @1.0::HealthInfo দেখুন।
-
বিস্তারিত জানতে লিনাক্স পাওয়ার সাপ্লাই ক্লাস দেখুন।