Tối ưu hóa cho Doze và App Standby trên Android M
Bắt đầu từ Android 6.0 (API 23), Android giới thiệu hai tính năng tiết kiệm năng lượng giúp kéo dài tuổi thọ pin cho người dùng bằng cách quản lý ứng dụng hoạt động như thế nào khi thiết bị không được kết nối với nguồn điện. Doze làm giảm tiêu thụ pin bằng cách giảm thiểu xử lý CPU chạy nền và ...
Bắt đầu từ Android 6.0 (API 23), Android giới thiệu hai tính năng tiết kiệm năng lượng giúp kéo dài tuổi thọ pin cho người dùng bằng cách quản lý ứng dụng hoạt động như thế nào khi thiết bị không được kết nối với nguồn điện. Doze làm giảm tiêu thụ pin bằng cách giảm thiểu xử lý CPU chạy nền và network operation cho các ứng dụng khi thiết bị không sử dụng trong một khoảng thời gian dài. App Standby giảm network operation chạy nền cho các ứng dụng mà người dùng đã không tương tác gần đây.
Doze và App Standby quản lý hành vi của tất cả các ứng dụng đang chạy trên Android 6.0 hoặc cao hơn, bất kể target version chỉ dừng lại ở API 23. Để đảm bảo trải nghiệm tốt nhất cho người dùng, hãy thử nghiệm ứng dụng của bạn ở chế độ Doze và App Standby và thực hiện bất kỳ điều chỉnh cần thiết nào cho code của bạn. Chi tiết sẽ được nói đến ở các phần bên dưới
Hiểu về Doze
Nếu thiết bị không được cắm điện và nằm yên trong một khoảng thời gian, khi màn hình tắt, thiết bị sẽ chuyển sang chế độ Doze. Trong chế độ Doze, hệ thống sẽ cố gắng duy trì pin bằng cách hạn chế quyền truy cập của các ứng dụng vào các dịch vụ mạng và CPU. Nó cũng ngăn không cho các ứng dụng truy cập vào mạng và ngắt kết nối công việc, đồng bộ và báo thức chuẩn.
Định kỳ, hệ thống thoát khỏi Doze trong một thời gian ngắn để cho phép ứng dụng hoàn tất các hoạt động đang hoãn lại của chúng. Trong quá trình bảo trì này , hệ thống sẽ chạy tất cả các đồng bộ đang chờ, công việc và báo thức và cho phép các ứng dụng truy cập vào mạng.. Hình 1. Doze cung cấp một quá trình bảo trì định kỳ cho các ứng dụng sử dụng mạng và xử lý các hoạt động đang chờ xử lý.
Vào cuối mỗi quá trình bảo trì, hệ thống lại bước vào chu kỳ Doze, đình chỉ truy cập mạng và hoãn công việc, đồng bộ, và báo thức. Theo thời gian, hệ thống lên kế hoạch bảo trì các cửa sổ ít hơn và ít thường xuyên hơn, giúp giảm tiêu thụ pin trong trường hợp không hoạt động lâu dài khi thiết bị không kết nối với bộ sạc.
Ngay khi người dùng đánh thức thiết bị bằng cách di chuyển thiết bị, bật màn hình hoặc kết nối bộ sạc, hệ thống sẽ thoát khỏi Doze và tất cả các ứng dụng sẽ trở lại hoạt động bình thường.
Hạn chế của app trong chế độ Doze
Các hạn chế sau áp dụng cho các ứng dụng của bạn trong khi ở chế độ Doze:
- Truy cập mạng bị treo.
- Hệ thống bỏ qua Wake Locks.
- AlarmManager (bao gồm cả setExact()và setWindow()) đều được hoãn lại đến quá trình bảo trì tiếp theo.
- Nếu bạn cần đặt báo thức trong khi ở chế độ Doze, hãy sử dụng setAndAllowWhileIdle() hoặc setExactAndAllowWhileIdle().
- Báo thức được thiết lập với việc setAlarmClock() tiếp tục hoạt động bình thường - hệ thống thoát khỏi Doze ngay trước khi báo động được phát ra.
- Hệ thống không thực hiện quét Wi-Fi.
- Hệ thống không cho phép các bộ điều hợp đồng bộ chạy.
- Hệ thống không cho phép JobScheduler chạy.
Tương thích hóa ứng dụng của bạn với Doze
Doze có thể ảnh hưởng đến các ứng dụng khác nhau, tùy thuộc vào khả năng cung cấp và các dịch vụ mà họ sử dụng. Nhiều ứng dụng hoạt động bình thường qua chu kỳ Doze mà không cần sửa đổi. Trong một số trường hợp, bạn phải tối ưu hóa cách ứng dụng của bạn quản lý mạng, báo thức, công việc và đồng bộ hóa. Ứng dụng có thể quản lý hiệu quả các hoạt động trong mỗi quá trình bảo trì.
Doze đặc biệt có khả năng ảnh hưởng đến các hoạt động sử dụng AlarmManager để quản lý báo thức và hẹn giờ, vì báo thức trong Android 5.1 (API 22) hoặc thấp hơn không phát ra khi hệ thống nằm trong Doze.
Để giúp lập lịch báo thức, Android 6.0 (API 23) giới thiệu hai phương thức mới trong AlarmManager: setAndAllowWhileIdle() và setExactAndAllowWhileIdle(). Với những phương thức này, bạn có thể đặt báo thức sẽ phát ngay cả khi thiết bị đang ở Doze.
Lưu ý: setAndAllowWhileIdle() và setExactAndAllowWhileIdle() không thể kích hoạt báo thức nhiều hơn một lần trong 9 phút cho mỗi ứng dụng.
Giới hạn của Doze về truy cập mạng cũng có thể ảnh hưởng đến ứng dụng của bạn, đặc biệt nếu ứng dụng dựa vào tin nhắn trong thời gian thực như tickles hoặc notification. Nếu ứng dụng của bạn yêu cầu kết nối liên tục với mạng để nhận tin nhắn, bạn nên sử dụng Firebase Cloud Messaging (FCM) nếu có thể.
Để chắc chắn rằng ứng dụng của bạn hoạt động như mong muốn với Doze, bạn có thể sử dụng lệnh adb để bắt buộc hệ thống bước vào và thoát khỏi Doze và quan sát hành vi của ứng dụng. Để biết chi tiết, hãy xem Thử nghiệm với Doze và App Standby .
Doze checklists:
*- Nếu có thể, sử dụng FCM cho downstream messaging.
- Nếu người dùng của bạn phải xem thông báo ngay lập tức, hãy đảm bảo sử dụng một message với mức ưu tiên cao của FCM .
- Cung cấp đầy đủ thông tin trong response từ network operation, từ đó truy cập mạng để lấy dữ liệu tiếp theo là không cần thiết.
- Đặt cảnh báo quan trọng bằng setAndAllowWhileIdle() và setExactAndAllowWhileIdle().*
- Kiểm tra ứng dụng của bạn trong chế độ Doze.
Hiểu về App Standby
App Standby cho phép hệ thống xác định rằng một ứng dụng đang nhàn rỗi khi người dùng không chủ động sử dụng nó. Hệ thống xác định điều này khi người dùng không chạm vào ứng dụng trong một thời gian nhất định và không áp dụng điều kiện nào sau đây:
-
Người dùng rõ ràng khởi chạy ứng dụng.
-
Ứng dụng đang có một tiến trình (process) chạy ở foreground (có thể là một Activity hoặc Service chạy ở foreground, hoặc cũng có thể chúng đang được sử dụng bởi một Activity hoặc Service khác mà đang chạy ở foreground). Lưu ý: Bạn chỉ nên sử dụng foreground Service cho các tác vụ người dùng mong muốn hệ thống thực hiện ngay lập tức hoặc không bị gián đoạn. Ví dụ down/upload hoặc chơi nhạc ngay cả khi ứng dụng nghe nhạc không ở trên foreground. Bạn không nên dùng foreground service chỉ đơn giản để ngăn không cho hệ thống xác định rằng ứng dụng của bạn không hoạt động.
-
Ứng dụng tạo ra thông báo mà người dùng thấy trên màn hình khóa hoặc trong khay thông báo.
-
Ứng dụng là ứng dụng quản trị thiết bị đang hoạt động (ví dụ: bộ điều khiển chính sách thiết bị ). Mặc dù chúng thường chạy ẩn, các ứng dụng quản trị thiết bị không bao giờ vào App Standby bởi vì chúng phải có sẵn để nhận chính sách từ máy chủ bất kỳ lúc nào.
Khi người dùng cắm thiết bị vào nguồn điện, hệ thống sẽ giải phóng các ứng dụng khỏi trạng thái chờ, cho phép chúng tự do truy cập vào mạng và thực hiện bất kỳ công việc và đồng bộ đang chờ. Nếu thiết bị không hoạt động trong thời gian dài, hệ thống sẽ cho phép các mạng ứng dụng không hoạt động truy cập khoảng một lần một ngày.
Sử dụng FCM để tương tác với ứng dụng của bạn trong khi thiết bị không hoạt động
FCM là dịch vụ điện toán đám mây cho phép bạn hỗ trợ downstream messaging theo thời gian thực giữa các backend service và ứng dụng trên thiết bị Android. FCM cung cấp một kết nối liên tục duy nhất cho đám mây; Tất cả các ứng dụng cần messaging thời gian thực có thể chia sẻ kết nối này. Kết nối chia sẻ này giúp tối ưu hóa lượng pin sử dụng đáng kể bằng cách không cần thiết cho nhiều ứng dụng duy trì các kết nối liên tục riêng biệt, có thể khiến pin hết nhanh. Vì lý do này, nếu ứng dụng của bạn yêu cầu tích hợp messaging với backend service, lời khuyên là bạn nên sử dụng FCM nếu có thể, thay vì duy trì kết nối mạng của bạn.
FCM được tối ưu hóa để hoạt động với các chế độ chờ Doze và App Standby idle bằng các thông điệp FCM ưu tiên cao. Thông báo ưu tiên cao FCM cho phép bạn xác định chắc chắn rằng ứng dụng của mình để truy cập vào mạng, ngay cả khi thiết bị của người dùng đang ở chế độ Doze hoặc App Standby. Trong chế độ Doze hoặc App Standby, hệ thống sẽ cung cấp thông điệp và cho phép ứng dụng truy cập tạm thời vào các dịch vụ mạng và một phần wakelocks, sau đó trả lại thiết bị hoặc ứng dụng về trạng thái nhàn rỗi.
Thông báo FCM ưu tiên cao không ảnh hưởng đến chế độ Doze và chúng không ảnh hưởng đến trạng thái của bất kỳ ứng dụng nào khác. Điều này có nghĩa là ứng dụng của bạn có thể sử dụng chúng để giao tiếp hiệu quả đồng thời giảm thiểu tác động của pin trên toàn bộ hệ thống và thiết bị.
Nếu bạn đã sử dụng FCM, hãy đảm bảo rằng service của bạn sử dụng thông điệp ưu tiên cao cho các thông điệp quan trọng, vì điều này sẽ đánh thức các ứng dụng ngay cả khi thiết bị đang ở chế độ Doze.
Hỗ trợ các trường hợp sử dụng khác
Hầu như tất cả ứng dụng đều có thể hỗ trợ Doze bằng cách quản lý kết nối mạng, báo thức, công việc và đồng bộ hóa đúng cách và bằng cách sử dụng các thông điệp ưu tiên cao của FCM. Tuy nhiên đối với một số trường hợp đặc biệt, điều này có thể là không đủ, do đó hệ thống cung cấp một while-list các ứng dụng được miễn khỏi một phần các giới hạn của Doze và App Standby.
Một ứng dụng được đưa vào while-list có thể sử dụng mạng và giữ partial-wakelocks trong Doze và App Standby. Tuy nhiên, các hạn chế khác vẫn áp dụng cho các ứng dụng trong danh sách này, cũng giống như các ứng dụng khác. Một ứng dụng có thể kiểm tra xem nó có nằm trong while-list hay không bằng cách gọi isIgnoringBatteryOptimizations().
Người dùng có thể tự cấu hình while-list một cách thủ công trong Cài đặt> Pin> Tối ưu hóa pin. Ngoài ra, hệ thống cung cấp cách cho các ứng dụng yêu cầu người dùng đưa chúng vào danh sách trắng.
- Ứng dụng có thể kích hoạt Intent ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS để đưa người dùng trực tiếp vào Cài đặt Tối ưu hóa pin , nơi họ có thể thêm ứng dụng vào white-list.
- Một ứng dụng với permission REQUEST_IGNORE_BATTERY_OPTIMIZATIONS có thể kích hoạt hộp thoại hệ thống để cho phép người dùng thêm ứng dụng trực tiếp vào white-list, mà không cần phải đi đến Cài đặt.
- Người dùng có thể tự xóa ứng dụng khỏi danh sách trắng nếu cần.
Trước khi yêu cầu người dùng thêm ứng dụng của bạn vào white-list, đảm bảo ứng dụng phù hợp với những trường hợp sử dụng được chấp nhận cho white-list.
Lưu ý: chính sách của Google Play cấm các ứng dụng yêu cầu miễn trừ trực tiếp các tính năng Quản lý Pin trong Android 6.0+ (Doze và App Standby) trừ khi chức năng chính của ứng dụng bị ảnh hưởng xấu.
Thử nghiệm với Doze và App Standby
Để đảm bảo trải nghiệm tuyệt vời cho người dùng của bạn, bạn nên thử nghiệm toàn bộ ứng dụng của mình trong Doze and App Standby.
Thử nghiệm ứng dụng của bạn bằng Doze
Bạn có thể kiểm tra chế độ Doze bằng cách làm theo các bước sau:
- Cấu hình thiết bị phần cứng hoặc thiết bị ảo với system image của Android 6.0 (API 23) trở lên.
- Kết nối thiết bị và cài đặt ứng dụng của bạn.
- Chạy ứng dụng của bạn và để nó hoạt động.
- Buộc hệ thống vào chế độ nhàn rỗi bằng cách chạy lệnh sau: $ adb shell dumpsys deviceidle force-idle
- Quan sát hành vi ứng dụng của bạn sau khi bạn kích hoạt lại thiết bị. Đảm bảo ứng dụng khôi phục mượt mà khi thiết bị thoát khỏi Doze.
Thử nghiệm ứng dụng của bạn với App Standby
Để kiểm tra chế độ App Standby với ứng dụng của bạn:
- Cấu hình thiết bị phần cứng hoặc thiết bị ảo với system image của Android 6.0 (API 23) trở lên.
- Kết nối thiết bị và cài đặt ứng dụng của bạn.
- Chạy ứng dụng của bạn và để nó hoạt động.
- Buộc ứng dụng vào chế độ App Standby bằng cách chạy các lệnh sau:
$ adb shell dumpsys battery unplug $ adb shell am set-inactive <packageName> true
- Mô phỏng việc đánh thức ứng dụng của bạn bằng các lệnh sau:
$ adb shell am set-inactive <packageName> false $ adb shell am get-inactive <packageName>
- Quan sát hành vi ứng dụng của bạn sau khi đánh thức nó. Đảm bảo ứng dụng khôi phục mượt mà từ chế độ chờ. Cụ thể, bạn nên kiểm tra xem Notification và background job của ứng dụng của bạn vẫn tiếp tục hoạt động như mong đợi hay không.
Lược dịch từ https://developer.android.com/training/monitoring-device-state/doze-standby.html