ประสิทธิภาพของระบบ Android

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

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

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

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

Android 13 มี android.hardware.health AIDL HAL ซึ่งแปลงมาจาก health@2.1 HAL HAL ใหม่นี้มีข้อดีดังนี้

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

ข้อกำหนด

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

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

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

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

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

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

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

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

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

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 หมายถึง Health HIDL HAL เวอร์ชัน 2.0 ที่เปิดตัวใน Android 9
  • health@2.1: ย่อมาจาก android.hardware.health@2.1 หมายถึง HIDL HAL เวอร์ชัน 2.1 ของสุขภาพที่เปิดตัวใน Android 11
  • health AIDL HAL: อักษรย่อของ android.hardware.health
    • เวอร์ชัน 1 เปิดตัวใน Android 13
  • ที่ชาร์จ: ไฟล์ปฏิบัติการทำงานในการชาร์จนอกโหมดที่แสดงภาพเคลื่อนไหวการชาร์จโทรศัพท์
  • recovery: ไฟล์ปฏิบัติการที่ทำงานในโหมดการกู้คืนซึ่งต้องเรียกดูข้อมูลแบตเตอรี่
  • healthd: Daemon เดิมที่ทำงานใน Android ซึ่งเรียกข้อมูลที่เกี่ยวข้องกับสุขภาพและให้ไว้ในเฟรมเวิร์ก
  • storaged: Daemon ที่ทำงานใน Android ที่เรียกข้อมูลพื้นที่เก็บข้อมูล และส่งไปยังเฟรมเวิร์ก

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

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

Health ใน Android 8.x

รูปที่ 1 Health ใน Android 8.x

ในแผนภาพนี้

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

แต่ละบอร์ดสามารถปรับแต่ง libhealthd.BOARD ที่แตกต่างกันได้ ซึ่งจะกำหนดเมื่อถึงเวลาสร้างว่าจะใช้ charger, health@1.0-impl และ recovery link ใด

สำหรับโหมดอื่นๆ ให้ทำดังนี้

โหมดการเรียกเก็บเงินและการกู้คืนนอกโหมดใน Android 8.x

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

  • charger ลิงก์กับ libhealthd.BOARD แบบคงที่ libhealthd_charger และ libbatterymonitor
  • recovery ลิงก์แบบคงที่กับ libhealthd.BOARD และ libbatterymonitor

Health ใน 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 ทั้ง 2 รายการ เนื่องจากอุปกรณ์มีบริการได้เพียงเวอร์ชันเดียว (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)      ] |
+-------------------------------------+

ดูแผนภาพแบบง่ายต่อไปนี้สําหรับโหมดต่างๆ

โครงสร้างพื้นฐาน Health HAL 2.1

รูปที่ 5 โครงสร้างพื้นฐาน HAL 2.1 ของ Health

Health ใน Android 13

ใน Android 13 จะมีการเปิดตัว HAL สำหรับ AIDL ด้านสุขภาพ คอมโพเนนต์ health ทํางานตามที่อธิบายไว้ในแผนภาพต่อไปนี้

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

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

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

Health@2.0 HAL มีฟังก์ชันการทำงานของเฟรมเวิร์กเหมือนกับดีมอนของ Healthd แบบเก่า นอกจากนี้ยังมี API ที่คล้ายกับที่ healthd เคยให้บริการเป็นบริการ 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 2.0 ได้ที่การใช้ Health 2.0

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

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

อินเทอร์เฟซหลัก 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 โครงสร้างนี้มีข้อมูลเพิ่มเติมเกี่ยวกับประสิทธิภาพการทำงานของอุปกรณ์ ซึ่งพร้อมใช้งานผ่าน HAL ของ health@2.0 ซึ่งรวมถึงข้อมูลต่อไปนี้

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

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

แผนภาพ Health 2.1 HAL UML

รูปที่ 7 แผนภาพ UML ของ Health HAL 2.1

ดูข้อมูลเกี่ยวกับการใช้งาน Health 2.1 ได้ที่การใช้งาน Health 2.1

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

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

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

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

การใช้งาน

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

แผนภาพ Health AIDL HAL UML

รูปที่ 8 แผนภาพ UML ของ HAL สำหรับ AIDL ของ Health

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

การกู้คืน

Android 13 รองรับ Binder ในการกู้คืน การติดตั้งบริการ AIDL ของ Health ในการกู้คืนจะช่วยให้บริการดังกล่าวทำงานในโหมดการกู้คืนได้

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

ที่ชาร์จ

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

พร็อพเพอร์ตี้ของระบบชาร์จ

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