HAL สถิติพลังงาน

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

IPower.hal 1.0 มีอินเทอร์เฟซสำหรับการส่ง คำแนะนำด้านพลังงานและการรายงานข้อมูลสะสมเกี่ยวกับเมตริกสถานะสลีปของระบบย่อย ใน Android 10 ขึ้นไป ฟังก์ชันการรายงานสถิติแบบสะสมจะอยู่ใน IPowerStats.halPower-Stat Collection API และให้บริการดึงข้อมูลการใช้พลังงานในอุปกรณ์ การดำเนินการนี้จะแทนที่ส่วนการเก็บรวบรวมสถิติสะสมของอินเทอร์เฟซ 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 API

  • 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 มิลลิวินาที
  • SoC อยู่ในสถานะพลังงานหมดเป็นเวลา Y ms
  • GPU อยู่ในสถานะ "หยุดชั่วคราว" เป็นเวลา Z มิลลิวินาที

ใช้ระบบย่อยในการตรวจสอบพลังงานของฮาร์ดแวร์

หากการออกแบบอุปกรณ์มีระบบย่อยในการตรวจสอบพลังงานของฮาร์ดแวร์ ให้ติดตั้งใช้งานIPowerStats.halโดยสร้างโหนด sysfs รายการเดียวPowerStats.halจะแยกวิเคราะห์ข้อมูลได้ หรือสร้างคอลเล็กชันการเรียกใช้ระบบประเภท ioctl

คุณต้องติดตั้งใช้งานไดรเวอร์เคอร์เนลในลักษณะที่ป้องกันไม่ให้ตัวสะสมข้อมูลรับค่าเกิน อัลกอริทึมที่ใช้ในการวัดขึ้นอยู่กับการออกแบบระบบย่อยในการตรวจสอบพลังงานของฮาร์ดแวร์ที่ไม่ซ้ำกัน ซึ่งต้องระบุทั้งการวัดแรงดันไฟฟ้าและกระแสไฟฟ้าของบัสแบบทันทีและแบบเฉลี่ย โปรแกรมควบคุมเคอร์เนลต้องบันทึกข้อมูลนี้ในลักษณะที่ไม่ล้างตัวสะสมพลังงาน และต้องเก็บรักษาข้อมูลพลังงานที่สะสมไว้สำหรับรางย่อยแต่ละรางนับตั้งแต่การบูตในรูปแบบตัวแปร 64 บิตที่เพิ่มขึ้นตามค่าที่อ่านได้จากคําค้นหาตัวสะสมพลังงานแต่ละรายการ

สถิติของคอมโพเนนต์หนึ่งๆ (หรือหลายคอมโพเนนต์ตามต้องการ) จะต้องอยู่ในโหนดเดียว แม้ว่านี่ไม่ใช่การใช้งาน sysfs แบบดั้งเดิม (ซึ่งปกติจะจำกัดแต่ละโหนดให้มีเพียงค่าเดียว) แต่วิธีนี้ช่วยให้ข้อมูลทั้งหมดสอดคล้องกัน

คำแนะนำเกี่ยวกับการออกแบบ

  • รักษาเวลาในการตอบสนองให้ต่ำ (สูงสุด 1 มิลลิวินาที) เมื่ออ่านจากโหนด sysfs หรือทำการเรียกใช้ระบบ
  • ตรวจสอบว่าฟังก์ชันการทำงานด้านสถิติที่รองรับไม่ได้ทำให้แบตเตอรี่หมดเร็วขึ้นอย่างเห็นได้ชัด
    • อย่าเพิ่มการตื่นขึ้นของจุดเข้าใช้งาน (AP) และ/หรือระบบย่อยเพื่อติดตามพารามิเตอร์ เช่น เวลาที่ใช้ในโหมดสลีป
    • โอนสถิติระหว่างโปรเซสเซอร์ของแอปกับเฟิร์มแวร์เมื่อมีโอกาส กับการรับส่งข้อมูลอื่นๆ เมื่อเป็นไปได้
  • หากจําเป็น ระบบย่อยอาจใช้ฟังก์ชันไดรเวอร์ต่อไปนี้
    • แคชข้อมูลภายในเพื่อหลีกเลี่ยงเวลาในการตอบสนอง/การตื่นขึ้น แต่ข้อมูลจะล้าสมัยเล็กน้อย
    • ทำการประมาณเมื่อระบบย่อยอยู่ในโหมดสลีป เพื่อแสดงเวลาสลีปที่อัปเดตโดยไม่ต้องปลุกระบบย่อย

เลือกคอมโพเนนต์ ระบบย่อย และสถิติ

เมื่อเลือกคอมโพเนนต์หรือระบบย่อยที่จะรวบรวมIPowerStats.halข้อมูล ให้เลือกทุกอย่างในอุปกรณ์ที่ใช้กระแสไฟฟ้าอย่างมีนัยสำคัญ (5 mA ขึ้นไป) หรือรองรับโหมดการใช้พลังงานหลายโหมด เช่น ต่อไปนี้

  • ระบบย่อย SoC แต่ละระบบ
  • ระบบย่อยที่อยู่นอก SoC บางส่วนหรือทั้งหมด เช่น Wi-Fi, หน่วยประมวลผลภาพ หรือหน่วยประมวลผลความปลอดภัย
  • อุปกรณ์ต่อพ่วง เช่น 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);