สุขภาพ Android

Android 9 มี android.hardware.health HAL 2.0 ซึ่งเป็นเวอร์ชันหลักที่อัปเกรดจาก health@1.0 HAL HAL ใหม่นี้มีข้อดีดังต่อไปนี้:

  • การแยกระหว่างกรอบงานและรหัสผู้ขายชัดเจนขึ้น
  • เลิกใช้ healthd daemon ที่ไม่จำเป็น
  • ระดับอิสระที่มากขึ้นสำหรับการปรับแต่งผู้จำหน่ายในรายงานข้อมูลสุขภาพ
  • ข้อมูลความสมบูรณ์ของอุปกรณ์มากกว่าแค่แบตเตอรี่

Android 11 มี android.hardware.health HAL 2.1 ซึ่งเป็นรุ่นรองที่อัปเกรดจาก health@2.0 HAL HAL ใหม่นี้มีข้อดีดังต่อไปนี้:

  • ง่ายต่อการดำเนินการ
  • สอดคล้องกับ 2.0 HAL API ที่มีอยู่ได้ดีขึ้น
  • การแยกเสียงแหลมที่ดีขึ้นในรหัสการชาร์จนอกโหมด
  • รองรับกรอบการทำงานที่ดีขึ้นเพื่อบ่งบอกถึงความสมบูรณ์ของแบตเตอรี่ของอุปกรณ์

ความต้องการ

อุปกรณ์ที่เปิดตัวด้วย Android 9 ต้องมี 2.0 HAL (และต้องไม่มี 1.0 HAL) อุปกรณ์ที่ไม่ได้เปิดตัวพร้อมกับ Android 9 แต่วางแผนที่จะอัปเดตอิมเมจผู้ขายเป็น Target Framework Compatibility Matrix เวอร์ชัน 3 (เผยแพร่ใน Android 9) จะต้องลบการใช้งาน 1.0 HAL ที่มีอยู่และจัดเตรียม 2.0 HAL

อุปกรณ์ที่เปิดตัวด้วย Android 11 ต้องมี 2.1 HAL (และต้องไม่มี 1.0 หรือ 2.0 HAL) อุปกรณ์ที่ไม่ได้เปิดตัวพร้อมกับ Android 11 แต่วางแผนที่จะอัปเดตอิมเมจผู้ขายเป็น Target Framework Compatibility Matrix เวอร์ชัน 5 (เผยแพร่ใน Android 11) จะต้องลบการใช้งาน 2.0 HAL ที่มีอยู่และจัดเตรียม 2.1 HAL ขอแนะนำให้ใช้อุปกรณ์ที่ไม่ได้เปิดตัวพร้อมกับ Android 11 และไม่ได้วางแผนที่จะอัปเดตอิมเมจผู้ขายเพื่อให้ 2.1 HAL

AOSP มีไลบรารีตัวช่วยหลายตัวที่ออกแบบมาเพื่อช่วยคุณในการปรับใช้ 2.1 HAL และการเปลี่ยนจาก 1.0 HAL แบบเก่า

คำศัพท์

  • health@1.0 : อักษรย่อของ android.hardware.health@1.0 หมายถึงสุขภาพ HIDL HAL เวอร์ชัน 1.0 ที่เผยแพร่ใน Android 8.0
  • health@2.0 : อักษรย่อของ android.hardware.health@2.0 หมายถึงสุขภาพ HIDL HAL เวอร์ชัน 2.0 ที่เผยแพร่ใน Android 9
  • health@2.1 : อักษรย่อของ android.hardware.health@2.1 หมายถึงสุขภาพ HIDL HAL เวอร์ชัน 2.1 ที่เผยแพร่ใน Android 11
  • เครื่องชาร์จ : เรียกใช้งานได้ในการชาร์จนอกโหมดที่แสดงแอนิเมชั่นการชาร์จโทรศัพท์
  • การกู้คืน : เรียกใช้งานได้ในโหมดการกู้คืนที่ต้องดึงข้อมูลแบตเตอรี่
  • healthd : Legacy daemon ที่ทำงานใน Android ที่ดึงข้อมูลที่เกี่ยวข้องกับสุขภาพและมอบให้กับเฟรมเวิร์ก
  • storaged : daemon ที่ทำงานใน Android ที่ดึงข้อมูลการจัดเก็บและจัดเตรียมให้กับเฟรมเวิร์ก

สุขภาพใน Android 8.x

ใน Android 8.x องค์ประกอบสุขภาพทำงานตามรายละเอียดในไดอะแกรมต่อไปนี้:

สุขภาพใน Android 8.x

รูปที่ 1 . สุขภาพใน Android 8.x

ในแผนภาพนี้:

  • กรอบงานใช้การเรียก Binder หนึ่ง (1) ครั้งและการเรียก hwbinder หนึ่ง (1) ครั้งเพื่อสื่อสารกับฮาร์ดแวร์
  • healthd ลิงก์แบบคงที่ไปยัง libhealthd_android , libbatterymonitor และ libbatteryservice
  • health@1.0-impl ลิงก์ไปยัง libhealthd. BOARD แบบคงที่ libhealthd. BOARD

แต่ละบอร์ดสามารถปรับแต่ง libhealthd. BOARD ที่แตกต่างกันได้ libhealthd. BOARD ; จะถูกกำหนดเมื่อสร้างอุปกรณ์ชาร์จ, health@1.0-impl และลิงก์การกู้คืน

สำหรับโหมดอื่นๆ:

การชาร์จนอกโหมดและโหมดการกู้คืนใน Android 8.x

รูปที่ 2 สุขภาพใน Android 8.x การชาร์จและโหมดการกู้คืนนอกโหมด

  • เครื่องชาร์จเชื่อมโยงกับ libhealthd. BOARD แบบคงที่ libhealthd. BOARD , libhealthd_charger และ libbatterymonitor
  • การกู้คืนลิงก์ไปยัง libhealthd. BOARD แบบคงที่ libhealthd. BOARD และ libbatterymonitor

สุขภาพใน Android 9

ใน Android 9 องค์ประกอบสุขภาพทำงานตามรายละเอียดในไดอะแกรมต่อไปนี้: สุขภาพใน Android 9

รูปที่ 3 . สุขภาพใน Android 9

เฟรมเวิร์กพยายามดึงบริการ health@2.0 จาก hwservicemanager หากล้มเหลว จะเรียกไปที่ health@1.0 (ใน Android 8.x) เส้นทางรหัสเดิมจะถูกเก็บไว้เพื่อให้อิมเมจระบบ Android 9 เข้ากันได้กับอิมเมจผู้ขาย Android 8.x เฟรมเวิร์กไม่ดึงข้อมูลจาก HAL ทั้งสอง เนื่องจากอุปกรณ์สามารถมีเวอร์ชันบริการเดียวเท่านั้น (1.0 หรือ 2.0)

สำหรับโหมดอื่นๆ:

การชาร์จและการกู้คืนนอกโหมดใน Android 9

รูปที่ 4 สุขภาพใน Android 9 โหมดการชาร์จและการกู้คืนนอกโหมด

สุขภาพใน Android 11

ใน Android 11 องค์ประกอบสุขภาพทำงานตามรายละเอียดในไดอะแกรมต่อไปนี้:

[system]
    | getService()
    V
[health@2.1-service]
        | getService(stub=true)
        V
[      health@2.0-impl-2.1-<device>.so      ]
        |                                  | (device-dependent linkage)
        V                                  V
+---------Helper libs for impl--------+   [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl)    ] |
| [libbatterymonitor (battery)      ] |
+-------------------------------------+

หากไม่มีการใช้งาน Health 2.1 ระบบจะถอยกลับไปที่เส้นทางรหัสดั้งเดิมตามที่อธิบายไว้ในส่วนก่อนหน้า

สำหรับโหมดอื่นๆ:

[       charger          ]
    | getService()      |  (legacy code path)
    V                   +-------------------------------------------------+
[health@2.1-service]                                                      |
        | getService(stub=true)                                           |
        V                                                                 |
[      health@2.0-impl-2.1-<device>.so      ]                             |
        |                                  | (device-dependent linkage)   |
        V                                  V                              |
+---------Helper libs for impl--------+   [libhealthd.device]             |
| [libhealthloop (uevent, wakealarm)] |                                   |
| [libhealth2impl (IHealth impl)    ] | <---------------------------------+
| [libbatterymonitor (battery)      ] |
+-------------------------------------+
[recovery]
        | getService() w/o hwservicemanager
        V
[      health@2.0-impl-2.1-<device>.so      ]
        |                                  | (device-dependent linkage)
        V                                  V
+---------Helper libs for impl--------+   [libhealthd.device]
| [libhealthloop (uevent, wakealarm)] |
| [libhealth2impl (IHealth impl)    ] |
| [libbatterymonitor (battery)      ] |
+-------------------------------------+

อินเทอร์เฟซ HAL 2.0

health@2.0 HAL จัดเตรียมฟังก์ชันการทำงานเดียวกันกับเฟรมเวิร์กเป็น healthd daemon แบบเก่า นอกจากนี้ยังจัดเตรียม API ที่คล้ายกับบริการที่จัดเตรียมไว้ก่อนหน้านี้ (เช่น IBatteryPropertiesRegistrar )

อินเทอร์เฟซหลัก IHealth มีฟังก์ชันดังต่อไปนี้:

  • registerCallback เพื่อแทนที่ IBatteryPropertiesRegistrar.registerListener
  • unregisterCallback เพื่อแทนที่ IBatteryPropertiesRegistrar.unregisterListener
  • update เพื่อแทนที่ IBatteryPropertiesRegistrar.scheduleUpdate
  • IBatteryPropertiesRegistrar.getProperties จะถูกแทนที่ด้วยสิ่งต่อไปนี้:
    • getChargeCounter
    • getCurrentNow
    • getCurrentAverage
    • getCapacity
    • getEnergyCounter
    • getChargeStatus
    • getHealthInfo

นอกจากนี้ IHealth ยังมี API ใหม่ต่อไปนี้สำหรับการ storaged เพื่อดึงข้อมูลที่เกี่ยวข้องกับการจัดเก็บเฉพาะผู้จำหน่าย:

  • getStorageInfo
  • getDiskStats

โครงสร้างใหม่ @2.0::HealthInfo ถูกส่งคืนผ่านการเรียกกลับและ getHealthInfo โครงสร้างนี้มีข้อมูลความสมบูรณ์ของอุปกรณ์ทั้งหมดที่มีอยู่ใน health@2.0 HAL รวมถึง:

  • ข้อมูลการชาร์จ (AC/USB/ไร้สาย กระแสไฟ แรงดันไฟ ฯลฯ)
  • ข้อมูลแบตเตอรี่ (สถานะ ระดับแบตเตอรี่ กระแสไฟ แรงดันไฟ การชาร์จ เทคโนโลยี ฯลฯ)
  • ข้อมูลการจัดเก็บ (ข้อมูลอุปกรณ์จัดเก็บข้อมูล สถิติดิสก์)

อินเทอร์เฟซ HAL 2.1

health@2.1 HAL รองรับการชาร์จนอกโหมดและให้ข้อมูลเพิ่มเติมเกี่ยวกับแบตเตอรี่

อินเทอร์เฟซหลัก IHealth มีฟังก์ชันเพิ่มเติมดังต่อไปนี้

  • getHealthConfig : เพื่อดึงการกำหนดค่าของHAL .นี้
  • getHealthInfo_2_1 : เวอร์ชันรองอัปเกรดเป็น getHealthInfo
  • shouldKeepScreenOn : เพื่อกำหนดว่าควรเปิดหน้าจอในโหมดชาร์จหรือไม่

นอกจากนี้ จำเป็นต้องมีการใช้งาน @2.1::IHealth เพื่อรองรับ @2.1::IHealthInfoCallback สำหรับฟังก์ชัน registerCallback และ unregisterCallback ที่สืบทอดมา อินเทอร์เฟซการโทรกลับใหม่จะส่งกลับข้อมูลความสมบูรณ์ด้านสุขภาพไปยังไคลเอ็นต์โดยใช้ฟังก์ชัน healthInfoChanged_2_1 แทนฟังก์ชัน healthInfoChanged ที่สืบทอดมา

โครงสร้างใหม่ @2.1::HealthInfo จะถูกส่งคืนผ่านการเรียกกลับและ getHealthInfo_2_1 โครงสร้างนี้มีข้อมูลความสมบูรณ์ของอุปกรณ์เพิ่มเติมผ่าน health@2.0 HAL ซึ่งรวมถึง:

  • ระดับความจุของแบตเตอรี่
  • เวลาในการชาร์จแบตเตอรี่จนเต็มในขณะนี้ (เป็นวินาที)
  • ความจุของการออกแบบแบตเตอรี่ที่ชาร์จจนเต็ม (เป็น μAh)

สำหรับข้อมูลเกี่ยวกับการใช้บริการ Health โปรดดูที่ Implementing Health