Tối ưu hoá quyền truy cập mạng

Việc sử dụng sóng vô tuyến không dây để chuyển dữ liệu có thể là một trong những nguồn tiêu hao pin đáng kể nhất của ứng dụng. Để giảm thiểu mức tiêu hao pin liên quan đến hoạt động mạng, bạn cần phải hiểu rõ cách mô hình kết nối ảnh hưởng đến phần cứng vô tuyến cơ bản.

Phần này giới thiệu máy trạng thái vô tuyến không dây và giải thích cách mô hình kết nối của ứng dụng tương tác với máy trạng thái đó. Sau đó, bài viết này sẽ cung cấp một số kỹ thuật giúp giảm thiểu tác động của mức tiêu thụ dữ liệu của ứng dụng đối với pin.

Máy trạng thái vô tuyến

Bộ thu phát sóng không dây trên thiết bị của người dùng có các tính năng tiết kiệm pin tích hợp giúp giảm thiểu mức tiêu thụ pin. Khi hoạt động hoàn toàn, bộ thu phát sóng không dây tiêu thụ một lượng điện năng đáng kể, nhưng khi không hoạt động hoặc ở chế độ chờ, bộ thu phát sóng tiêu thụ rất ít điện năng.

Một yếu tố quan trọng cần nhớ là sóng vô tuyến không thể chuyển từ chế độ chờ sang hoạt động hoàn toàn ngay lập tức. Có một khoảng thời gian trễ liên quan đến việc "bật nguồn" cho đài. Vì vậy, pin sẽ chuyển từ trạng thái năng lượng cao hơn sang trạng thái năng lượng thấp hơn một cách chậm rãi để tiết kiệm pin khi không sử dụng, đồng thời cố gắng giảm thiểu độ trễ liên quan đến việc "bật nguồn" cho sóng vô tuyến.

Máy trạng thái cho một đài mạng 3G thông thường bao gồm ba trạng thái năng lượng:

  • Công suất tối đa: Được dùng khi có kết nối đang hoạt động, cho phép thiết bị truyền dữ liệu ở tốc độ cao nhất có thể.
  • Nguồn điện thấp: Trạng thái trung gian giúp giảm mức tiêu thụ pin khoảng 50%.
  • Chế độ chờ: Trạng thái tiêu thụ điện năng tối thiểu, trong đó không có kết nối mạng nào đang hoạt động.

Mặc dù trạng thái thấp và trạng thái chờ tiêu hao ít pin hơn đáng kể, nhưng chúng cũng gây ra độ trễ đáng kể cho các yêu cầu mạng. Quá trình chuyển từ trạng thái công suất thấp sang công suất tối đa mất khoảng 1,5 giây, còn quá trình chuyển từ trạng thái chờ sang công suất tối đa có thể mất hơn 2 giây.

Để giảm thiểu độ trễ, máy trạng thái sử dụng độ trễ để trì hoãn quá trình chuyển đổi sang trạng thái năng lượng thấp hơn. Hình 1 sử dụng thời gian của AT&T cho một đài 3G thông thường.


Hình 1. Máy trạng thái vô tuyến không dây 3G thông thường.

Máy trạng thái vô tuyến trên mỗi thiết bị, đặc biệt là độ trễ chuyển đổi liên quan ("thời gian đuôi") và độ trễ khởi động, sẽ thay đổi tuỳ theo công nghệ vô tuyến không dây được sử dụng (3G, LTE, 5G, v.v.) và được xác định cũng như định cấu hình theo mạng của nhà mạng mà thiết bị đang hoạt động.

Trang này mô tả một máy trạng thái đại diện cho một đài phát thanh không dây 3G thông thường, dựa trên dữ liệu do AT&T cung cấp. Tuy nhiên, các nguyên tắc chung và các phương pháp hay nhất thu được đều áp dụng cho tất cả các phương thức triển khai vô tuyến không dây.

Phương pháp này đặc biệt hiệu quả đối với hoạt động duyệt web thông thường trên thiết bị di động vì nó ngăn chặn độ trễ không mong muốn trong khi người dùng duyệt web. Thời gian đuôi tương đối thấp cũng đảm bảo rằng sau khi phiên duyệt web kết thúc, đài phát có thể chuyển sang trạng thái năng lượng thấp hơn.

Rất tiếc, phương pháp này có thể dẫn đến việc ứng dụng hoạt động không hiệu quả trên các hệ điều hành điện thoại thông minh hiện đại như Android, nơi ứng dụng chạy cả ở nền trước (nơi độ trễ là quan trọng) và ở nền sau (nơi thời lượng pin cần được ưu tiên).

Cách ứng dụng tác động đến máy trạng thái vô tuyến

Mỗi khi bạn tạo một kết nối mạng mới, sóng vô tuyến sẽ chuyển sang trạng thái công suất tối đa. Trong trường hợp máy trạng thái vô tuyến 3G thông thường được mô tả trước đó, máy sẽ duy trì ở mức công suất tối đa trong suốt thời gian truyền dữ liệu (cộng thêm 5 giây thời gian đuôi), sau đó là 12 giây ở trạng thái năng lượng thấp. Vì vậy, đối với một thiết bị 3G thông thường, mỗi phiên truyền dữ liệu sẽ khiến sóng vô tuyến tiêu thụ năng lượng trong ít nhất 18 giây.

Trên thực tế, điều này có nghĩa là một ứng dụng thực hiện chuyển dữ liệu trong một giây, ba lần một phút, sẽ giữ cho sóng vô tuyến không dây hoạt động liên tục, chuyển nó trở lại công suất cao ngay khi nó đang chuyển sang chế độ chờ.


Hình 2. Mức sử dụng năng lượng vô tuyến không dây tương đối cho quá trình chuyển một giây chạy ba lần mỗi phút. Số liệu không bao gồm độ trễ "khởi động" giữa các lần chạy.

Để so sánh, nếu cùng một ứng dụng đó gộp các hoạt động chuyển dữ liệu, chạy một lần chuyển dữ liệu duy nhất trong 3 giây mỗi phút, thì việc này sẽ chỉ giữ cho sóng vô tuyến ở trạng thái công suất cao trong tổng cộng 20 giây mỗi phút. Điều này cho phép sóng vô tuyến ở chế độ chờ trong 40 giây mỗi phút, giúp giảm đáng kể mức tiêu thụ pin.


Hình 3. Mức sử dụng năng lượng vô tuyến không dây tương đối cho các lần chuyển dữ liệu trong 3 giây, chạy mỗi phút một lần.

Kỹ thuật tối ưu hoá

Giờ đây, khi đã hiểu rõ mức độ ảnh hưởng của việc truy cập mạng đối với thời lượng pin, hãy cùng tìm hiểu một số việc bạn có thể làm để giảm mức tiêu hao pin, đồng thời mang lại trải nghiệm nhanh chóng và mượt mà cho người dùng.

Chuyển dữ liệu theo gói

Như đã nêu trong phần trước, việc gộp các hoạt động chuyển dữ liệu để bạn chuyển nhiều dữ liệu hơn nhưng ít thường xuyên hơn là một trong những cách tốt nhất để cải thiện hiệu suất pin.

Tất nhiên, không phải lúc nào bạn cũng có thể làm được điều này nếu ứng dụng cần nhận hoặc gửi dữ liệu ngay lập tức để phản hồi hành động của người dùng. Bạn có thể giảm thiểu vấn đề này bằng cách dự đoán và tìm nạp trước dữ liệu. Các trường hợp khác, chẳng hạn như gửi nhật ký hoặc dữ liệu phân tích đến máy chủ và các hoạt động chuyển dữ liệu khác do ứng dụng khởi tạo, không khẩn cấp, rất phù hợp để phân lô và đóng gói. Hãy xem bài viết Tối ưu hoá các tác vụ do ứng dụng khởi tạo để biết các mẹo lên lịch chuyển dữ liệu mạng ở chế độ nền.

Tìm nạp trước dữ liệu

Tìm nạp trước dữ liệu là một cách hiệu quả khác để giảm số lượng phiên chuyển dữ liệu độc lập mà ứng dụng của bạn chạy. Với tính năng tìm nạp trước, khi người dùng thực hiện một hành động trong ứng dụng của bạn, ứng dụng sẽ dự đoán dữ liệu nào có nhiều khả năng cần thiết nhất cho loạt hành động tiếp theo của người dùng và tìm nạp dữ liệu đó trong một lần, qua một kết nối duy nhất, ở mức tối đa.

Bằng cách tải trước các lượt chuyển, bạn sẽ giảm số lần kích hoạt sóng vô tuyến cần thiết để tải dữ liệu xuống. Nhờ đó, bạn không chỉ tiết kiệm pin mà còn cải thiện độ trễ, giảm băng thông cần thiết và giảm thời gian tải xuống.

Tính năng tìm nạp trước cũng giúp cải thiện trải nghiệm người dùng bằng cách giảm thiểu độ trễ trong ứng dụng do phải chờ quá trình tải xuống hoàn tất trước khi thực hiện một hành động hoặc xem dữ liệu.

Sau đây là một ví dụ thực tế.

Trình đọc tin tức

Nhiều ứng dụng tin tức cố gắng giảm băng thông bằng cách chỉ tải tiêu đề xuống sau khi một danh mục được chọn, chỉ tải toàn bộ bài viết khi người dùng muốn đọc và chỉ tải hình thu nhỏ khi người dùng di chuyển đến hình thu nhỏ đó.

Khi sử dụng phương pháp này, sóng vô tuyến buộc phải duy trì hoạt động trong phần lớn phiên đọc tin tức của người dùng khi họ di chuyển qua các tiêu đề, thay đổi danh mục và đọc bài viết. Không chỉ vậy, việc liên tục chuyển đổi giữa các trạng thái năng lượng còn gây ra độ trễ đáng kể khi chuyển đổi danh mục hoặc đọc bài viết.

Cách tiếp cận tốt hơn là tìm nạp trước một lượng dữ liệu hợp lý khi khởi động, bắt đầu bằng nhóm tiêu đề tin tức và hình thu nhỏ đầu tiên (đảm bảo thời gian khởi động có độ trễ thấp) và tiếp tục với các tiêu đề và hình thu nhỏ còn lại, cũng như văn bản bài viết cho mỗi bài viết có sẵn từ ít nhất là danh sách tiêu đề chính.

Một cách khác là tìm nạp trước mọi tiêu đề, hình thu nhỏ, văn bản bài viết và thậm chí có thể là toàn bộ hình ảnh bài viết – thường là trong nền theo lịch biểu định trước. Phương pháp này có nguy cơ tiêu tốn đáng kể băng thông và thời lượng pin để tải nội dung không bao giờ được sử dụng xuống, vì vậy, bạn nên thận trọng khi triển khai.

Các yếu tố cần cân nhắc khác

Mặc dù việc tìm nạp trước dữ liệu mang lại nhiều lợi ích, nhưng nếu sử dụng quá nhiều, việc tìm nạp trước cũng có nguy cơ làm tăng mức tiêu hao pin và mức sử dụng băng thông (cũng như hạn mức tải xuống) bằng cách tải dữ liệu không được sử dụng xuống. Bạn cũng cần đảm bảo rằng quá trình tìm nạp trước không làm chậm quá trình khởi động ứng dụng trong khi ứng dụng chờ quá trình tìm nạp trước hoàn tất. Trên thực tế, điều đó có thể có nghĩa là xử lý dữ liệu dần dần hoặc bắt đầu các lượt chuyển liên tiếp được ưu tiên để dữ liệu cần thiết cho quá trình khởi động ứng dụng được tải xuống và xử lý trước tiên.

Mức độ tích cực của việc tìm nạp trước dữ liệu phụ thuộc vào kích thước của dữ liệu đang được tải xuống và khả năng dữ liệu đó được sử dụng. Theo hướng dẫn sơ bộ, dựa trên máy trạng thái được mô tả trước đó, đối với dữ liệu có 50% khả năng được sử dụng trong phiên người dùng hiện tại, bạn thường có thể tìm nạp trước trong khoảng 6 giây (khoảng 1-2 megabyte) trước khi chi phí tiềm năng của việc tải dữ liệu không sử dụng xuống khớp với khoản tiết kiệm tiềm năng của việc không tải dữ liệu đó xuống.

Nói chung, bạn nên tìm nạp trước dữ liệu sao cho chỉ cần bắt đầu một lượt tải xuống khác sau mỗi 2 đến 5 phút và theo thứ tự từ 1 đến 5 megabyte.

Theo nguyên tắc này, các tệp tải xuống có dung lượng lớn (chẳng hạn như tệp video) phải được tải xuống theo từng phần theo định kỳ (mỗi 2 đến 5 phút), chỉ tìm nạp trước dữ liệu video có khả năng được xem trong vài phút tiếp theo.

Một giải pháp là lên lịch để quá trình tải xuống toàn bộ chỉ diễn ra khi kết nối với Wi-Fi và có thể chỉ khi thiết bị đang sạc. WorkManager API hỗ trợ chính xác trường hợp sử dụng này, cho phép bạn hạn chế công việc trong nền cho đến khi thiết bị đáp ứng các tiêu chí do nhà phát triển chỉ định, chẳng hạn như đang sạc và kết nối với Wi-Fi.

Kiểm tra kết nối trước khi gửi yêu cầu

Tìm kiếm tín hiệu di động là một trong những thao tác tiêu tốn nhiều pin nhất trên thiết bị di động. Phương pháp hay nhất cho các yêu cầu do người dùng thực hiện là trước tiên, hãy kiểm tra kết nối bằng ConnectivityManager, như trong phần Theo dõi trạng thái kết nối và định mức kết nối. Nếu không có mạng, ứng dụng có thể tiết kiệm pin bằng cách không buộc sóng di động phải tìm kiếm. Sau đó, yêu cầu có thể được lên lịch và thực hiện theo lô cùng với các yêu cầu khác khi có kết nối.

Kết nối nhóm

Ngoài việc phân lô và tìm nạp trước, bạn có thể áp dụng một chiến lược khác là gộp các kết nối mạng của ứng dụng.

Việc sử dụng lại các kết nối mạng hiện có thường hiệu quả hơn so với việc bắt đầu kết nối mới. Việc sử dụng lại các kết nối cũng cho phép mạng phản ứng thông minh hơn với tình trạng tắc nghẽn và các vấn đề liên quan đến dữ liệu mạng.

HttpURLConnection và hầu hết các ứng dụng HTTP, chẳng hạn như OkHttp, đều bật tính năng gộp kết nối theo mặc định và sử dụng lại cùng một kết nối cho nhiều yêu cầu.

Tổng kết và kế hoạch sắp tới

Trong phần này, bạn đã tìm hiểu rất nhiều về sóng vô tuyến không dây và một số chiến lược mà bạn có thể áp dụng rộng rãi để mang lại trải nghiệm nhanh chóng, thích ứng cho người dùng, đồng thời giảm mức tiêu hao pin.

Trong phần tiếp theo, chúng ta sẽ xem xét chi tiết 3 loại tương tác mạng riêng biệt phổ biến đối với hầu hết các ứng dụng. Bạn sẽ tìm hiểu các yếu tố thúc đẩy cho từng loại tương tác này, cũng như các kỹ thuật và API hiện đại để quản lý các tương tác này một cách hiệu quả.