สุขภาพ Android

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

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

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 Compatible 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 Compatible 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 Compatible 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 ; โดยจะพิจารณา ณ เวลาที่สร้างว่าเครื่องชาร์จ, 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)      ] |
+-------------------------------------+

หากไม่มีการใช้งานด้านสุขภาพ 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 ที่คล้ายกับบริการสุขภาพที่ให้ไว้ก่อนหน้านี้เป็นบริการ Binder (เช่น 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 ไปใช้ โปรดดู ที่ การใช้ 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 ต่อไปนี้สำหรับคลาสที่เป็นประโยชน์ต่อการนำ Health HAL ไปใช้:

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

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

สำหรับข้อมูลเกี่ยวกับการดำเนินการบริการด้านสุขภาพ 2.1 โปรดดู การนำสุขภาพไปใช้ 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 ต่อไปนี้สำหรับคลาสที่เป็นประโยชน์ต่อการนำ Health HAL ไปใช้:

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

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

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

การกู้คืน

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

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

ที่ชาร์จ

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

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

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