วัดกำลังส่วนประกอบ

คุณสามารถกำหนดการใช้พลังงานของส่วนประกอบแต่ละตัวได้โดยการเปรียบเทียบกระแสไฟฟ้าที่อุปกรณ์ดึงออกมา เมื่อส่วนประกอบอยู่ในสถานะที่ต้องการ (เช่น เปิด ทำงาน สแกน) และเมื่อส่วนประกอบปิดอยู่ วัดกระแสไฟฟ้าชั่วขณะโดยเฉลี่ยที่ดึงบนอุปกรณ์ที่แรงดันไฟฟ้าที่กำหนดโดยใช้เครื่องตรวจสอบพลังงานภายนอก เช่น แหล่งจ่ายไฟแบบตั้งโต๊ะหรือเครื่องมือตรวจสอบแบตเตอรี่แบบพิเศษ (เช่น Monsoon Solution Inc. ซอฟต์แวร์ Power Monitor และ Power Tool)

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

ควบคุมการใช้พลังงาน

เมื่อทำการวัด ตรวจสอบให้แน่ใจว่าอุปกรณ์ไม่มีการเชื่อมต่อกับแหล่งชาร์จภายนอก เช่น การเชื่อมต่อ USB กับโฮสต์การพัฒนาที่ใช้เมื่อใช้ Android Debug Bridge (adb) อุปกรณ์ที่ทดสอบอาจดึงกระแสไฟจากโฮสต์ ส่งผลให้การวัดที่แบตเตอรี่ลดลง หลีกเลี่ยงการเชื่อมต่อ USB On-The-Go (OTG) เนื่องจากอุปกรณ์ OTG อาจดึงกระแสไฟจากอุปกรณ์ที่กำลังทดสอบ

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

  • กิจกรรมการรับ ส่ง หรือสแกนผ่านเครือข่ายโทรศัพท์ Wi-Fi และบลูทูธ เมื่อไม่ได้วัดพลังงานวิทยุมือถือ ให้ตั้งค่าอุปกรณ์เป็นโหมดเครื่องบินและเปิดใช้งาน Wi-Fi หรือบลูทูธตามความเหมาะสม
  • เปิด/ปิดหน้าจอ สีที่แสดงในขณะที่หน้าจอเปิดอยู่อาจส่งผลต่อการดึงพลังงานของเทคโนโลยีหน้าจอบางอย่าง ปิดหน้าจอเมื่อวัดค่าสำหรับส่วนประกอบที่ไม่ใช่หน้าจอ
  • ระบบระงับ/ดำเนินการต่อ สถานะการปิดหน้าจออาจทำให้ระบบหยุดชะงัก ส่งผลให้ชิ้นส่วนของอุปกรณ์อยู่ในสถานะใช้พลังงานต่ำหรือปิดอยู่ ซึ่งอาจส่งผลต่อการใช้พลังงานของส่วนประกอบที่กำลังวัด และทำให้เกิดความแปรปรวนอย่างมากในการอ่านค่าพลังงาน เนื่องจากระบบกลับมาทำงานต่อเป็นระยะๆ เพื่อส่งสัญญาณเตือน ฯลฯ สำหรับรายละเอียด โปรดดูที่ การควบคุมระบบหยุดทำงานชั่วคราว
  • CPU เปลี่ยนแปลงความเร็วและการเข้า/ออกจากสถานะไม่ได้ใช้งานตัวกำหนดตารางเวลาพลังงานต่ำ ในระหว่างการทำงานปกติ ระบบจะทำการปรับเปลี่ยนความเร็ว CPU จำนวนแกน CPU ออนไลน์ และสถานะแกนหลักของระบบอื่นๆ บ่อยครั้ง เช่น ความเร็วบัสหน่วยความจำและแรงดันไฟฟ้าของรางจ่ายไฟที่เกี่ยวข้องกับ CPU และหน่วยความจำ ในระหว่างการทดสอบ การปรับเหล่านี้ส่งผลต่อการวัดกำลัง:
    • การดำเนินการสเกลความเร็ว CPU สามารถลดจำนวนนาฬิกาและสเกลแรงดันไฟฟ้าของบัสหน่วยความจำและส่วนประกอบหลักอื่นๆ ของระบบได้
    • กิจกรรมการจัดกำหนดการอาจส่งผลต่อเปอร์เซ็นต์ของเวลาที่ CPU ใช้ในสถานะไม่ได้ใช้งานพลังงานต่ำ สำหรับรายละเอียดในการป้องกันไม่ให้การปรับเปลี่ยนเหล่านี้เกิดขึ้นระหว่างการทดสอบ โปรดดูที่ การควบคุมความเร็ว CPU

ตัวอย่างเช่น Joe Droid ต้องการคำนวณค่า screen.on สำหรับอุปกรณ์ เขาเปิดใช้งานโหมดเครื่องบินบนอุปกรณ์ รันอุปกรณ์ในสถานะปัจจุบันที่เสถียร รักษาความเร็วของ CPU ให้คงที่ และใช้ Wakelock บางส่วนเพื่อป้องกันการระงับระบบ จากนั้น Joe จะปิดหน้าจออุปกรณ์และทำการวัด (200 mA) จากนั้น Joe เปิดหน้าจออุปกรณ์โดยใช้ความสว่างขั้นต่ำและทำการวัดอีกครั้ง (300 mA) ค่า screen.on คือ 100 mA (300 - 200)

หมายเหตุ : สำหรับส่วนประกอบที่ไม่มีรูปคลื่นคงที่ของการสิ้นเปลืองกระแสไฟเมื่อใช้งานอยู่ (เช่น วิทยุเซลลูล่าร์หรือ Wi-Fi) ให้วัดกระแสเฉลี่ยในช่วงเวลาหนึ่งโดยใช้เครื่องมือตรวจสอบพลังงาน

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

ระบบควบคุมระงับ

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

ป้องกันการระงับระบบ

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

adb shell "echo temporary > /sys/power/wake_lock"

ขณะที่อยู่ใน wake_lock สถานะปิดหน้าจอจะไม่ทำให้ระบบหยุดทำงานชั่วคราว (อย่าลืมถอดสาย USB ออกจากอุปกรณ์ก่อนที่จะวัดการใช้พลังงาน)

หากต้องการลบ Wakelock:

adb shell "echo temporary > /sys/power/wake_unlock"

ระบบการวัดระงับ

หากต้องการวัดการดึงพลังงานระหว่างสถานะหยุดทำงานของระบบ ให้วัดค่าของ cpu.idle ในโปรไฟล์พลังงาน ก่อนทำการวัด:

  • ลบ Wakelock ที่มีอยู่ (ตามที่อธิบายไว้ข้างต้น)
  • วางอุปกรณ์ในโหมดเครื่องบินเพื่อหลีกเลี่ยงกิจกรรมที่เกิดขึ้นพร้อมกันโดยวิทยุเซลลูลาร์ ซึ่งอาจทำงานบนโปรเซสเซอร์ที่แยกจากส่วน SoC ที่ควบคุมโดยระบบระงับ
  • ตรวจสอบให้แน่ใจว่าระบบอยู่ในสถานะ Suspend โดย:
    • การยืนยันการอ่านปัจจุบันจะเป็นค่าคงที่ การอ่านควรอยู่ในช่วงที่คาดหวังสำหรับการใช้พลังงานของสถานะ Suspend SoC บวกกับการใช้พลังงานของส่วนประกอบของระบบที่ยังคงได้รับพลังงาน (เช่น USB PHY)
    • การตรวจสอบเอาต์พุตคอนโซลระบบ
    • การดูตัวบ่งชี้สถานะของระบบภายนอก (เช่น ไฟ LED จะดับลงเมื่อไม่ได้ถูกระงับ)

ควบคุมความเร็วของ CPU

CPU ที่ใช้งานสามารถนำออนไลน์หรือออฟไลน์ โดยเปลี่ยนความเร็วสัญญาณนาฬิกาและแรงดันไฟฟ้าที่เกี่ยวข้อง (อาจส่งผลต่อความเร็วบัสหน่วยความจำและสถานะพลังงานหลักอื่นๆ ของระบบ) และสามารถเข้าสู่สถานะไม่ได้ใช้งานพลังงานต่ำลงในขณะที่อยู่ในเคอร์เนลไม่ได้ใช้งานลูป เมื่อทำการวัดสถานะพลังงานของ CPU ที่แตกต่างกันสำหรับโปรไฟล์พลังงาน ให้หลีกเลี่ยงความแปรปรวนของการดึงพลังงานเมื่อทำการวัดพารามิเตอร์อื่นๆ โปรไฟล์พลังงานจะถือว่า CPU ทั้งหมดมีความเร็วและลักษณะพลังงานที่เหมือนกัน

ขณะวัดพลังงาน CPU หรือในขณะที่คงพลังงาน CPU ไว้คงที่เพื่อทำการวัดอื่นๆ ให้รักษาจำนวน CPU ที่นำมาออนไลน์ให้คงที่ (เช่น มี CPU หนึ่งตัวออนไลน์และส่วนที่เหลือออฟไลน์/ถอดปลั๊กออก) การเก็บ CPU ทั้งหมดยกเว้นซีพียูที่ไม่ได้ใช้งานตามกำหนดเวลาอาจทำให้ได้ผลลัพธ์ที่ยอมรับได้ การหยุดเฟรมเวิร์ก Android ด้วย adb shell stop สามารถลดกิจกรรมการตั้งเวลาของระบบได้

คุณต้องระบุความเร็ว CPU ที่ใช้ได้สำหรับอุปกรณ์ของคุณในรายการ cpu.speeds ของโปรไฟล์พลังงาน หากต้องการดูรายการความเร็ว CPU ที่มีอยู่ ให้รัน:

adb shell cat /sys/devices/system/cpu/cpu0/cpufreq/stats/time_in_state

ความเร็วเหล่านี้ตรงกับการวัดพลังงานที่สอดคล้องกันในค่า cpu.active

สำหรับแพลตฟอร์มที่จำนวนคอร์ที่ออนไลน์ส่งผลต่อการใช้พลังงานอย่างมาก คุณอาจต้องแก้ไขไดรเวอร์ cpufreq หรือ Governor สำหรับแพลตฟอร์ม แพลตฟอร์มส่วนใหญ่รองรับการควบคุมความเร็วของ CPU โดยใช้ตัวควบคุม cpufreq ของพื้นที่ผู้ใช้ และใช้อินเทอร์เฟซ sysfs เพื่อตั้งค่าความเร็ว ตัวอย่างเช่น หากต้องการตั้งค่าความเร็วสำหรับ 200MHz บนระบบที่มี CPU เพียง 1 ตัวหรือ CPU ทั้งหมดที่ใช้นโยบาย cpufreq ร่วมกัน ให้ใช้คอนโซลระบบหรือเชลล์ adb เพื่อรันคำสั่งต่อไปนี้:

echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
echo 200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq

หมายเหตุ : คำสั่งที่แน่นอนจะแตกต่างกันไปขึ้นอยู่กับการใช้งาน cpufreq ของแพลตฟอร์ม

คำสั่งเหล่านี้ช่วยให้แน่ใจว่าความเร็วใหม่ไม่ได้อยู่นอกขอบเขตที่อนุญาต ตั้งค่าความเร็วใหม่ จากนั้นพิมพ์ความเร็วที่ CPU กำลังทำงานอยู่จริง (สำหรับการตรวจสอบ) หากความเร็วต่ำสุดในปัจจุบันก่อนการดำเนินการสูงกว่า 200,000 คุณอาจต้องกลับลำดับของสองบรรทัดแรก หรือดำเนินการบรรทัดแรกอีกครั้งเพื่อลดความเร็วขั้นต่ำก่อนที่จะตั้งค่าความเร็วสูงสุด

หากต้องการวัดกระแสที่ใช้โดย CPU ที่ทำงานด้วยความเร็วต่างๆ ให้ใช้คอนโซลระบบเพื่อวาง CPU ในลูปที่เชื่อมโยงกับ CPU โดยใช้คำสั่ง:

# while true; do true; done

ทำการวัดในขณะที่ลูปดำเนินการ

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

สำหรับค่า cpu.awake ให้วัดพลังงานที่ใช้เมื่อระบบไม่ได้ถูกระงับและไม่ได้ดำเนินการงาน CPU ควรอยู่ใน idle loop ของตัวกำหนดตารางเวลาพลังงานต่ำ ซึ่งอาจดำเนินการคำสั่ง ARM Wait For Event หรืออยู่ในสถานะพลังงานต่ำเฉพาะ SoC พร้อมเวลาแฝงทางออกที่รวดเร็วซึ่งเหมาะสำหรับการใช้งานที่ไม่ได้ใช้งาน

สำหรับค่า cpu.active ให้วัดกำลังเมื่อระบบไม่อยู่ในโหมด Suspend และไม่ได้ดำเนินการงาน CPU หนึ่งตัว (โดยปกติคือ CPU หลัก) ควรรันงาน ในขณะที่ CPU อื่นๆ ทั้งหมดควรอยู่ในสถานะไม่ได้ใช้งาน

วัดพลังงานหน้าจอ

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

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

วัดหน้าจอเมื่อเปิดเครื่องที่ความสว่าง ต่ำสุด และ สูงสุดของ จอแสดงผล/แบ็คไลท์ วิธีตั้งค่าความสว่างขั้นต่ำ:

  • ใช้ UI ของ Android (ไม่แนะนำ) ตั้งค่าแถบเลื่อนการตั้งค่า > ความสว่างของจอแสดงผลเป็นความสว่างขั้นต่ำของจอแสดงผล อย่างไรก็ตาม Android UI อนุญาตให้ตั้งค่าความสว่างได้ขั้นต่ำเพียง 10-20% ของความสว่างของแผงหรือแบ็คไลท์ที่เป็นไปได้ และไม่อนุญาตให้ตั้งค่าความสว่างต่ำจนไม่สามารถมองเห็นหน้าจอได้โดยไม่ต้องใช้ความพยายามมากนัก
  • ใช้ไฟล์ sysfs (แนะนำ) หากมี ให้ใช้ไฟล์ sysfs เพื่อควบคุมความสว่างของแผงควบคุมไปจนถึงความสว่างขั้นต่ำที่ฮาร์ดแวร์รองรับ

นอกจากนี้ หากไฟล์ sysfs ของแพลตฟอร์มสามารถเปิดและปิดแผง LCD ไฟพื้นหลัง และหน้าจอสัมผัสได้ ให้ใช้ไฟล์เพื่อทำการวัดโดยเปิดและปิดหน้าจอ มิฉะนั้น ให้ตั้งค่า Wakelock บางส่วนเพื่อให้ระบบไม่ระงับ จากนั้นจึงเปิดและปิดหน้าจอด้วยปุ่มเปิด/ปิด

วัดพลังงาน Wi-Fi

ทำการวัด Wi-Fi บนเครือข่ายที่ค่อนข้างเงียบ หลีกเลี่ยงการแนะนำงานเพิ่มเติมในการประมวลผลปริมาณการออกอากาศที่มีปริมาณมากซึ่งไม่เกี่ยวข้องกับกิจกรรมที่กำลังวัด

ค่า wifi.on จะวัดพลังงานที่ใช้เมื่อเปิดใช้งาน Wi-Fi แต่ไม่ได้ส่งหรือรับข้อมูล ซึ่งมักวัดเป็นเดลต้าระหว่างการดึงปัจจุบันในสถานะระบบระงับ (สลีป) โดยเปิดใช้งาน Wi-Fi และปิดใช้งาน

ค่า wifi.scan จะวัดพลังงานที่ใช้ระหว่างการสแกน Wi-Fi เพื่อหาจุดเข้าใช้งาน แอปพลิเคชันสามารถทริกเกอร์การสแกน Wi-Fi ได้โดยใช้คลาส WifiManager startScan() API คุณยังสามารถเปิดการตั้งค่า > Wi-Fi ซึ่งทำการสแกนจุดเข้าใช้งานทุกๆ สองสามวินาทีโดยมีการใช้พลังงานเพิ่มขึ้นอย่างเห็นได้ชัด แต่คุณต้องลบพลังงานหน้าจอออกจากการวัดเหล่านี้

หมายเหตุ : ใช้การตั้งค่าแบบควบคุม (เช่น iperf ) เพื่อสร้างเครือข่ายรับและส่งการรับส่งข้อมูล