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

הפונקציונליות של המעקב והניטור אחרי השימוש בנתונים לכל אפליקציה ונתונים שהוקצו לצד שלישי מבוססת על המודול 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 כדי להקצות מחדש את הבעלות על תעבורת הנתונים ברשת.