ภาพรวมของเคอร์เนล

ฟังก์ชันการทำงานของการตรวจสอบและการติดตามปริมาณการใช้อินเทอร์เน็ตต่อแอปและการใช้ข้อมูลที่มอบหมาย นั้นขึ้นอยู่กับโมดูล xt_qtaguid ในเคอร์เนล android-3.0 Linux (kernel/net/netfilter/xt_qtaguid) ฟังก์ชันการทำงานของการติดแท็กซ็อกเก็ต ในเฟรมเวิร์ก (system/core/libcutils/qtaguid.c) ขึ้นอยู่กับการมีอยู่ของ /proc/net/xt_qtaguid/ctrl อินเทอร์เฟซที่ส่งออกโดยโมดูลเคอร์เนล xt_qtaguid เป็นหลัก

โมดูล quota2 netfilter (เดิมเป็นส่วนหนึ่งของ xtables-addons) ช่วยให้ฟังก์ชันการทำงานสามารถกำหนดขีดจำกัดโควต้าที่มีชื่อ และได้รับการขยายเพื่อรองรับการแจ้งเตือนพื้นที่ผู้ใช้เมื่อถึงขีดจำกัดบางอย่าง เมื่อถึงขีดจำกัดโควต้าแล้ว โมดูล quota2 จะทิ้งการจราจรของข้อมูลในเครือข่ายทั้งหมดที่ตามมา เฟรมเวิร์กยังระบุกฎเพิ่มเติมเพื่อจำกัดการรับส่งข้อมูลเบื้องหลังของแอปได้ด้วย (ดู com.android.server.NetworkManagementSocketTagger.setKernelCounterSet และ android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND)

วิธีการทำงาน

โมดูล qtaguid netfilter จะติดตามการจราจรของข้อมูลในเครือข่ายตามซ็อกเก็ตสำหรับทุกแอปโดยใช้ UID ที่ไม่ซ้ำกันของแอปที่เป็นเจ้าของ ระบบจะเชื่อมโยงคอมโพเนนต์แท็ก 2 รายการกับซ็อกเก็ตใดๆ ในระบบ รายการแรกคือ UID ซึ่งระบุแอปที่รับผิดชอบการโอนข้อมูลได้อย่างไม่ซ้ำกัน (Linux อนุญาตให้กำหนดความเป็นเจ้าของซ็อกเก็ตเครือข่ายแต่ละรายการให้กับ UID ของแอปที่เรียก) คอมโพเนนต์แท็กที่ 2 ใช้เพื่อรองรับการจัดประเภทการรับส่งข้อมูลเพิ่มเติมเป็นหมวดหมู่ที่นักพัฒนาแอปกำหนด แอปสามารถสร้างโปรไฟล์การรับส่งข้อมูลเป็นหมวดหมู่ย่อยหลายหมวดหมู่ได้โดยใช้แท็กระดับแอปเหล่านี้

ในกรณีของแอปที่ให้บริการการโอนข้อมูลเครือข่าย เช่น โปรแกรมจัดการการดาวน์โหลด บริการสตรีมมิงสื่อ เป็นต้น คุณสามารถกำหนดความเป็นเจ้าของการโอนข้อมูลเครือข่ายให้กับ UID ของแอปที่ขอได้โดยใช้การเรียกฟังก์ชัน TrafficStats.setThreadStatsUid() ผู้เรียกต้องมีสิทธิ์ "android.permission.MODIFY_NETWORK_ACCOUNTING" เพื่อกำหนดความเป็นเจ้าของการจราจรของข้อมูลในเครือข่ายใหม่