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 คอมโพเนนต์ด้านสุขภาพจะทำงานตามที่แสดงในรายละเอียดของแผนภาพต่อไปนี้
รูปที่ 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 ใด
สำหรับโหมดอื่นๆ ให้ทำดังนี้
รูปที่ 2 สุขภาพใน Android 8.x, การชาร์จในโหมดปิดและโหมดการกู้คืน
- charger ลิงก์กับ
libhealthd.BOARD
แบบคงที่libhealthd_charger
และlibbatterymonitor
- recovery ลิงก์แบบคงที่กับ
libhealthd.BOARD
และlibbatterymonitor
Health ใน 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)
สำหรับโหมดอื่นๆ ให้ทำดังนี้
รูปที่ 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) ] |
+-------------------------------------+
ดูแผนภาพแบบง่ายต่อไปนี้สําหรับโหมดต่างๆ
รูปที่ 5 โครงสร้างพื้นฐาน HAL 2.1 ของ Health
Health ใน Android 13
ใน Android 13 จะมีการเปิดตัว HAL สำหรับ AIDL ด้านสุขภาพ คอมโพเนนต์ health ทํางานตามที่อธิบายไว้ในแผนภาพต่อไปนี้
รูปที่ 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 ต่อไปนี้
รูปที่ 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 ต่อไปนี้
รูปที่ 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.*
ไว้ โปรดดูที่คุณสมบัติของระบบสำหรับที่ชาร์จ