عملکرد نظارت و ردیابی مصرف داده به ازای هر برنامه و تفویضشده، به ماژول xt_qtaguid در هسته لینوکس 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 منحصر به فرد برنامه مالک، ردیابی میکند. دو جزء برچسب مرتبط با هر سوکت در سیستم وجود دارد. اولین جزء UID است که به طور منحصر به فرد برنامهای را که مسئول انتقال دادهها است، شناسایی میکند (لینوکس امکان نسبت دادن مالکیت هر سوکت شبکه به UID برنامه فراخوانی کننده را فراهم میکند). جزء برچسب دوم برای پشتیبانی از توصیف بیشتر ترافیک در دستههای مشخص شده توسط توسعهدهنده برنامه استفاده میشود. با استفاده از این برچسبهای سطح برنامه، یک برنامه میتواند ترافیک را به چندین زیردسته تقسیم کند.
در مورد برنامههایی که انتقال دادههای شبکه را به عنوان یک سرویس ارائه میدهند، مانند مدیریت دانلود، سرویس پخش رسانه و غیره، میتوان مالکیت انتقال دادههای شبکه را با استفاده از فراخوانی تابع TrafficStats.setThreadStatsUid() به UID برنامه درخواستکننده نسبت داد. فراخوانیکننده باید مجوز " android.permission.MODIFY_NETWORK_ACCOUNTING " را برای واگذاری مجدد مالکیت ترافیک شبکه داشته باشد.