Health 2.1 প্রয়োগ করা

Android 11-এ, সব 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-এর ইমপ্লিমেন্টেশন রেজিস্টার করে। Android 8.x বা 9 ভেন্ডর ইমেজ এবং Android 11 ফ্রেমওয়ার্ক সহ ডিভাইস আপগ্রেড করার সময়, ভেন্ডর ইমেজ health@2.1 পরিষেবা নাও দিতে পারে। পুরনো ভেন্ডর ছবির সাথে ব্যাকওয়ার্ড কম্প্যাটিবিলিটি অবসোলিউট করার শিডিউল দ্বারা এনফোর্স করা হয়।

ব্যাকওয়ার্ড কম্প্যাটিবিলিটি নিশ্চিত করতে:

  1. healthd সিস্টেম ডেমন হওয়া সত্ত্বেও IHealth-কে hwservicemanager-এ রেজিস্টার করে। IHealth সিস্টেম ম্যানিফেস্টে যোগ করা হয়েছে, যার ইনস্ট্যান্সের নাম "backup"।
  2. ফ্রেমওয়ার্ক ও storaged binder-এর পরিবর্তে hwbinder-এর মাধ্যমে healthd-এর সাথে যোগাযোগ করে।
  3. ফ্রেমওয়ার্কের কোড এবং storaged পরিবর্তন করে ইনস্ট্যান্স "default" আনা হয়েছে, উপলভ্য থাকলে, তারপর "backup" আনা হয়েছে।
    • C++ ক্লায়েন্ট কোড libhealthhalutils-এ সংজ্ঞায়িত লজিক ব্যবহার করে।
    • Java ক্লায়েন্ট কোড HealthServiceWrapper-এ সংজ্ঞায়িত যুক্তি ব্যবহার করে।
  4. iHealth/default ব্যাপকভাবে উপলভ্য হওয়ার পরে এবং Android 8.1 ভেন্ডর ইমেজ পুরনো হয়ে গেলে, iHealth/backup এবং healthd পুরনো হয়ে যেতে পারে।

healthd-এর জন্য বোর্ড-নির্দিষ্ট বিল্ড ভেরিয়েবল

BOARD_PERIODIC_CHORES_INTERVAL_* হল বোর্ড-নির্দিষ্ট ভেরিয়েবল যা healthd তৈরি করতে ব্যবহার করা হয়। সিস্টেম/ভেন্ডর বিল্ড স্প্লিটের অংশ হিসেবে, সিস্টেম মডিউলের জন্য বোর্ড-নির্দিষ্ট ভ্যালু নির্ধারণ করা যাবে না। এই ভ্যালুগুলি আগে healthd_board_init ফাংশনে ওভাররাইড করা হতো, যা এখন আর ব্যবহার করা হয় না।

health@2.1-এ, ভেন্ডররা এই দুটি পর্যায়ক্রমিক কাজের ব্যবধানের মান healthd_config স্ট্রাক্টে ওভাররাইড করতে পারেন, স্বাস্থ্য বাস্তবায়ন ক্লাস কনস্ট্রাক্টরে পাস করার আগে। স্বাস্থ্য ইমপ্লিমেন্টেশন ক্লাসকে android::hardware::health::V2_1::implementation::Health থেকে ইনহেরিট করতে হবে।

Health 2.1 পরিষেবা প্রয়োগ করুন

Health 2.1 পরিষেবা প্রয়োগ করা সংক্রান্ত তথ্যের জন্য, 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.getProperty, healthd-এর দ্বারা প্রদান করা হয়েছে এবং সরাসরি /sys/class/power_supply পড়ে।

    নিরাপত্তার কথা বিবেচনা করে, অ্যাপগুলিকে সরাসরি হেলথ HAL কল করার অনুমতি দেওয়া হয় না। Android 9 ও তার পরবর্তী ভার্সনে, বাইন্ডার পরিষেবা IBatteryPropertiesRegistrar, healthd-এর পরিবর্তে BatteryService-এর মাধ্যমে প্রদান করা হয়। BatteryService অনুরোধ করা তথ্য পেতে হেলথ HAL-কে কল ডেলিগেট করে।

  • BatteryService. Android 9 ও তার পরবর্তী যেকোনও ভার্সনে, BatteryService HealthServiceWrapper ব্যবহার করে এটি নির্ধারণ করে যে vendor থেকে ডিফল্ট হেলথ পরিষেবা ইনস্ট্যান্স ব্যবহার করা হবে নাকি healthd থেকে ব্যাক-আপ হেলথ পরিষেবা ইনস্ট্যান্স ব্যবহার করা হবে। BatteryService তারপর IHealth.registerCallback-এর মাধ্যমে স্বাস্থ্য সম্পর্কিত ইভেন্ট শোনে।

  • স্টোরেজ করা হয়েছে। Android 9 ও তার পরবর্তী যেকোনও ভার্সনে, storaged vendor থেকে ডিফল্ট হেলথ পরিষেবা ইনস্ট্যান্স ব্যবহার করা হবে নাকি healthd থেকে ব্যাক-আপ হেলথ পরিষেবা ইনস্ট্যান্স ব্যবহার করা হবে তা নির্ধারণ করতে libhealthhalutils ব্যবহার করে। storaged তারপর IHealth.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 (Health 2.1-এ যোগ করা হয়েছে)
  • /sys/class/power_supply/*/capacity
  • /sys/class/power_supply/*/charge_counter
  • /sys/class/power_supply/*/charge_full
  • /sys/class/power_supply/*/charge_full_design (Health 2.1-এ যোগ করা হয়েছে)
  • /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 (Health 2.1-এ যোগ করা হয়েছে)
  • /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 চেরি-পিক করার সাজেশন দেওয়া হয়।

পরীক্ষা করা

Android 11-এ নতুন VTS টেস্ট অন্তর্ভুক্ত আছে যা বিশেষভাবে health@2.1 HAL-এর জন্য লেখা হয়েছে। কোনও ডিভাইস, ডিভাইস ম্যানিফেস্টে health@2.1 HAL ঘোষণা করলে, সেটিকে অবশ্যই সংশ্লিষ্ট VTS পরীক্ষা পাস করতে হবে। ডিফল্ট ইনস্ট্যান্স (ডিভাইসটি HAL সঠিকভাবে প্রয়োগ করে কিনা তা নিশ্চিত করতে) এবং ব্যাক-আপ ইনস্ট্যান্স (এটি সরিয়ে দেওয়ার আগে healthd সঠিকভাবে কাজ করা চালিয়ে যায় কিনা তা নিশ্চিত করতে) দুটির জন্যই টেস্ট লেখা হয়।

ব্যাটারি সংক্রান্ত তথ্য সম্পর্কিত প্রয়োজনীয়তা

Health 2.0 HAL, HAL ইন্টারফেসে প্রয়োজনীয়তার একটি সেট উল্লেখ করে, কিন্তু সেগুলি প্রয়োগ করার ক্ষেত্রে সংশ্লিষ্ট VTS পরীক্ষা তুলনামূলকভাবে শিথিল। Android 11-এ, Android 11 ও এর পরের যেকোনও ভার্সন দিয়ে লঞ্চ করা ডিভাইসে নিম্নলিখিত প্রয়োজনীয়তা এনফোর্স করতে নতুন VTS টেস্ট যোগ করা হয়েছে:

  • ইনস্ট্যান্টেনিয়াস ও গড় ব্যাটারি কারেন্টের ইউনিট মাইক্রোঅ্যাম্প (μA) হতে হবে।
  • ইনস্ট্যান্টেনিয়াস ও গড় ব্যাটারি কারেন্টের চিহ্ন সঠিক হতে হবে। নির্দিষ্টভাবে:
    • ব্যাটারি স্ট্যাটাস UNKNOWN হলে current == 0
    • ব্যাটারির স্ট্যাটাস CHARGING হলে কারেন্ট > ০
    • ব্যাটারি স্ট্যাটাস NOT_CHARGING হলে কারেন্ট <= 0
    • ব্যাটারি স্ট্যাটাস DISCHARGING হলে কারেন্ট < 0 হয়
    • ব্যাটারি স্ট্যাটাস 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_now-কে ১০০০ দিয়ে ভাগ করে এবং মিলিভোল্ট (mV)-এ ভ্যালু রিপোর্ট করে। @1.0::HealthInfo দেখুন।

আরও বিবরণের জন্য, Linux পাওয়ার সাপ্লাই ক্লাস দেখুন।