Chức năng giám sát và theo dõi mức sử dụng dữ liệu theo từng ứng dụng và được uỷ quyền dựa trên mô-đun xt_qtaguid trong nhân Linux android-3.0 (kernel/net/netfilter/xt_qtaguid
). Chức năng gắn thẻ socket trong khung (system/core/libcutils/qtaguid.c
) chủ yếu dựa vào sự tồn tại của giao diện /proc/net/xt_qtaguid/ctrl
do mô-đun nhân xt_qtaguid
xuất.
Mô-đun quota2
netfilter (vốn là một phần của xtables-addons
) cho phép chức năng đặt hạn mức có tên và được mở rộng để hỗ trợ thông báo cho không gian người dùng khi đạt đến một số hạn mức nhất định. Sau khi đạt đến hạn mức, mô-đun quota2
sẽ loại bỏ tất cả lưu lượng truy cập mạng tiếp theo. Khung này cũng có thể chỉ định các quy tắc bổ sung để hạn chế lưu lượng dữ liệu nền cho một ứng dụng (tham khảo com.android.server.NetworkManagementSocketTagger.setKernelCounterSet
và android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND
).
Cách thức hoạt động
Mô-đun qtaguid
netfilter theo dõi lưu lượng truy cập mạng trên cơ sở mỗi ổ cắm cho mọi ứng dụng bằng cách sử dụng UID riêng biệt của ứng dụng sở hữu. Có 2 thành phần thẻ được liên kết với mọi ổ cắm trong hệ thống. Đầu tiên là UID, mã này xác định riêng biệt ứng dụng chịu trách nhiệm truyền dữ liệu (Linux cho phép gán quyền sở hữu của từng ổ cắm mạng cho UID của ứng dụng gọi). Thành phần thẻ thứ hai được dùng để hỗ trợ việc phân loại lưu lượng truy cập thành các danh mục khác do nhà phát triển ứng dụng chỉ định. Bằng cách sử dụng các thẻ cấp ứng dụng này, một ứng dụng có thể lập hồ sơ lưu lượng truy cập thành nhiều danh mục phụ.
Trong trường hợp các ứng dụng cung cấp dịch vụ truyền dữ liệu qua mạng, chẳng hạn như trình quản lý tải xuống, dịch vụ phát trực tuyến nội dung nghe nhìn, v.v., bạn có thể gán quyền sở hữu việc truyền dữ liệu qua mạng cho UID của ứng dụng yêu cầu bằng cách sử dụng lệnh gọi hàm TrafficStats.setThreadStatsUid()
. Phương thức gọi phải giữ quyền "android.permission.MODIFY_NETWORK_ACCOUNTING
" để chỉ định lại quyền sở hữu lưu lượng truy cập mạng.