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

ฟังก์ชันการตรวจสอบและติดตามการใช้อินเทอร์เน็ตต่อแอปและแบบมอบสิทธิ์ จะขึ้นอยู่กับโมดูล xt_qtaguid ในเคอร์เนล Linux ของ Android 3.0 (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" เพื่อกำหนดการเป็นเจ้าของการรับส่งข้อมูลในเครือข่ายใหม่