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

הפונקציונליות של מעקב וניטור שימוש בחבילת הגלישה לפי אפליקציה ובהרשאת גישה מוגבלת מסתמכת על מודול xt_qtaguid בקרנל של android-3.0 Linux ‏ (kernel/net/netfilter/xt_qtaguid). הפונקציונליות של תיוג שקעים ב-framework ‏ (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 עוקב אחרי תעבורת הרשת על בסיס כל שקע (socket) עבור כל אפליקציה באמצעות מזהה המשתמש (UID) הייחודי של האפליקציה שבבעלותה השקע. יש שני רכיבי תג שמשויכים לכל שקע במערכת. הראשון הוא ה-UID שמזהה באופן ייחודי את האפליקציה שאחראית להעברת הנתונים (ב-Linux אפשר לשייך את הבעלות על כל שקע רשת ל-UID של האפליקציה שקוראת). רכיב התג השני משמש לתמיכה בסיווג נוסף של התנועה לקטגוריות שצוינו על ידי מפתח האפליקציה. באמצעות התגים האלה ברמת האפליקציה, אפשר ליצור פרופיל של התנועה באפליקציה לפי כמה קטגוריות משנה.

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