نمای کلی هسته

عملکرد نظارت و ردیابی مصرف داده براساس برنامه و واگذارشده به ماژول 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 مراجعه کنید).

روش کار؟

ماژول netfilter qtaguid ترافیک شبکه را بر اساس هر سوکت برای هر برنامه بااستفاده از UID منحصربه‌فرد برنامه مالک ردیابی می‌کند. دو مؤلفه برچسب مرتبط با هر سوکت در سیستم وجود دارد. اولین مورد UID است که برنامه مسئول انتقال داده را به‌صورت منحصربه‌فرد شناسایی می‌کند (Linux این امکان را فراهم می‌کند که مالکیت هر سوکت شبکه به UID برنامه تماس‌گیرنده نسبت داده شود). از عنصر برچسب دوم برای پشتیبانی از مشخصه‌های اضافی ترافیک در دسته‌های مشخص‌شده توسعه‌دهنده برنامه استفاده می‌شود. بااستفاده از این برچسب‌های سطح برنامه، یک برنامه می‌تواند ترافیک را به چند زیردسته دسته‌بندی کند.

درمورد برنامه‌هایی که انتقال داده شبکه را به‌عنوان سرویس ارائه می‌دهند، مانند مدیر بارگیری، سرویس جاری‌سازی رسانه، و غیره، می‌توان مالکیت انتقال داده شبکه را بااستفاده از فراخوانی تابع TrafficStats.setThreadStatsUid() به شناسه کاربری برنامه درخواست‌کننده نسبت داد. تماس‌گیرنده باید اجازه «android.permission.MODIFY_NETWORK_ACCOUNTING» را داشته باشد تا بتواند مالکیت ترافیک شبکه را دوباره واگذار کند.