Tại sao lại cần tối ưu
Android developer thường không chú ý tác động ứng dụng của họ đến thời lượng pin của điện thoại. Một ứng dụng tiêu tốn nhiều pin sẽ để lại ấn tượng xấu với người sử dụng, cho kết quả đánh giá thấp, thậm chí là gỡ bỏ ứng dụng. Hãy thử dạo qua phần đánh giá của người dùng với Facebook app trên Google Play Store. Mặc dù đây là một trong những ứng dụng phổ biến nhất trên thế giới, nhưng vẫn không phải là không có những đánh giá phàn nàn, thất vọng về sự tiêu tốn pin của app. Tuy nhiên Facebook là một mạng xã hội lớn, hãy tưởng tượng nếu điều này xảy ra với ứng dụng của bạn, với sự cạnh tranh từ các ứng dụng khác cùng chức năng nhưng tối ưu pin tốt hơn, bạn sẽ mất đi lượng lớn người sử dụng.
Khi nói về tối ưu hoá pin trên Android hầu hết các tài liệu sẽ chỉ ra cho chúng ta 3 phần chính:
– Networking
– WakeLocks / Timers
– Sensors
1.Nworking
Nói chung, kết nối mạng trên điện thoại của bạn có nhiều trạng thái. Với kết nối 3G khi có dữ liệu được gửi và nhận điện thoại của bạn sẽ ở trạng thái Fully awake. Nếu sau đó 1 khoảng thời gian mà không có data được gửi và nhận, thiết bị của bạn sẽ chuyển từ trạng thái Fully awake sang Low Power và sang Standby.
android.developers.com
Để hiểu rõ hơn bạn có thể vào trang Android Developers: Optimizing Downloads for Efficient Network Access.
Có một vài điều sau bạn cần nhớ:
♣ Gộp nhóm các công việc với nhau
Trong quá trình phát triển ứng dụng chúng ta sẽ rất dễ gặp trường hợp request một ít data sau, chờ một lúc sau đó request thêm nhiều data. Ví dụ mỗi XmlHttpRequest (XHR) sẽ đưa thiết bị vào trạng thái Fully Awake một thời gian để chờ response, trong trường hợp xấu nhất bạn sẽ đánh thức thiết bị ngay khi nó trở về trạng thái standby.
Cách tốt nhất để tránh khỏi trường hợp này là bạn phải phân biệt trường hợp nào cần xử lý ngay, trường hợp nào nào có thể để sau. Gộp các công việc liên quan đến networking nhiều nhất có thể. Do đó thiết bị của bạn sẽ chỉ phải vào trạng thái Awake 1 lần và ở trạng thái Standby lâu nhất có thể.
♣ Dùng data format thích hợp
Thông thường sử dụng JSON format sẽ tiết kiệm năng lượng hơn là dùng xml.
♣ Sử dụng bộ nhớ đệm (Cache)
Bộ nhớ cache có thể giúp chúng ta tránh các hoạt động xử lý mạng và quá trình ngầm gây tiêu tốn năng lượng. Ví dụ như là sử dụng bộ nhớ cache cho việc hiện thị ảnh.
♣ Cân nhắc những việc có thể tiến hành khi điện thoại đang được sạc, hay khi sử dụng wifi :
Điều này hẳn là quá rõ ràng rồi. Khi chúng ta tiến hành các công việc khi điện thoại đang được sạc, nó sẽ không được tính vào pin. Trừ khi có những việc bạn phải làm ngay hoặc làm trong thời gian ngắn, còn không tốt hơn hết bạn nên thực hiện nó khi chiếc điện thoại được cắm sạc.Với việc download các file có dung lượng lớn hãy tiến hành khi điện thoại có kết nối wifi, bởi thông thường wifi có tốc độ cao hơn 3G và không tính phí nữa . Một ví dụ cho trường hợp này là việc đồng bộ dữ liệu với web services như đồng bộ danh bạ hoặc đồng bộ ảnh.
2. Hạn chế sử dụng WakeLocks và Timers
Trong chủ đề này tôi sẽ không đi sâu chi tiết về WakeLock, nhưng có thể nói ngắn gọn như sau: Nếu bạn cần làm công việc nào đó mà thiết bị đang trong trạng thái sleep bạn có thể dùng WakeLock để đánh thức nó. Bạn có thể tưởng tưởng trên một chiếc điện thoại có nhiều app làm điều này sẽ khiến cho nó bị đánh thức liên tục và không thể về trạng thái sleep được lâu. Bạn cũng có thể quên release WakeLock khi không sử dụng và chiếc điện thoại sẽ rất nhanh hết pin.
Chính vì lý do này, nếu bạn đang sử dụng WakeLock, bạn nên sử dụng WakeLock.acquire() khi mà nó có time-out đảm bảo cho việc release WakeLock. Tuy nhiên điều này chưa giải quyết được vấn đề nhiều app đánh thức điện thoại liên tục, bạn sẽ phải dùng đến JobScheduler API và GcmNetworkManager. Những API này sẽ giúp cho việc nhóm các công việc gần nhau lại, đánh thức điện thoại một lần, tránh tính trạng cứ mỗi phút điện thoại bị đánh thức một lần cho những việc đơn lẻ.
3. Tốn pin do cảm biến
Trên smartphone thì cảm biến rất đa dạng. Nhưng phổ biến nhất vẫn là GPS, đây cũng chính là thủ phạm chính gây ra việc pin tụt nhanh. Có nhiều developer khi sử dụng GPS thường request chính xác toạ độ với sai số nhỏ, trong khi việc đó là không cần thiết. Thay vào đó có thể request địa điểm dựa vào mạng internet và sóng điện thoại khi không đòi hỏi độ chính xác cao. Việc luôn luôn sử dụng GPS khi cần request location sẽ làm cho pin tụt rất nhanh như việc request coarse hoặc fine location.
Nếu buộc phải sử dụng GPS xác đinh rõ khi nào dung coarse location là đủ và hãy nhớ unregister location listener ngay khi nhận được toạ độ. Còn nếu phải sử dụng fine location hãy set time-out cho việc lắng nghe toạ độ người dùng (30s chẳng hạn). Nếu phải cập nhật toạ độ lên tục, cố gắng đặt quãng thời gian càng dài càng tốt. Để tìm hiểu sâu hơn bạn nên đọc ở trên trang Android Developer Location Strategies .Ngoài ra việc sử dụng FusedLocationProvideApi sẽ tối ưu hơn là sử dụng trực tiếp GPS API.
Đối với các cảm biến khác cũng tương tự, hãy nhớ tắt nó đi khi mà bạn đã lấy đc data mình cần. Hầu hết các cảm biến đòi hỏi bạn phải subscrible hoặc register cho việc cập nhật dữ liệu, ngay khi xong việc bạn nên unregister hoặc unsubscrible để tránh tốn pin lãng phí.
Phân tích tình trạng sử dụng pin cho ứng dụng của bạn
The Battery Stats and Battery Historian là một phần của Android SDK. Nó có thể cho bạn cái nhìn trực quan về việc WakeLocks đang được sử dụng như nào trên điện thoại.
Ứng dụng nào đang dùng nó, và dùng nó trong bao lâu. Nó cũng cho bạn thấy thời gian sử dụng 3G của ứng dụng trên điện thoại.
Ngoài ra bắt đầu từ Android L, trong phần Settings> Battery bạn có thể chọn một ứng dụng và xem thời gian sử dụng WakeLock của nó, thậm chí bạn có thể gỡ ứng dụng nếu nó sử dụng WakeLock quá nhiều.
Yay, vậy là hết, trên đây là những hiểu biết của mình về việc tối ưu hoá pin khi phát triển ứng dụng cho Android. Nếu có đóng góp gì mong mọi người bình luận thêm bên dưới.