การใช้แบตเตอรี่ที่เพิ่มขึ้น — หนึ่งในข้อร้องเรียนที่พบบ่อยที่สุดจากผู้ใช้แอปพลิเคชันมือถือ แอปเริ่มใช้พลังงานมากผิดปกติ ทำให้อุปกรณ์คายประจุอย่างรวดเร็วแม้อยู่ในพื้นหลัง ตามข้อมูลของ Google I/O 2023 พบว่าสูงถึง 30% ของแอปใน Google Play มีปัญหาเรื่องการใช้พลังงานซึ่งส่งผลโดยตรงต่อการรักษาผู้ใช้ ในบทความนี้เราจะมาวิเคราะห์สาเหตุ การวินิจฉัย และวิธีการปรับให้เหมาะสม
ประเด็นสำคัญ
การใช้แบตเตอรี่ที่เพิ่มขึ้น เป็นภาวะที่แอปพลิเคชันมือถือใช้พลังงานมากกว่าที่คาดไว้ในสถานการณ์การใช้งานทั่วไปอย่างมีนัยสำคัญ ผู้ใช้สังเกตเห็นว่าอุปกรณ์คายประจุเร็วขึ้น 20-30% หลังจากติดตั้งหรืออัปเดตแอป
ระบบปฏิบัติการมือถือสมัยใหม่ — Android และ iOS — มีกลไกควบคุมการใช้พลังงานในตัว Android ใช้ Battery Optimization และ iOS ใช้ Background Modes อย่างไรก็ตาม การใช้ API อย่างไม่ถูกต้องอาจเลี่ยงกลไกเหล่านี้ได้
ตามการวิจัยของ Purdue University (2021) พบว่าประมาณ 60% ของแอปใช้พลังงานสำหรับงานพื้นหลังโดยไม่จำเป็น ซึ่งพบได้บ่อยโดยเฉพาะในแอปที่มีโฆษณา การวิเคราะห์ และการเชื่อมต่อเครือข่ายถาวร
การใช้พลังงานวัดเป็น mA·h (มิลลิแอมแปร์-ชั่วโมง) Android ให้ข้อมูลผ่าน BatteryManager API ซึ่งติดตามการใช้พลังงานของแต่ละส่วนประกอบ: CPU, โมดูลวิทยุ, GPS, จอแสดงผล และเซ็นเซอร์
val batteryManager = getSystemService(Context.BATTERY_SERVICE) as BatteryManager
val chargeCounter = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CHARGE_COUNTER)
val capacity = batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY)
// chargeCounter / capacity * 100 = current charge percentage
BatteryManager API ช่วยให้คุณได้รับประจุปัจจุบันและความจุแบตเตอรี่ แต่ไม่ได้ให้รายละเอียดต่อแอป — จำเป็นต้องใช้ยูทิลิตี้ระบบสำหรับสิ่งนั้น
WakeLock — กลไกที่อันตรายที่สุดสำหรับแบตเตอรี่ หากแอปถือ WakeLock โดยไม่ปล่อย อุปกรณ์จะไม่เข้าสู่โหมดสลีป การถือ WakeLock หนึ่งชั่วโมงใช้พลังงานประมาณ 50-80 mA·h
คำขอเครือข่ายที่ไม่มีการรวมกลุ่มเป็นสาเหตุที่พบบ่อยเป็นอันดับสอง ทุกครั้งที่แอปสร้างการเชื่อมต่อเครือข่าย โมดูลวิทยุ จะเปลี่ยนจากโหมดประหยัดพลังงานเป็นโหมดแอคทีฟ คำขอสั้น ๆ บ่อยครั้งที่ห่างกันน้อยกว่า 5 นาทีจะทำให้โมดูลวิทยุทำงานตลอดเวลา
การระบุ ตำแหน่ง GPS ที่มีความแม่นยำสูง (GPS_PROVIDER) ใช้พลังงานมากกว่าการระบุตำแหน่งประมาณ (NETWORK_PROVIDER) 10-15 เท่า การอัปเดตตำแหน่งอย่างต่อเนื่องในพื้นหลังเป็นหนึ่งในข้อร้องเรียนที่พบบ่อยที่สุดของผู้ใช้
ตาม Android Developers Blog แอปโดยเฉลี่ยใช้ประมาณ 15% ของการใช้แบตเตอรี่ทั้งหมดของอุปกรณ์ การเกินระดับนี้จำเป็นต้องตรวจสอบการใช้พลังงานอย่างละเอียด
Battery Historian — เครื่องมืออย่างเป็นทางการของ Google สำหรับวิเคราะห์การใช้พลังงาน โดยรับดัมพ์ BatteryStats จาก ADB และแสดงภาพการใช้พลังงานตามส่วนประกอบ: CPU, เครือข่าย, GPS, WakeLock และจอแสดงผล
ในการสร้างดัมพ์ ให้รันคำสั่ง: adb shell dumpsys batterystats หลังจากรวบรวมข้อมูล 2-3 ชั่วโมงจากการใช้งานปกติ คุณสามารถอัปโหลดรายงานไปยัง Battery Historian เพื่อวิเคราะห์
Android Energy Profiler ใน Android Studio ติดตามการใช้พลังงานแบบเรียลไทม์ โดยแสดงการใช้ CPU, เครือข่าย, GPS และจอแสดงผลสำหรับแต่ละการทำงานของแอป
# Reset battery stats before test
adb shell dumpsys batterystats --reset
# Use the app for 2-3 hours
# Export dump for Battery Historian
adb shell dumpsys batterystats > batterystats_dump.txt
สำหรับ iOS ใช้ Energy Log ผ่าน Xcode Instruments โดยรวบรวมข้อมูลการใช้พลังงานแยกตามโมดูล: CPU, เครือข่าย, GPU, จอแสดงผล, ตำแหน่ง เวลาอ่าน: 15-30 นาทีต่อการวิเคราะห์หนึ่งเซสชัน
บนอุปกรณ์ iOS จริง สถิติการใช้พลังงานยังแสดงใน Settings > Battery หากแอปอยู่ใน 10 อันดับแรกด้านการใช้พลังงาน — นั่นคือสัญญาณให้ปรับปรุง
WorkManager — API มาตรฐานสำหรับงานพื้นหลังที่คำนึงถึงสถานะแบตเตอรี่ เครือข่าย และโหมด Doze โดยรับประกันการทำงานภายใต้สภาวะที่เหมาะสมแทนที่จะทำงานทันที ช่วยประหยัดพลังงานได้ถึง 40% สำหรับการดำเนินการพื้นหลัง
val workRequest = OneTimeWorkRequestBuilder<SyncWorker>()
.setConstraints(
Constraints.Builder()
.setRequiresCharging(true)
.setRequiresBatteryNotLow(true)
.setRequiresNetworkType(NetworkType.CONNECTED)
.build()
)
.build()
WorkManager.getInstance(this).enqueue(workRequest)
การรวมกลุ่มคำขอ — การรวมการดำเนินการเครือข่ายหลายรายการเป็นเซสชันการสื่อสารเดียว แทนที่จะส่ง 10 คำขอแยกกัน แอปส่งคำขอแบบกลุ่มเดียว ซึ่งลดเวลาแอคทีฟของโมดูลวิทยุจาก 30 วินาทีเหลือ 2-3 วินาที
FusedLocationProviderClient จาก Google Play Services เลือกแหล่งตำแหน่งที่เหมาะสมตามความแม่นยำที่ต้องการ สำหรับงานพื้นหลัง ใช้ลำดับความสำคัญ PRIORITY_BALANCED_POWER_ACCURACY — ให้ความแม่นยำสูงถึง 100 เมตรโดยใช้แบตเตอรี่น้อยที่สุด
ใน iOS ใช้ Significant Location Change แทน Continuous Location ซึ่งจะอัปเดตเฉพาะเมื่อมีการเคลื่อนไหวที่สำคัญ (มากกว่า 500 เมตร) แทนที่จะทุกสองสามวินาที
Android Battery Historian — เครื่องมือเว็บของ Google สำหรับแสดงภาพข้อมูล BatteryStats รองรับการนำเข้าดัมพ์ ส่วนประกอบที่ใช้สีรหัส และการเปรียบเทียบเซสชัน ตัวชี้วัดหลัก: เวลาถือ WakeLock, กิจกรรมโมดูลวิทยุ, เซสชัน GPS
Xcode Energy Organizer รวบรวมข้อมูลการใช้พลังงานจากผู้ใช้จริงผ่าน TestFlight และ App Store คุณจะได้รับรายงานเกี่ยวกับการใช้พลังงานเฉลี่ยบนอุปกรณ์และเวอร์ชัน iOS ต่าง ๆ ซึ่งช่วยติดตามการเสื่อมประสิทธิภาพหลังอัปเดต
PerfDog (Tencent) — เครื่องมือทดสอบประสิทธิภาพข้ามแพลตฟอร์มที่รวมการวัดการใช้พลังงาน รองรับ iOS และ Android ให้บันทึกตัวชี้วัดที่ 1-10 เฟรมต่อวินาที
| เครื่องมือ | แพลตฟอร์ม | ตัวชี้วัด |
|---|---|---|
| Battery Historian | Android | WakeLock, เครือข่าย, GPS, CPU, จอแสดงผล |
| Energy Profiler | Android Studio | CPU, เครือข่าย, GPS, วิทยุแบบเรียลไทม์ |
| Energy Log | iOS (Xcode) | CPU, เครือข่าย, GPU, จอแสดงผล, ตำแหน่ง |
| PerfDog | iOS + Android | พลังงาน, FPS, CPU, หน่วยความจำ (ทั้งหมดพร้อมกัน) |
ตาม Apple WWDC 2023 การใช้ Energy Organizer ช่วยลดการใช้พลังงานเฉลี่ยของแอปได้ 15-25% โดยการระบุและแก้ไขการเสื่อมประสิทธิภาพก่อนออกอัปเดตใน App Store
คำถามที่พบบ่อย
โซเชียลเน็ตเวิร์ก และแอปส่งข้อความ (Facebook, Instagram, WhatsApp, Telegram) เป็นผู้นำด้านการใช้พลังงาน โดยซิงค์ข้อมูล อัปเดตฟีด รับการแจ้งเตือนแบบพุช และใช้ GPS อย่างต่อเนื่อง อันดับสองคือเกมกราฟิก 3D ที่โหลดทั้ง GPU และ CPU พร้อมกัน ใช้พลังงานสูงถึง 400-600 mA·h ต่อชั่วโมงการเล่น
ใช่ ส่งผลโดยตรง หน้าจอ เป็นส่วนประกอบที่ใช้พลังงานมากที่สุดของสมาร์ทโฟน การเพิ่มความถี่จาก 60 Hz เป็น 120 Hz ทำให้การใช้พลังงานของจอแสดงผลเพิ่มขึ้น 30-50% อย่างไรก็ตาม จอแสดงผลสมัยใหม่ที่มีเทคโนโลยี LTPO จะเปลี่ยนความถี่แบบไดนามิกจาก 1 ถึง 120 Hz ตามเนื้อหา ซึ่งลดผลกระทบต่อแบตเตอรี่
GPS ความแม่นยำสูง ใช้ประมาณ 200-300 mA·h ต่อชั่วโมงการทำงานต่อเนื่อง สำหรับการเปรียบเทียบ การระบุตำแหน่งผ่าน Wi-Fi และเสาสัญญาณโทรศัพท์มือถือ (NETWORK_PROVIDER) ใช้เพียง 20-40 mA·h ในช่วงเวลาเดียวกัน ใช้ Geofencing API เพื่อเปิด GPS เฉพาะเมื่อเข้าสู่พื้นที่ที่กำหนด
ไม่ควร ระบบปฏิบัติการสมัยใหม่ (Android และ iOS) ปรับกระบวนการพื้นหลังให้เหมาะสมเอง การบังคับปิดแอปและเริ่มใหม่ใช้พลังงานมากกว่าการปล่อยให้แอปอยู่ในพื้นหลัง ข้อยกเว้นคือแอปที่ก่อให้เกิดปัญหาชัดเจน (ระบุผ่านสถิติแบตเตอรี่ในการตั้งค่า)
เปิด Settings > Battery > Battery Usage ระบบจะแสดงรายการแอปพร้อมเปอร์เซ็นต์การใช้ สำหรับการวิเคราะห์โดยละเอียด ให้ใช้ ADB: adb shell dumpsys batterystats และอัปโหลดดัมพ์ไปยัง Battery Historian ซึ่งจะแสดงไม่เพียงแต่การใช้ทั้งหมด แต่ยังแยกตามส่วนประกอบ (WakeLock, เครือข่าย, GPS) ด้วย
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ