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ể có tác độ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 lưu lượng truy cập và xác định nguồn lưu lượng truy cập. Các yêu cầu kết nối mạng có thể đến trực tiếp 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 cho bạn biết 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 các vấn đề.

Sử dụng Trình phân tích mạng để giám sát 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, cũng như tối ưu hoá mã cơ bản một cách 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 tải lên theo nhóm.

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

Để xác định rõ hơn nguyên nhân dẫn đến tình trạng chuyển dữ liệu tăng đột biến, API 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 sẽ không tự động gắn thẻ tất cả lưu lượng truy cập cho một luồng cụ thể; các thẻ phải được áp dụng cho các socket.

Sau khi đặt thẻ luồng, bạn có thể gắn thẻ và huỷ 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 cổng 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 gửi hoặc nhận gói mạng (có thể khác với thời điểm người dùng ghi hoặc đọc dữ liệu, do việc 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ố đại diện cho các 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 cũng gắn thẻ và bỏ thẻ ổ cắm khi được tái chế thông qua các nhóm giữ hoạt động như minh hoạ 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á một cách phù hợp. Hoạt động mạng thường xuyên do ứng dụng của bạn tạo ra 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 ở nền trước hoặc nếu thiết bị đang ở trong túi hay 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 đang thực hiện một thao tác 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êm thông tin mà ứng dụng của bạn cần nhận. Mục tiêu của bạn khi 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 của chú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 khiến việc tối ưu hoá loại sử dụng mạng này trong ứng dụng của bạn trở nên khó khăn. Ngoài ra, người dùng mong muốn có phản hồi nhanh khi đang dùng ứng dụng. Vì vậy, việc trì hoãn các yêu cầu để tăng tính hiệu quả có thể dẫn đến trải nghiệm kém cho người dùng. Nhìn chung, trong khi người dùng đang tương tác trực tiếp với ứng dụng, bạn nên ưu tiên phản hồi nhanh cho người dùng thay vì sử dụng mạng hiệu quả.

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

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 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 thử 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 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á 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. 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ó 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 dành cho thiết bị đó.

Để biết các đề xuất 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á yêu cầu do máy chủ khởi tạo.

Sử dụng Battery Historian để trực quan hoá tác độ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 xem hoạt động mạng của bạn ảnh hưởng như thế nào đế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ó đang dùng sóng di động thường xuyên hơn dự kiến 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 Lập hồ sơ mức sử dụng pin bằng Batterystats và Battery Historian.