স্বাস্থ্য 2.1 বাস্তবায়ন করুন

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

পূর্ববর্তী সংস্করণের সাথে সামঞ্জস্য নিশ্চিত করতে:

  1. সিস্টেম ডেমন হওয়া সত্ত্বেও, healthd IHealth কে hwservicemanager এ রেজিস্টার করে। IHealth সিস্টেম ম্যানিফেস্টে "backup" ইনস্ট্যান্স নামটি দিয়ে যুক্ত করা হয়।
  2. ফ্রেমওয়ার্ক এবং storaged binder পরিবর্তে hwbinder মাধ্যমে healthd সাথে যোগাযোগ করে।
  3. framework এবং storaged এর কোড পরিবর্তন করা হয়েছে, যাতে এটি উপলব্ধ থাকলে প্রথমে 'default' ইনস্ট্যান্স এবং তারপর 'backup' ইনস্ট্যান্সটি ফেচ করে।
    • C++ ক্লায়েন্ট কোড libhealthhalutils এ সংজ্ঞায়িত লজিক ব্যবহার করে।
    • জাভা ক্লায়েন্ট কোড HealthServiceWrapper এ সংজ্ঞায়িত লজিক ব্যবহার করে।
  4. 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.getProperty healthd সরবরাহ করত এবং এটি সরাসরি /sys/class/power_supply থেকে ডেটা পড়ত।

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

  • BatteryService। অ্যান্ড্রয়েড ৯ এবং এর পরবর্তী সংস্করণগুলিতে, BatteryService ভেন্ডরের ডিফল্ট হেলথ সার্ভিস ইনস্ট্যান্স ব্যবহার করবে, নাকি vendor healthd থেকে ব্যাকআপ হেলথ সার্ভিস ইনস্ট্যান্স ব্যবহার করবে, তা নির্ধারণ করতে HealthServiceWrapper ব্যবহার করে। এরপর BatteryService IHealth.registerCallback এর মাধ্যমে হেলথ ইভেন্টগুলির জন্য অপেক্ষা করে।

  • স্টোরেজড (Stored) অ্যান্ড্রয়েড ৯ এবং এর পরবর্তী সংস্করণগুলিতে, vendor ডিফল্ট হেলথ সার্ভিস ইনস্ট্যান্স ব্যবহার করবে নাকি healthd এর ব্যাকআপ হেলথ সার্ভিস ইনস্ট্যান্স ব্যবহার করবে, তা নির্ধারণ করতে storaged libhealthhalutils ব্যবহার করে। এরপর storaged IHealth.registerCallback এর মাধ্যমে হেলথ ইভেন্ট শোনে এবং স্টোরেজের তথ্য সংগ্রহ করে।

SELinux পরিবর্তন

health@2.1 HAL-এ প্ল্যাটফর্মে নিম্নলিখিত SELinux পরিবর্তনগুলো অন্তর্ভুক্ত রয়েছে:

  • file_contextsandroid.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_now 1000 দিয়ে ভাগ করে মানগুলো মিলভোল্টে (mV) প্রকাশ করে। @1.0::HealthInfo দেখুন।

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