סקירה כללית של הליבה

הפונקציונליות של המעקב והניטור אחרי השימוש בנתונים לכל אפליקציה ונתונים שהוקצו לצד שלישי מבוססת על המודול xt_qtaguid בליבה של Android 3.0 Linux‏ (kernel/net/netfilter/xt_qtaguid). הפונקציונליות של תיוג השקעים במסגרת (system/core/libcutils/qtaguid.c) מבוססת בעיקר על קיומו של ממשק /proc/net/xt_qtaguid/ctrl שיוצא על ידי מודול הליבה xt_qtaguid.

מודול netfilter‏ quota2 (שהיה במקור חלק מ-xtables-addons) מאפשר להגדיר מגבלות מכסות בעלות שם, והוא הורחב כדי לתמוך בהתראות למרחב המשתמש כשמגיעים למגבלות מסוימות. אחרי שמגיעים למגבלת המכסה, המודול quota2 משמיד את כל תעבורת הרשת הבאה. אפשר גם לציין כללים נוספים במסגרת כדי להגביל את תעבורת הנתונים ברקע של אפליקציה (מידע נוסף זמין במאמרים com.android.server.NetworkManagementSocketTagger.setKernelCounterSet ו-android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND).

איך זה עובד?

מודול netfilter של qtaguid עוקב אחרי תעבורת הנתונים ברשת לפי שקע לכל אפליקציה באמצעות מזהה ה-UID הייחודי של האפליקציה הבעלים. יש שני רכיבי תגים שמשויכים לכל שקע במערכת. הראשון הוא ה-UID, שמזהה באופן ייחודי את האפליקציה שאחראית להעברת הנתונים (ב-Linux אפשר לשייך את הבעלות על כל שקע רשת ל-UID של אפליקציית הקריאה). רכיב התג השני משמש לתיאור נוסף של התנועה בקטגוריות שצוינו על ידי מפתחי האפליקציה. באמצעות התגים האלה ברמת האפליקציה, האפליקציה יכולה ליצור פרופיל של התנועה לכמה קטגוריות משנה.

במקרה של אפליקציות שמספקות העברת נתונים ברשת כשירות, כמו מנהל ההורדות, שירות סטרימינג של מדיה וכו', אפשר לשייך את הבעלות על העברת הנתונים ברשת למזהה ה-UID של האפליקציה המבקשת באמצעות קריאת הפונקציה TrafficStats.setThreadStatsUid(). כדי להקצות מחדש את הבעלות על התנועה ברשת, הוא צריך להחזיק בהרשאה 'android.permission.MODIFY_NETWORK_ACCOUNTING'.