สุขภาพ 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 13 รวมถึง android.hardware.health AIDL HAL การแปลงจาก health@2.1 HAL HAL ใหม่นี้มีข้อดีดังต่อไปนี้:

  • ลบ API ที่เกี่ยวข้องกับเครื่องชาร์จที่ไม่ได้ใช้
  • ลบ StorageAttribute ที่ไม่ได้ใช้และฟิลด์ที่เกี่ยวข้อง
  • รองรับแท่นชาร์จ

ความต้องการ

อุปกรณ์ที่ใช้ Android 9 และ Android 10

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

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

อุปกรณ์ที่ใช้ Android 11 และ Android 12

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

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

อุปกรณ์ที่ใช้ Android 13 ขึ้นไป

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

อุปกรณ์ต้องไม่มี HIDL 1.0 HAL

AOSP มีไลบรารีตัวช่วยหลายตัวที่ออกแบบมาเพื่อช่วยคุณในการปรับใช้ AIDL HAL และการเปลี่ยนจาก HIDL 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
  • สุขภาพ AIDL HAL : ตัวย่อของ android.hardware.health
    • เวอร์ชัน 1 เปิดตัวใน Android 13
  • เครื่องชาร์จ : เรียกใช้งานได้ในการชาร์จนอกโหมดที่แสดงภาพเคลื่อนไหวการชาร์จโทรศัพท์
  • การกู้คืน : เรียกใช้งานได้ในโหมดการกู้คืนที่ต้องดึงข้อมูลแบตเตอรี่
  • 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.1

รูปที่ 5. โครงสร้างพื้นฐานด้านสุขภาพ HAL 2.1

สุขภาพใน Android 13

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

โครงสร้างพื้นฐาน AIDL HAL ด้านสุขภาพ

รูปที่ 6. โครงสร้างพื้นฐาน AIDL HAL ด้านสุขภาพ

อินเทอร์เฟซ HIDL 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/ไร้สาย กระแสไฟ แรงดันไฟ ฯลฯ)
  • ข้อมูลแบตเตอรี่ (สถานะ ระดับแบตเตอรี่ กระแสไฟ แรงดันไฟ การชาร์จ เทคโนโลยี ฯลฯ)
  • ข้อมูลการจัดเก็บ (ข้อมูลอุปกรณ์จัดเก็บข้อมูล สถิติดิสก์)

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

อินเทอร์เฟซ HIDL 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)

ดูไดอะแกรม UML ต่อไปนี้สำหรับคลาสที่เป็นประโยชน์ต่อการใช้งาน HAL ด้านสุขภาพ:

แผนภาพสุขภาพ 2.1 HAL UML

รูปที่ 7 แผนภาพ HAL 2.1 UML สุขภาพ

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

อินเทอร์เฟซ AIDL HAL เวอร์ชัน 1

การเปลี่ยนแปลง API

AIDL เวอร์ชัน 1 HAL รองรับ API ที่คล้ายกับ HIDL 2.1 HAL เมื่อเทียบกับอินเทอร์เฟซ HIDL 2.1 การเปลี่ยนแปลงต่อไปนี้ใน API:

  • API ที่เกี่ยวข้องกับเครื่องชาร์จที่นำมาใช้ใน HIDL HAL 2.1 จะไม่ถูกย้ายไปยัง AIDL HAL เนื่องจากฟังก์ชันของการชาร์จนอกโหมดใช้งานได้บนพาร์ติชัน /vendor เท่านั้น จึงไม่จำเป็นต้องมี API บนอินเทอร์เฟซของผู้จัดจำหน่าย หากต้องการใช้งานการชาร์จนอกโหมดอย่างเหมาะสม โปรดดูที่ เครื่องชาร์จ ด้านล่าง
  • ประเภท StorageAttribute และฟิลด์ที่เกี่ยวข้องจะถูกลบออกเนื่องจากไม่ได้ใช้
  • เพิ่ม chargerDockOnline ใน HealthInfo เพื่อรองรับการชาร์จแท่นชาร์จ

การดำเนินการ

ดูไดอะแกรม UML ต่อไปนี้สำหรับคลาสที่เป็นประโยชน์ต่อการใช้งาน HAL ด้านสุขภาพ:

แผนภาพ AIDL HAL UML ด้านสุขภาพ

รูปที่ 8 แผนภาพ Health AIDL HAL UML

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

การกู้คืน

Android 13 รองรับ Binder ในการกู้คืน การติดตั้งบริการ Health AIDL เพื่อการกู้คืนทำให้สามารถทำงานในโหมดการกู้คืนได้

สำหรับข้อมูลเกี่ยวกับการติดตั้งบริการ Health AIDL เพื่อการกู้คืน ดูสิ่งต่อไปนี้:

ที่ชาร์จ

การทำงานของการชาร์จนอกโหมดถูกย้ายจาก /system เป็น /vendor สำหรับอุปกรณ์ที่เปิดตัวด้วย Android 13 หากอุปกรณ์นั้นรองรับการชาร์จนอกโหมด ไบนารีบริการ HAL จะต้องรองรับโหมดเครื่องชาร์จ ให้อ้างอิงกับ การใช้ที่ชาร์จ

คุณสมบัติระบบเครื่องชาร์จ

คุณสมบัติ ro.charger.* ไม่สามารถอ่านได้โดยไบนารี charger ใน /vendor อีกต่อไป หากอุปกรณ์ของคุณมีชุดคุณสมบัติของระบบ ro.charger.* โปรดดู คุณสมบัติของระบบสำหรับเครื่องชาร์จ