พลังงานของระบบย่อยของอุปกรณ์มักจะถูกวัดและบันทึกในสภาพแวดล้อมห้องปฏิบัติการสำหรับสภาวะคงที่ต่างๆ เช่น เมื่อหน้าจอเปิดอยู่ หรืออุปกรณ์อยู่ในสถานะพลังงานที่ไม่ได้ใช้งาน วิธีนี้ใช้ได้กับระบบย่อยที่มีการดึงพลังงานคงที่ หรือภายใต้สภาวะที่วัดได้ง่ายในสภาพแวดล้อมของห้องปฏิบัติการ แต่ไม่ใช่สำหรับการใช้งานบางกรณี เช่น เมื่อหน้าจอแสดงวิดีโอ
IPower.hal 1.0
จัดเตรียมอินเทอร์เฟซสำหรับการส่ง คำแนะนำด้านพลังงาน และการรายงานข้อมูลสะสมบนตัววัดสถานะสลีปของระบบย่อย ใน Android 10 และสูงกว่า ฟังก์ชันการรายงานสถิติสะสมจะอยู่ใน API การรวบรวมสถิติพลังงาน IPowerStats.hal
และให้วิธีการดึงข้อมูลการใช้พลังงานบนอุปกรณ์ ซึ่งจะแทนที่ส่วนที่รวบรวมสถิติสะสมของอินเทอร์เฟซ IPower.hal
เพื่อการแยกฟังก์ชันการทำงานที่ชัดเจนยิ่งขึ้น
การอ่านบริการ IPowerStats
ไม่ใช่เป็นระยะๆ เกิดขึ้นในช่วงเวลาสำคัญ เช่น เมื่อแบตเตอรี่ลดลง 1% การอ่านค่าจะน้อยลงเมื่อแบตเตอรี่หมด และบ่อยขึ้นเมื่อแบตเตอรี่หมด ข้อมูลอาจถูกส่งกลับไปยังเซิร์ฟเวอร์ และอาจนำไปใช้ในรายงานข้อผิดพลาดเพื่อการวิเคราะห์และคัดแยก สิ่งนี้สนับสนุนความพยายามอย่างต่อเนื่องในการลดการใช้พลังงานและเพิ่มอายุการใช้งานแบตเตอรี่
IPower.hal และ IPowerStats.hal
ทั้งอินเทอร์ IPower.hal
และ IPowerStats.hal
พร้อมใช้งานบน Android 10 แต่ฟังก์ชันการรวบรวม สถิติ IPower.hal
มีให้ใช้งานจากอินเทอร์เฟซ IPowerStats.hal
เท่านั้น ฟังก์ชันการทำงานของ IPowerStats.hal
ประกอบด้วย API เพื่อรับและใช้ข้อมูลที่รวบรวมจากการวัดพลังงานบนอุปกรณ์สำหรับอุปกรณ์ที่รองรับ:
- ดำเนินการวัดพลังงานระดับรางสำหรับทั้งไคลเอนต์ความถี่ต่ำ (
getRailInfo
) และความถี่สูง (streamEnergyData
) และรายงานพลังงานที่สะสมตั้งแต่บูต - รายงานข้อมูลที่เกี่ยวข้องกับแต่ละ
PowerEntity
ที่ได้รับการสนับสนุนซึ่งมีข้อมูลอยู่PowerEntity
คือระบบย่อยของแพลตฟอร์ม อุปกรณ์ต่อพ่วง หรือโดเมนพลังงานที่ส่งผลกระทบต่อการใช้พลังงานของอุปกรณ์ทั้งหมด - รายงานชุดของสถานะของเอนทิตีพลังงาน (
getPowerEntityStateInfo
) ซึ่งเอนทิตีที่ระบุให้ข้อมูลถิ่นที่อยู่ จากนั้นรายงานข้อมูลที่สะสมสำหรับPowerEntity
แต่ละรายการที่ระบุ
IPowerStats.hal
APIs ถูกใช้โดยไคลเอ็นต์ต่อไปนี้:
-
Statsd
เพื่อรวบรวมตัวชี้วัดการใช้พลังงานต่อราง -
Perfetto
เพื่อเชื่อมโยงการใช้พลังงานกับกิจกรรมของ CPU -
Batterystats
เพื่อปรับปรุงการระบุแหล่งที่มาของแบตเตอรี่โดยใช้ข้อมูลที่วัดได้ แทนที่จะประเมินการใช้แบตเตอรี่จากค่าคงที่ที่กำหนดไว้ล่วงหน้าในpower_profile.xml.
เมื่อใช้ Android 10 และสูงกว่า ผู้ผลิตอุปกรณ์อาจเลือกระหว่างฟังก์ชัน IPower.hal
และ IPowerStats.hal
แต่ไคลเอ็นต์ทั้งหมดจะต้องถอยกลับไปใช้ IPower.hal
หากไม่ได้ใช้งาน IPowerStats.hal
อ็อพชันการใช้งาน IPowerStats.hal
เฉพาะฟังก์ชัน IPower.hal
เท่านั้นที่มีให้ใช้งานบน Android 7 ถึง Android 9 อุปกรณ์ที่ได้รับการอัปเกรดเป็น Android 10 จะต้องมีระบบย่อยการตรวจสอบพลังงานด้วยฮาร์ดแวร์ หรือวิธีการอื่นที่พร้อมใช้งานเพื่อตรวจสอบและบันทึกสถิติพลังงาน SoC บางตัวรวบรวมสถิติการใช้พลังงานสำหรับคุณ หรือคุณอาจได้รับข้อมูลสถานะการอยู่อาศัยของเอนทิตีพลังงานผ่านซอฟต์แวร์ ฮาร์ดแวร์การตรวจสอบพลังงานจำเป็นต่อการสนับสนุน getRailInfo()
, getEnergyData()
และ streamEnergyData()
เท่านั้น
หากคุณใช้ IPowerStats.hal
โดยไม่มีฮาร์ดแวร์ตรวจสอบพลังงาน getRailInfo(), getEnergyData()
และ streamEnergyData()
จะส่งคืน NOT_SUPPORTED
ในทำนองเดียวกัน getPowerEntityInfo(), getPowerEntityStateInfo()
และ getPowerEntityStateResidencyData()
อาจส่งคืน NOT_SUPPORTED
หากไม่ได้ตั้งใจจะใช้
ตัวอย่างข้อมูลที่ส่งคืนโดย API การตรวจสอบรางรถไฟ ได้แก่
- รางจ่ายไฟสำหรับจอแสดงผลใช้ X µW
- รางจ่ายไฟสำหรับโมเด็มใช้ Y µW
ตัวอย่างของข้อมูลที่ส่งคืนโดย API สถานะสลีปของระบบย่อย ได้แก่
- โมเด็มอยู่ในโหมดสลีปเป็นเวลา X ms
- SoC อยู่ในสถานะการพังทลายของพลังงานเป็นเวลา Y ms
- GPU อยู่ในสถานะหยุดชั่วคราวเป็นเวลา Z ms
ใช้ระบบย่อยการตรวจสอบพลังงานฮาร์ดแวร์
หากการออกแบบอุปกรณ์ของคุณมีระบบย่อยการตรวจสอบพลังงานด้วยฮาร์ดแวร์ ให้ใช้ IPowerStats.hal
โดยการสร้างโหนด sysfs เดียวที่ PowerStats.hal
สามารถแยกวิเคราะห์ข้อมูล หรือโดยการรวบรวมการเรียกระบบประเภท ioctl
คุณต้องใช้ไดรเวอร์เคอร์เนลของคุณในลักษณะที่ป้องกันการโอเวอร์โฟลว์ของตัวสะสม อัลกอริธึมที่ใช้ขึ้นอยู่กับการออกแบบระบบย่อยการตรวจสอบพลังงานด้วยฮาร์ดแวร์เฉพาะของคุณ ซึ่งต้องมีการวัดแรงดันและกระแสบัสทั้งแบบทันทีและแบบเฉลี่ย ไดรเวอร์เคอร์เนลจะต้องเก็บข้อมูลนี้ในลักษณะที่ไม่ล้างตัวสะสมพลังงาน และจะต้องรักษาข้อมูลพลังงานที่สะสมสำหรับแต่ละรางย่อยตั้งแต่บูต ในรูปแบบของตัวแปร 64 บิตที่เพิ่มขึ้นตามการอ่านพลังงานจาก แบบสอบถามแต่ละสะสม
สถิติสำหรับส่วนประกอบที่กำหนด (หรือหลายส่วนประกอบ) จะต้องอยู่ในโหนดเดียว แม้ว่านี่จะไม่ใช่การใช้ sysfs ทั่วไป (ซึ่งโดยปกติจะจำกัดแต่ละโหนดไว้ที่ค่าเดียว) แต่ก็ทำให้มั่นใจได้ว่าข้อมูลทั้งหมดมีความสอดคล้องกัน
คำแนะนำการออกแบบ
- รักษาเวลาแฝงให้ต่ำ (สูงสุด 1 มิลลิวินาที) เมื่ออ่านจากโหนด sysfs หรือทำการเรียกระบบ
- ตรวจสอบให้แน่ใจว่าฟังก์ชันสถิติที่รองรับไม่ได้เพิ่มการระบายพลังงานอย่างวัดผลได้:
- อย่าเพิ่มจุดเข้าใช้งาน (AP) และ/หรือการปลุกระบบย่อยเพื่อติดตามพารามิเตอร์ เช่น เวลาที่ใช้ในโหมดสลีป
- ถ่ายโอนสถิติระหว่างตัวประมวลผลแอปและเฟิร์มแวร์ตามโอกาสกับการรับส่งข้อมูลอื่นๆ เมื่อเป็นไปได้
- หากจำเป็น ระบบย่อยอาจใช้ฟังก์ชันไดรเวอร์ต่อไปนี้:
- การแคชข้อมูลภายในเพื่อหลีกเลี่ยงเวลาแฝง/การปลุก โดยสูญเสียข้อมูลเก่าเล็กน้อย
- ดำเนินการคาดการณ์เมื่อระบบย่อยอยู่ในโหมดสลีป เพื่อจัดเตรียมเวลาพักเครื่องที่อัปเดตโดยไม่ต้องปลุกระบบย่อย
เลือกส่วนประกอบ ระบบย่อย และสถิติ
เมื่อเลือกส่วนประกอบหรือระบบย่อยที่จะรวบรวมข้อมูล IPowerStats.hal
ให้เลือกสิ่งใดก็ได้บนอุปกรณ์ที่กินกระแสไฟจำนวนมาก (5 mA หรือมากกว่า) หรือที่รองรับโหมดการสิ้นเปลืองพลังงานหลายโหมด เช่นต่อไปนี้:
- ระบบย่อย SoC ส่วนบุคคล
- ระบบย่อยบางส่วนหรือทั้งหมดอยู่นอก SoC เช่น WiFi ตัวประมวลผลภาพ หรือตัวประมวลผลความปลอดภัย
- อุปกรณ์ต่อพ่วง เช่น LED และกล้องกำลังแรงสูง
- โดเมนพลังงานที่ใช้โหมดที่แตกต่างกัน (เช่น โดเมนพลังงานสำหรับ SoC โดยรวม)
การปรับแต่ง
คุณสมบัติเสริมนี้สามารถปรับแต่งได้ ออกแบบกรณีการใช้งานและปรับแต่งการใช้งานของคุณ:
- ตัดสินใจว่าจะวัดรางไหน และจะวัดบ่อยแค่ไหน
- ตัดสินใจว่าจะอ่านข้อมูลเมื่อใด และจะตีความข้อมูลอย่างไร
- ตัดสินใจว่าจะดำเนินการใดและเมื่อใด โดยพิจารณาจากข้อมูลของคุณ
การตรวจสอบ
การทดสอบ VTS ช่วยให้มั่นใจว่าเป็นไปตามข้อกำหนดของ Android ความคิดเห็นใน IPowerStats.hal
ใช้เพื่อตรวจสอบว่าอุปกรณ์เป็นไปตามข้อกำหนด
ตัวอย่างเช่น หากคุณเรียก getRailInfo()
และไม่ส่งคืนสิ่งใด การทดสอบ VTS จะล้มเหลว เนื่องจากคุณไม่ได้รับข้อมูลเกี่ยวกับรางที่ได้รับการตรวจสอบ หรือสถานะที่ส่งคืนเป็น SUCCESS
ในทำนองเดียวกัน หากคุณได้รับข้อมูลรถไฟ แต่มีการตอบสนอง NON_SUPPORTED
หรือ FILE_SYSTEM_ERROR
ไปด้วย แสดงว่ามันล้มเหลวเช่นกัน VTS ตรวจสอบว่าข้อกำหนดของผู้ผลิตอุปกรณ์เป็นไปตามข้อกำหนดในไฟล์ HAL โดยใช้ข้อกำหนดในความคิดเห็น IPower.hal และ IPowerStats.hal ตัวอย่างความคิดเห็นที่ใช้ในการทดสอบ VTS แสดงไว้ด้านล่าง:
/** * Rail information: * Reports information related to the rails being monitored. * * @return rails Information about monitored rails. * @return status SUCCESS on success or NOT_SUPPORTED if * feature is not enabled or FILESYSTEM_ERROR on filesystem nodes * access error. */ getRailInfo() generates(vec<e;RailInfo>e; rails, Status status);