Android Health

Android 9 รวมถึง android.hardware.health HAL 2.0 อัพเกรดรุ่นใหญ่จาก health@1.0 HAL HAL ใหม่นี้มีข้อดีดังต่อไปนี้:

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

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: ภูตมรดกทำงานใน Android ที่ข้อมูลด้านสุขภาพที่เกี่ยวข้องกับการดึงข้อมูลและให้มันกรอบ
  • เก็บรักษา: ภูตทำงานใน 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 ; มันถูกกำหนดเมื่อสร้างอุปกรณ์ชาร์จ, health@1.0-impl และลิงก์การกู้คืน

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

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

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

  • ชาร์จแบบคงที่เชื่อมโยงไปยัง libhealthd. BOARD , libhealthd_charger และ libbatterymonitor
  • การกู้คืนแบบคงที่เชื่อมโยงไปยัง 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 แบบเก่า นอกจากนี้ยังมี APIs ที่คล้ายกับสิ่งที่ให้ไว้ก่อนหน้า healthd เป็นบริการเครื่องผูก (เช่น IBatteryPropertiesRegistrar )

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

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

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

  • getStorageInfo
  • getDiskStats

struct ใหม่ @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 ฟังก์ชั่น

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

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

สำหรับข้อมูลเกี่ยวกับการดำเนินการบริการสุขภาพให้ดูที่ การใช้สุขภาพ