Khắc phục sự cố mạng

Lưu lượng truy cập mạng do ứng dụng tạo ra có thể ảnh hưởng đáng kể đến thời lượng pin của thiết bị. Để tối ưu hoá lưu lượng truy cập đó, bạn cần đo lường và xác định nguồn lưu lượng truy cập. Yêu cầu mạng có thể đến trực tiếp từ một hành động của người dùng, từ mã ứng dụng của riêng bạn hoặc từ một máy chủ giao tiếp với ứng dụng của bạn.

Chủ đề này hướng dẫn bạn cách theo dõi và phân loại lưu lượng truy cập mạng, đồng thời cung cấp hướng dẫn về cách xác định và giải quyết vấn đề.

Sử dụng Trình phân tích mạng để theo dõi các yêu cầu

Sử dụng Trình phân tích mạng để theo dõi các yêu cầu mạng của ứng dụng. Bạn có thể theo dõi cách thức và thời điểm ứng dụng chuyển dữ liệu, đồng thời tối ưu hoá mã cơ bản sao cho phù hợp.



Hình 1. Theo dõi lưu lượng truy cập mạng. Mẫu lưu lượng truy cập mạng cho thấy rằng hiệu quả có thể được cải thiện đáng kể bằng cách tìm nạp trước các yêu cầu hoặc gộp các tệp tải lên.

Bằng cách theo dõi tần suất truyền dữ liệu và lượng dữ liệu được truyền trong mỗi lần kết nối, bạn có thể xác định những phần của ứng dụng có thể tiết kiệm pin hơn. Nhìn chung, bạn sẽ tìm thấy các đỉnh ngắn có thể bị trì hoãn.

Để xác định rõ hơn nguyên nhân gây ra sự gia tăng đột biến của hoạt động chuyển dữ liệu, API Số liệu thống kê lưu lượng truy cập cho phép bạn gắn thẻ các hoạt động chuyển dữ liệu xảy ra từ một ổ cắm trong một luồng nhất định bằng cách sử dụng TrafficStats.setThreadStatsTag(). Việc gọi hàm này không tự động gắn thẻ tất cả lưu lượng truy cập cho một luồng cụ thể; bạn phải áp dụng thẻ cho các ổ cắm.

Sau khi đặt thẻ luồng, bạn có thể gắn thẻ và bỏ gắn thẻ từng ổ cắm theo cách thủ công bằng cách sử dụng TrafficStats.tagSocket()TrafficStats.untagSocket(). Thẻ cũng được áp dụng nếu một ổ cắm được mở trên luồng hoặc nếu một ổ cắm máy chủ chấp nhận kết nối.

Việc nhiều luồng truy cập đồng thời vào cùng một ổ cắm sẽ sử dụng bất kỳ thẻ nào mà ổ cắm có khi các gói mạng được gửi hoặc nhận (có thể khác với thời điểm người dùng ghi hoặc đọc dữ liệu, do lưu vào bộ đệm và truyền lại).

Ví dụ: bạn có thể xác định các hằng số để biểu thị nhiều loại lưu lượng truy cập mạng, như trong mã mẫu sau:

Kotlin

const val USER_INITIATED = 0x1000
const val APP_INITIATED = 0x2000
const val SERVER_INITIATED = 0x3000

Java

public static final int USER_INITIATED = 0x1000;
public static final int APP_INITIATED = 0x2000;
public static final int SERVER_INITIATED = 0x3000;

Sau đó, bạn có thể gắn thẻ các yêu cầu mạng cho phù hợp:

Kotlin

TrafficStats.setThreadStatsTag(USER_INITIATED)
TrafficStats.tagSocket(outputSocket)
// Transfer data using socket
TrafficStats.untagSocket(outputSocket)

Java

TrafficStats.setThreadStatsTag(USER_INITIATED);
TrafficStats.tagSocket(outputSocket);
// Transfer data using socket
TrafficStats.untagSocket(outputSocket);

Thư viện HttpURLConnection tự động gắn thẻ ổ cắm dựa trên giá trị TrafficStats.getThreadStatsTag() hiện tại. Thư viện này cũng gắn thẻ và huỷ gắn thẻ ổ cắm khi tái chế thông qua các nhóm giữ nguyên như trong mã mẫu sau:

Kotlin

class IdentifyTransferSpikeTask {
    @WorkerThread
    fun request(url: String) {
        TrafficStats.setThreadStatsTag(APP_INITIATED)
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag()
    }
}

Java

public class IdentifyTransferSpikeTask {
    @WorkerThread
    public void request(String url) {
        TrafficStats.setThreadStatsTag(APP_INITIATED);
        // Make network request using HttpURLConnection.connect()
        ...
        TrafficStats.clearThreadStatsTag();
    }
}

Phân tích các loại lưu lượng truy cập mạng

Khi xem xét lưu lượng truy cập mạng mà ứng dụng của bạn tạo ra, bạn cần hiểu rõ nguồn lưu lượng truy cập để có thể tối ưu hoá lưu lượng truy cập đó một cách thích hợp. Hoạt động mạng liên tục từ ứng dụng của bạn có thể hoàn toàn phù hợp nếu ứng dụng phản hồi hành động của người dùng, nhưng hoàn toàn không phù hợp nếu ứng dụng không chạy trên nền trước hoặc nếu thiết bị đang ở trong túi hoặc ví.

Phân tích lưu lượng truy cập do người dùng khởi tạo

Lưu lượng truy cập mạng do người dùng khởi tạo có thể được nhóm lại với nhau một cách hiệu quả trong khi người dùng thực hiện một nhiệm vụ cụ thể trong ứng dụng của bạn, hoặc được phân bổ không đồng đều khi người dùng yêu cầu thông tin bổ sung mà ứng dụng của bạn cần thu thập. Mục tiêu của bạn trong việc phân tích lưu lượng truy cập mạng do người dùng khởi tạo là tìm kiếm các mẫu sử dụng mạng thường xuyên theo thời gian và cố gắng giảm tần suất sử dụng bằng cách nhóm các yêu cầu lại với nhau.

Việc không dự đoán được các yêu cầu của người dùng đặt ra thách thức cho việc tối ưu hoá hình thức sử dụng mạng này trong ứng dụng của bạn. Ngoài ra, người dùng mong đợi phản hồi nhanh nhạy khi đang tích cực dùng ứng dụng. Vì vậy, việc trì hoãn các yêu cầu để đổi lấy hiệu suất có thể mang đến trải nghiệm kém cho người dùng. Nhìn chung, khi người dùng đang tương tác trực tiếp với ứng dụng của bạn, tốc độ phản hồi người dùng nhanh cần được ưu tiên hơn so với việc sử dụng mạng hiệu quả.

Để biết các đề xuất về cách tối ưu hoá lưu lượng truy cập do người dùng khởi tạo, hãy xem bài viết Tối ưu hoá các yêu cầu do người dùng khởi tạo.

Phân tích lưu lượng truy cập do ứng dụng khởi tạo

Lưu lượng truy cập mạng do ứng dụng khởi tạo thường là khu vực mà bạn có thể tác động đáng kể đến việc sử dụng hiệu quả băng thông mạng. Khi phân tích hoạt động mạng của ứng dụng, hãy tìm khoảng thời gian không hoạt động và xác định xem liệu có thể tăng thời gian không hoạt động lên hay không. Nếu bạn thấy các mẫu truy cập mạng nhất quán từ ứng dụng của mình, hãy cố gắng phân lô lưu lượng truy cập này để cho phép đài phát của thiết bị chuyển về chế độ tiết kiệm pin giữa các khoảng thời gian hoạt động.

Để biết các đề xuất về cách tối ưu hoá lưu lượng truy cập do ứng dụng khởi tạo, hãy xem bài viết Tối ưu hoá các yêu cầu do ứng dụng khởi tạo.

Phân tích lưu lượng truy cập do máy chủ khởi tạo

Hoạt động mạng do các máy chủ giao tiếp với ứng dụng của bạn thực hiện cũng thường là khu vực mà bạn có thể tác động đáng kể đến việc sử dụng hiệu quả băng thông mạng. Giải pháp gửi thông báo qua đám mây của Firebase (FCM) là một cơ chế gọn nhẹ dùng để truyền dữ liệu từ máy chủ đến một thực thể ứng dụng cụ thể. Khi sử dụng FCM, máy chủ của bạn có thể thông báo cho ứng dụng đang chạy trên một thiết bị cụ thể rằng có dữ liệu mới cho ứng dụng đó.

Để biết các đề xuất về cách tối ưu hoá lưu lượng truy cập do máy chủ khởi tạo, hãy xem bài viết Tối ưu hoá các yêu cầu do máy chủ khởi tạo.

Sử dụng Battery Historian để trực quan hoá các hiệu ứng của lưu lượng truy cập mạng

Battery Historian là một công cụ trực quan hoá mức tiêu thụ pin của thiết bị trong một khoảng thời gian. Bạn có thể sử dụng công cụ này để phân tích mức độ ảnh hưởng của hoạt động mạng đến mức tiêu thụ pin. Ví dụ: Battery Historian có thể cho bạn biết liệu ứng dụng của bạn có sử dụng hệ thống phát sóng di động thường xuyên hơn mong đợi hay không. Để biết thêm thông tin về cách sử dụng Battery Historian, hãy xem bài viết Dùng Batterystats và Battery Historian để phân tích mức sử dụng pin.