স্বাস্থ্য 2.0 বাস্তবায়ন করা

সমস্ত healthd কোডকে health@2.0-impl এবং libhealthservice এ রিফ্যাক্টর করা হয়েছে, তারপর health@2.0 HAL বাস্তবায়নের জন্য সংশোধন করা হয়েছে। এই দুটি লাইব্রেরি স্বাস্থ্য@2.0-সার্ভিস দ্বারা স্থিরভাবে সংযুক্ত রয়েছে, এটিকে healthd দ্বারা পূর্বে করা কাজগুলি করতে সক্ষম করে (যেমন healthd_mainloop চালান এবং পোলিং করুন)। init, health@2.0-service ইন্টারফেস IHealth এর বাস্তবায়ন hwservicemanager এর কাছে নিবন্ধন করে। একটি Android 8.x ভেন্ডর ইমেজ এবং একটি Android 9 ফ্রেমওয়ার্ক সহ ডিভাইসগুলি আপগ্রেড করার সময়, বিক্রেতা ইমেজ দ্বারা health@2.0 পরিষেবা প্রদান করা নাও হতে পারে৷ এটি অবচয় শিডিউল দ্বারা প্রয়োগ করা হয়৷

এই সমস্যা সমাধানের জন্য:

  1. healthd রেজিস্টার করে IHealth কে hwservicemanager (একটি সিস্টেম ডেমন হওয়া সত্ত্বেও)। IHealth সিস্টেম ম্যানিফেস্টে যোগ করা হয়েছে, উদাহরণ নাম "ব্যাকআপ" সহ।
  2. ফ্রেমওয়ার্ক এবং storaged binder পরিবর্তে hwbinder মাধ্যমে healthd সাথে যোগাযোগ করে।
  3. ফ্রেমওয়ার্ক এবং storaged জন্য কোড পরিবর্তন করা হয় যদি পাওয়া যায় তাহলে "ডিফল্ট" ইনস্ট্যান্স আনতে, তারপর "ব্যাকআপ"।
    • C++ ক্লায়েন্ট কোড libhealthhalutils এ সংজ্ঞায়িত যুক্তি ব্যবহার করে।
    • Java ক্লায়েন্ট কোড HealthServiceWrapper এ সংজ্ঞায়িত যুক্তি ব্যবহার করে।
  4. IHealth/ডিফল্ট ব্যাপকভাবে উপলভ্য হওয়ার পরে এবং Android 8.1 বিক্রেতার ছবিগুলি অবমূল্যায়িত হওয়ার পরে, IHealth/ব্যাকআপ এবং healthd অবচয় করা যেতে পারে। আরও বিশদ বিবরণের জন্য, স্বাস্থ্য অবনমন @1.0 দেখুন।

স্বাস্থ্যের জন্য বোর্ড-নির্দিষ্ট বিল্ড ভেরিয়েবল

BOARD_PERIODIC_CHORES_INTERVAL_* হল বোর্ড-নির্দিষ্ট ভেরিয়েবল যা healthd তৈরি করতে ব্যবহৃত হয়। সিস্টেম/ভেন্ডার বিল্ড স্প্লিটের অংশ হিসেবে, সিস্টেম মডিউলের জন্য বোর্ড-নির্দিষ্ট মান সংজ্ঞায়িত করা যাবে না । health@2.0-এ, বিক্রেতারা healthd_mode_ops->init এ এই দুটি মানকে ওভাররাইড করতে পারে ( health@2.0-service.<device>libhealthservice নির্ভরতা বাদ দিয়ে।<device> এবং এই ফাংশনটি পুনরায় প্রয়োগ করে)।

স্ট্যাটিক বাস্তবায়ন লাইব্রেরি

অন্যান্য এইচএএল বাস্তবায়ন লাইব্রেরি থেকে ভিন্ন, ইমপ্লিমেন্টেশন লাইব্রেরি health@2.0-impl হল একটি স্ট্যাটিক লাইব্রেরি যেখানে health@2.0-সার্ভিস, চার্জার, রিকভারি এবং লিগ্যাসি হেলথ লিংক।

health@2.0.impl উপরে বর্ণিত হিসাবে IHealth প্রয়োগ করে এবং libbatterymonitor এবং libhealthd. BOARD health@2.0-impl-এর এই ব্যবহারকারীরা অবশ্যই BatteryMonitor বা libhealthd এর ফাংশন সরাসরি ব্যবহার করবেন না; পরিবর্তে, এই কলগুলিকে Health শ্রেণীতে কল দিয়ে প্রতিস্থাপিত করা উচিত, এটি IHealth ইন্টারফেসের একটি বাস্তবায়ন। আরও সাধারণীকরণের জন্য, healthd_common কোডটি health@2.0-impl-এও অন্তর্ভুক্ত করা হয়েছে। নতুন healthd_common health@2.0-সার্ভিস, চার্জার এবং healthd এর মধ্যে বাকি সাধারণ কোড রয়েছে এবং ব্যাটারি মনিটরের পরিবর্তে IHealth পদ্ধতিতে কল করা হয়েছে।

স্বাস্থ্য 2.0 পরিষেবা বাস্তবায়ন করা

একটি ডিভাইসের জন্য health@2.0 পরিষেবা বাস্তবায়ন করার সময়, যদি ডিফল্ট বাস্তবায়ন হয়:

  • ডিভাইসের জন্য যথেষ্ট, সরাসরি android.hardware.health@2.0-service ব্যবহার করুন।
  • ডিভাইসের জন্য যথেষ্ট নয়, android.hardware.health@2.0-service.(device) এক্সিকিউটেবল তৈরি করুন এবং এতে অন্তর্ভুক্ত করুন:

    #include <health2/service.h>
    int main() { return health_service_main(); }
    

তারপর:

  • যদি বোর্ড-নির্দিষ্ট libhealthd:

    • বিদ্যমান, এটি লিঙ্ক.
    • বিদ্যমান নেই, healthd_board_init এবং healthd_board_battery_update ফাংশনের জন্য খালি বাস্তবায়ন প্রদান করুন।
  • যদি বোর্ড-নির্দিষ্ট BOARD_PERIODIC_CHORES_INTERVAL_* ভেরিয়েবল:

    • সংজ্ঞায়িত করা হয়েছে, একটি ডিভাইস-নির্দিষ্ট HealthServiceCommon.cpp তৈরি করুন ( hardware/interfaces/health/2.0/utils/libhealthservice থেকে অনুলিপি করা হয়েছে) এবং এটি healthd_mode_service_2_0_init এ কাস্টমাইজ করুন।
    • সংজ্ঞায়িত করা হয় না, স্থিরভাবে libhealthservice লিঙ্ক.
  • যদি ডিভাইস:

    • getStorageInfo এবং getDiskStats API প্রয়োগ করা উচিত, get_storage_info এবং get_disk_stats ফাংশনে বাস্তবায়ন প্রদান করুন।
    • সেই APIগুলি বাস্তবায়ন করা উচিত নয়, libstoragehealthdefault স্থিরভাবে লিঙ্ক করুন।
  • প্রয়োজনীয় SELinux অনুমতি আপডেট করুন।

  • রিকভারি ইমেজে পাসথ্রু ইমপ্লিমেন্টেশন ইনস্টল করে পুনরুদ্ধারের ক্ষেত্রে HAL প্রয়োগ করুন। উদাহরণ:

    // Android.bp
    cc_library_shared {
        name: "android.hardware.health@2.0-impl-<device>",
        recovery_available: true,
        relative_install_path: "hw",
        static_libs: [
            "android.hardware.health@2.0-impl",
            "libhealthd.<device>"
            // Include the following or implement device-specific storage APIs
            "libhealthstoragedefault",
        ],
        srcs: [
            "HealthImpl.cpp",
        ],
        overrides: [
            "android.hardware.health@2.0-impl-default",
        ],
    }
    
    // HealthImpl.cpp
    #include <health2/Health.h>
    #include <healthd/healthd.h>
    using android::hardware::health::V2_0::IHealth;
    using android::hardware::health::V2_0::implementation::Health;
    extern "C" IHealth* HIDL_FETCH_IHealth(const char* name) {
        const static std::string providedInstance{"default"};
        if (providedInstance != name) return nullptr;
        return Health::initInstance(&gHealthdConfig).get();
    }
    
    # device.mk
    PRODUCT_PACKAGES += android.hardware.health@2.0-impl-<device>
    

বিস্তারিত জানার জন্য, hardware/interfaces/health/2.0/README.md দেখুন।

স্বাস্থ্য ক্লায়েন্ট

স্বাস্থ্যের জন্য স্বাস্থ্য ক্লায়েন্ট দেখুন 2.1 HAL

SELinux পরিবর্তন

নতুন health@2.0 HAL-তে নিম্নলিখিত SELinux পরিবর্তনগুলি অন্তর্ভুক্ত রয়েছে:

  • file_contexts এ health@2.0-সার্ভিস যোগ করে।
  • system_server এবং storaged hal_health ব্যবহার করার অনুমতি দেয়।
  • system_server ( BatteryService ) কে batteryproperties_service ( IBatteryPropertiesRegistrar ) নিবন্ধনের অনুমতি দেয়।
  • healthd hal_health প্রদানের অনুমতি দেয়।
  • system_server / storaged বাইন্ডারের মাধ্যমে healthd করার অনুমতি দেয় এমন নিয়মগুলি সরিয়ে দেয়।
  • নিয়মগুলি সরিয়ে দেয় যেগুলি healthd batteryproperties_service ( IBatteryPropertiesRegistrar ) নিবন্ধন করার অনুমতি দেয়৷

তাদের নিজস্ব বাস্তবায়ন সহ ডিভাইসগুলির জন্য, কিছু বিক্রেতা SELinux পরিবর্তন প্রয়োজন হতে পারে। উদাহরণ:

# device/<manufacturer>/<device>/sepolicy/vendor/file_contexts
/vendor/bin/hw/android\.hardware\.health@2\.0-service.<device> u:object_r:hal_health_default_exec:s0

# 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.

কার্নেল ইন্টারফেস

স্বাস্থ্য 2.1 HAL এর জন্য কার্নেল ইন্টারফেস দেখুন।

পরীক্ষামূলক

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

ব্যাটারি তথ্য প্রয়োজনীয়তা

ব্যাটারির তথ্যের প্রয়োজনীয়তা দেখুন।