ที่งาน Google I/O 2014 เราได้เห็นชื่อ "โครงการ" ที่สามของ Android ถัดจาก Project Butter ที่ช่วยให้ลื่นไหลขึ้น (Android 4.1) และ Project Svelte ที่ช่วยให้กินแรมน้อยลง (Android 4.4)
รอบนี้กูเกิลโชว์ Project Volta ที่บอกว่ามันจะช่วยให้ Android ใช้แบตเตอรี่อย่างมีประสิทธิภาพกว่าเดิม แต่กลับพูดถึงมันบนเวที keynote น้อยมาก รายละเอียดของโครงการนี้ จริงๆ แล้วอยู่ในเซสชันเฉพาะ Introduction to Project Volta ครับ
เท่าที่ผมนั่งนับดู Project Volta ประกอบด้วยโครงการย่อยทั้งหมด 3 ส่วน เริ่มจากอย่างแรกคือฟีเจอร์ Battery Saver ของ Android L ที่คุยว่าจะเพิ่มอายุการใช้งานแบตได้สูงสุด 90 นาทีจากปกติ อันนี้ผมยังหารายละเอียดไม่เจอ แต่รูปแบบน่าจะคล้ายๆ Battery Saving Mode ของ Galaxy S5/HTC M8 คือปิดการใช้งานฟีเจอร์บางอย่างที่ไม่จำเป็นออกไป
ส่วนโครงการย่อยที่เหลืออีก 2 ส่วนถูกพูดถึงในเซสชัน Project Volta โดยโครงการทั้งสองตัวเน้นไปที่ "แอพ" ไม่ใช่ตัวระบบปฏิบัติการ ซึ่งกูเกิลใช้วิธีออกเครื่องมือช่วยให้นักพัฒนาแอพสามารถเก็บข้อมูลการใช้แบตเตอรี่ได้ดีกว่าเดิม
Lazy First และ JobScheduler API
เริ่มจากส่วน Lazy First ก่อนครับ ทีมงานกูเกิลมานั่งวิเคราะห์พฤติกรรมการใช้งานแบตเตอรี่อย่างละเอียด และพบว่าส่วนที่กินแบตเยอะๆ มีด้วยกัน 3 อย่างคือซีพียู เครือข่าย และหน้าจอ
ตัวอย่างการทำงานของ Nexus 5 เวลาส่งข้อมูลผ่านเครือข่าย LTE จะเห็นกราฟสีเขียวพุ่งขึ้นในช่วงแรกที่ส่งข้อมูล แต่หลังจากนั้นจะยังติดต่อกับเครือข่ายอีกช่วงหนึ่งแม้ไม่ได้ส่งข้อมูลแล้ว (เส้นสีแดง) ซึ่งตรงนี้กูเกิลมองว่าเปลืองพลังงานโดยใช่เหตุ
คำถามของกูเกิลจึงเป็นว่า ถ้าเราสามารถรอได้ (lazy) ไม่จำเป็นต้องรีบส่งข้อมูล ก็ย่อมทำให้ระบบโดยรวมกินพลังงานน้อยลง
ปัญหาคือการสั่งงานให้แอพ "รอ" เพื่อทำงานบางอย่างเท่าที่จำเป็นนั้นไม่ใช่เรื่องง่าย นักพัฒนาส่วนใหญ่จึงเขียนโปรแกรมไม่ซับซ้อนมาก สั่งให้ทำอะไรทันทีเลย (ซึ่งเขียนง่าย ตรงไปตรงมา แต่อาจไม่ดีในแง่พลังงาน เช่น เกิดปัญหา wakelock) กูเกิลเลยแก้ปัญหาโดยออกตัวจัดคิวงาน (job scheduler) มาให้ใน Android L
ในแง่การเขียนโปรแกรมก็แค่สร้างคลาส JobInfo มาครอบฟังก์ชันการทำงานปกติไว้อีกที กำหนดเงื่อนไขเวลาที่ต้องการ ที่เหลือ job scheduler จัดให้เอง
จากแผนภาพจะเห็นโครงสร้างการทำงานครับ (ถ้าใครเคยเรียนเรื่อง JobScheduler ของระบบปฏิบัติการมา ก็แนวคิดเดียวกัน) คือแอพจะกำหนดช่วงเวลาทำงานให้ JobScheduler รับทราบ จากนั้น JobScheduler (ซึ่งเป็นส่วนหนึ่งของระบบ) จะจัดการ "งาน" (job) ให้เราเอง
เงื่อนไขการทำงานของ JobScheduler API ก็มีให้เลือกหลายแบบ เช่น ทำงานเมื่อเชื่อมต่อเครือข่ายเท่านั้น ทำงานเมื่อเสียบสายชาร์จเท่านั้น เป็นต้น
JobScheduler API มีให้ลองใช้แล้วใน Android L Preview Release รายละเอียดคร่าวๆ อ่านได้จาก Android L API Overview
Battery Historian
ฟีเจอร์ด้านการวัดอัตราการใช้งานแบตเตอรี่ แยกได้เป็นสองส่วนครับ อย่างแรกคือ batterystats เป็นคำสั่งใหม่ที่เพิ่มเข้ามาใน ADB
วิธีการเรียกใช้ก็สั่ง
$ adb shell dumpsys batterystats --charged <package-name>
เรียกดูได้ละเอียดถึงขนาดแพ็กเกจของแอพเป็นรายตัว และกำหนดเวลาได้ว่าอยากดูจากช่วงไหนถึงช่วงไหน
ตัวอย่างจากภาพด้านล่าง บ่งบอกกรณี B กับ C ว่ามีอัตราการส่งแพ็กเกจจำนวนใกล้เคียงกัน แต่ใช้ระยะเวลาการส่งต่างกันมาก (42 นาทีกับ 2 นาที) ดังนั้นประสิทธิภาพในการใช้พลังงานของ B จึงต่ำกว่า C ซึ่งนักพัฒนาแอพก็ต้องมาดูรายละเอียดว่าเป็นความตั้งใจหรือความผิดพลาดกันแน่
แต่ batterystats จะสื่อสารกับเราด้วยล็อกไฟล์ที่อ่านยาก ดังนั้นกูเกิลเลยแถมเครื่องมือให้อีกตัวชื่อ Battery Historian ที่ช่วยแปลง (visualize) ล็อกมาเป็นกราฟสวยงาม
โปรแกรม Battery Historian (historian.par) จะแถมมากับ Android SDK ด้วย แต่สามารถดาวน์โหลดแยกเองได้จาก GitHub (เป็น Python)
ทั้งหมดนี้คือรายละเอียดของ Project Volta ครับ ใครสนใจข้อมูลเพิ่มเติมสามารถดูได้จากวิดีโอด้านล่าง
ในภาพรวมแล้ว Project Volta ค่อนข้างต่างไปจาก Butter/Svelte ที่เน้นการปรับปรุงตัวระบบปฏิบัติการโดยตรง (กูเกิลควบคุมได้หมด) เพราะปัญหาเรื่องแบตเตอรี่เกิดจากแอพมากกว่า (ทั้งแอพกูเกิลเองและแอพของนักพัฒนาภายนอก) ทำให้ Volta เน้นไปที่การสร้างเครื่องมือให้นักพัฒนาแอพสามารถตรวจเช็คปัญหาแบตเตอรี่ได้ง่ายขึ้น เราจึงต้องรอนักพัฒนาทั้งหลายนำเครื่องมือเหล่านี้ไปใช้ปรับปรุงแก้ปัญหาแอพของตัวเองอีกพักใหญ่ๆ จึงจะเห็นผลว่า Project Volta ดีแค่ไหนกันครับ
Comments
Play store ช่วยบอกด้วยนะว่า app ไหนใช้ project นี้ใน Code บ้าง จะได้เป็นทางเลือกเวลาลง app
แต่สุดท้าบบางแอพ โดยเฉพาะพวกเล่นหุ้นก็คงไม่ได้ใช้ JobScheduler API สักเท่าไหร่หรอกนะ
//นอกเรื่องนิด แมวน่ารัก อยากเข้าไปลูบคางมัน >_<
บล็อกส่วนตัวที่อัพเดตตามอารมณ์และความขยัน :P
จริงๆ แบบนี้มันก็ต้องขอความกรุณา/ความร่วมมือจากนักพัฒนานะ ซึ่งก็ไม่รู้ว่าจะได้รับความร่วมมือแค่ไหน? เพราะเป็น non-functional requirement นี่
อยากจะได้อะไรที่มันทำได้เองโดยไม่ต้องง้อนักพัฒนา อย่าง Butter มันเกิดที่ระดับตัวแกนระบบเอง
เท่าที่เห็นส่วนใหญ่พวกแอพที่รันอยู่เบื้องหน้า ผู้ใช้จะรู้ตัวเองว่าเพราะตัวเองเล่นเกมอยู่แบตลด ไม่แปลกใจ
แต่ที่ background process/service ที่ส่งข้อมูลเบื้องหลังนี่ทำให้เครื่องติด wakelock เยอะมาก ซึ่งผู้ใช้ไม่รู้สึกตัว รู้อีกทีก็เครื่องอุ่นๆ แบตลดวูบ จริงๆ น่าจะโหดแบบว่า ล็อคเลยว่าพวก background process/service ส่งข้อมูลต่อเน็ตได้เป็นช่วงๆ ห้วงละหนึ่งนาที ห่างกันห้านาทีอะไรแบบนี้ น่าจะทำให้ประหยัดไปได้เยอะมาก
เพราะเห็นคนพยายามทำแนวคิดแบบนี้ด้วย Tasker กันไม่น้อยทีเดียว
"แต่ที่ background process/service ที่ส่งข้อมูลเบื้องหลังนี่ทำให้เครื่องติด wakelock เยอะมาก ซึ่งผู้ใช้ไม่รู้สึกตัว รู้อีกทีก็เครื่องอุ่นๆ แบตลดวูบ จริงๆ น่าจะโหดแบบว่า ล็อคเลยว่าพวก background process/service ส่งข้อมูลต่อเน็ตได้เป็นช่วงๆ ห้วงละหนึ่งนาที ห่างกันห้านาทีอะไรแบบนี้ น่าจะทำให้ประหยัดไปได้เยอะมาก"
Windows Phone เคยทำแบบที่ว่าครับ ส่วนสภาพเป็นยังไงก็ดูเอาเองละกันครับ
ปัจจุบันก็ยังทำอยู่ไม่ใช่เหรอครับ :p
บังเอิญผมไม่ได้จับ Windows Phone 8 เลยไม่รู้ว่ามันหายไปหรือยังครับ เลยขอใช้คำว่า "เคย" ไปก่อนครับ
ปล. เท่าที่หาข้อมูล กลายเป็นว่ายังอยู่เหมือนเดิม
ผมเข้าใจว่าจริงๆ แล้ว iOS ก็ทำคล้ายๆ แบบนี้ด้วยเหมือนกันรึเปล่าครับ มีแต่ Android ที่รันตลอด
เท่าที่หาดู (หลังจากเห็น reply) iOS4 ถึง iOS6 แอพที่ทำงานแบบ background ได้จะต้องเป็น
-แอพที่เล่นเนื้อหาที่เป็นเสียง (แอพเพลงต่างๆ)
-แอพที่บอกตำแหน่งของผู้ใช้บนโลกตลอดเวลา (Map หรือนำทางต่าง)
-แอพที่มี VoIP
-แอพที่ต้องดึงข่าวแล้วประมวลผล (Facebook)
-แอพที่ต้องติดต่อกับอุปกรณ์ภายนอก
นอกนั้นเมื่อกดปุ่ม home แอพจะมีเวลา 10-15 นาทีที่ต้องทำงานให้เสร็จ หลังหมดเวลาแล้วต้อง suspend ครับ
แต่ของ iOS7 ผมยังหารายละเอียดไม่เจอครับ (เพราะตอนเปิดตัว iOS7 จำได้ว่าเปลี่ยนระบบ multitask ใหม่ เลยคิดว่าต้องต่างจาก iOS6 ครับ)
iOS7 จำได้ว่ามีอะไรสักอย่างที่ดูพฤติกรรมการใช้ แล้วพยายามจะเรียกขึ้นมารันเพื่อเตรียมข้อมูลไว้ล่วงหน้านะครับ
ส่วน WP8 จะมีพวกรันเบื้องหลังได้ตลอดเป็นพวก VoIP พวกนำทางเหมือนกันครับ แต่ไม่แน่ใจว่าอะไรขนาดไหน
ใช่อันนี้เปล่าครับ
iOS learns patterns based on your use of the device and tries to predict when an app should be updated in the background. It also learns when the device is typically inactive, such as during the night, to reduce update frequency when the device is not in use.
http://support.apple.com/kb/ht4211
อคติทำให้คนรับเหตุผลด้านเดียว
ใช่ครับ ขอบคุณครับ
ผมไม่แน่ใจว่าใน WP8 ยังทำได้หรือเปล่า แต่ใน WP7 ถ้าเครื่องปลดล็อก Interop แล้ว บวกกับเทคนิคพิเศษ จะทำให้แอพทำงานใน background ตลอดได้ครับ
ปล. พึ่งนึกออกว่าทำได้เพราะตอนทำ project จบ ผมทำแอพบันทึกสถิติการออกกำลังกาย ซึ่งมี pedometer (เครื่องนับก้าว) ด้วย ซึ่งมันต้องทำงานตลอดเวลา และผมก็ใช้วิธีที่ว่าให้มันนับก้าวตลอด ส่วนเรื่องการบริโภคพลังงานของแอพ ต้องบอกว่าเหมือนใช้งานตลอดเวลาครับ
WP8 ส่วนมากปลดล็อก Interop กันไม่ได้ด้วยซ้ำครับ ทำกันได้แค่ dev unlock
ส่วนเรื่องนับก้าว Lumia มี SensorCore ครับ ไม่แน่ใจว่าจะผลักดันไปยี่ห้ออื่นด้วยรึเปล่า ใช้ฮาร์ดแวร์เฉพาะคล้ายๆ M7 ทำให้ไม่กินแบตมากนักครับ แต่ถ้าไม่มีฮาร์ดแวร์เฉพาะตอนนี้ก็เหมือนจะทำไม่ได้เลยถ้าไม่เปิดแอพทิ้งไว้แทน
Background App Refresh ครับ
ขอบคุณครับ
ผมชอบชื่อ Lazy First แฮะ ภาพสไลด์ก็เข้าใจคิด
ชื่อมันล้อมาจาก Lady First แหงๆ (ฮา)
Nexus 5 ที่ใช้อยู่ อายุแบตแย่กว่า iPhone 4s ที่ใช้มาหลายปีอีก ชาร์จก็นานกว่า - -'
เปิดดู Google Play Service กินแบตเยอะสุดเลย ขนาดไม่ได้เปิดใช้ Cellular Data เลย เป็นประสบการณ์การใช้ที่แย่จริงๆ
Android เจอแอพแต่งรูปใน Android อย่าง Camera360 นี่ตัวดีเลย ทำงานเบื้องหลังตลอด กินแบตมากด้วย แปปเดียวแบตหมด ลบทิ้งแทบไม่ทัน เป็นแอพแต่งรูปแท้ๆแต่ดูดข้อมูลผู้ใช้ซะตลอดเวลา(โปรแกรมจีนอีกแล้ว) -_-
ถ้ารูทเป็นก้อคงดีสินะ
greenify โลด