تستخدم أداة eBPF الخاصة بنقل بيانات الشبكة مزيجًا من عمليات التنفيذ في مساحة النواة ومساحة المستخدم لمراقبة استخدام الشبكة على الجهاز منذ آخر عملية إعادة تشغيل للجهاز. ويوفّر وظائف إضافية، مثل وضع علامات على المقابس وفصل حركة البيانات في المقدّمة والخلفية وجدار الحماية لكل معرّف مستخدم (UID) لحظر وصول التطبيقات إلى الشبكة استنادًا إلى حالة الهاتف. يتم تخزين الإحصاءات التي يتم جمعها من الأداة في بنية بيانات أساسية تُسمى eBPF maps
، وتستخدم الخدمات، مثل NetworkStatsService
، النتيجة لتقديم إحصاءات مستمرة عن عدد الزيارات منذ آخر عملية تشغيل.
أمثلة ومصدر
تتعلّق التغييرات في مساحة المستخدم بشكل أساسي بمشروعَي system/netd
وframework/base
. يتم التطوير في مشروع Android مفتوح المصدر (AOSP)، لذا سيكون رمز AOSP دائمًا محدّثًا. يقع المصدر بشكل أساسي في
system/netd/server/TrafficController*
وsystem/netd/bpfloader
وsystem/netd/libbpf/
.
تم إجراء بعض التغييرات الضرورية في إطار العمل في framework/base/
وsystem/core
أيضًا.
التنفيذ
اعتبارًا من الإصدار 9 من نظام التشغيل Android، يجب أن تستخدم أجهزة Android التي تعمل بالإصدار 4.9 من النواة أو الإصدارات الأحدث والتي تم شحنها في الأصل مع الإصدار P من نظام التشغيل طريقة احتساب مراقبة عدد الزيارات على الشبكة المستندة إلى eBPF بدلاً من xt_qtaguid
. تتسم البنية الأساسية الجديدة بمرونة أكبر وسهولة أكبر في الصيانة، ولا تتطلّب أي رمز نواة خارج الشجرة.
يتم توضيح الاختلافات الرئيسية في التصميم بين مراقبة الزيارات القديمة ومراقبة الزيارات المستندة إلى eBPF في الشكل 1.
الشكل 1. الاختلافات بين تصميم مراقبة الزيارات القديم (على اليمين) وتصميم eBPF (على اليسار)
يستند التصميم الجديد trafficController
أيضًا إلى فلتر cgroup
eBPF لكل xt_bpf
بالإضافة إلى وحدة netfilter داخل النواة. يتم تطبيق فلاتر eBPF هذه على عمليات إرسال/استلام الحِزم عندما تمر عبر الفلتر. يقع فلتر cgroup
eBPF
في طبقة النقل وهو مسؤول عن احتساب عدد الزيارات
مقابل معرّف المستخدم الصحيح استنادًا إلى معرّف المستخدم الخاص بالمقبس بالإضافة إلى إعداد مساحة المستخدم.
يتم ربط xt_bpf
netfilter بالسلسلتَينbw_raw_PREROUTING
وbw_mangle_POSTROUTING
، وهو مسؤول عن احتساب عدد الزيارات على الواجهة الصحيحة.
عند بدء التشغيل، تنشئ عملية مساحة المستخدم trafficController
خرائط eBPF
المستخدَمة لجمع البيانات وتثبّت جميع الخرائط كملف افتراضي في sys/fs/bpf
.
بعد ذلك، تحمّل العملية ذات الامتيازات bpfloader
برنامج eBPF المجمَّع مسبقًا إلى النواة وتربطه بـ cgroup
الصحيح. هناك جذر واحد
cgroup
لكل الزيارات، لذا يجب تضمين جميع العمليات في هذا cgroup
تلقائيًا.
في وقت التشغيل، يمكن trafficController
إضافة علامة إلى مقبس أو إزالتها منه عن طريق الكتابة إلى traffic_cookie_tag_map
وtraffic_uid_counterSet_map
. يمكن لـ NetworkStatsService
قراءة بيانات إحصاءات حركة المرور من traffic_tag_stats_map
وtraffic_uid_stats_map
وtraffic_iface_stats_map
.
بالإضافة إلى وظيفة جمع إحصاءات عدد الزيارات، يكون فلتر trafficController
وcgroup
eBPF مسؤولاً أيضًا عن حظر الزيارات من معرّفات مستخدمين (UID) معيّنة استنادًا إلى إعدادات الهاتف. تستبدل ميزة حظر حركة بيانات الشبكة المستندة إلى معرّف المستخدم (UID) الوحدة xt_owner
داخل النواة، ويمكن ضبط وضع التفاصيل من خلال الكتابة إلى traffic_powersave_uid_map
وtraffic_standby_uid_map
وtraffic_dozable_uid_map
.
تتّبع عملية التنفيذ الجديدة عملية تنفيذ وحدة xt_qtaguid
القديمة، وبالتالي سيتم تشغيل TrafficController
وNetworkStatsService
باستخدام عملية التنفيذ القديمة أو الجديدة. إذا كان التطبيق يستخدم واجهات برمجة تطبيقات عامة، لن يواجه أي اختلاف سواء تم استخدام أدوات xt_qtaguid
أو eBPF في الخلفية.
إذا كانت نواة الجهاز تستند إلى النواة الشائعة لنظام Android 4.9 (SHA 39c856663dcc81739e52b02b77d6af259eb838f6 أو الإصدارات الأحدث)، لن يكون من الضروري إجراء أي تعديلات على طبقات HAL أو برامج التشغيل أو رمز النواة لتنفيذ أداة eBPF الجديدة.
المتطلبات
يجب أن يتضمّن إعدادات النواة الإعدادات التالية مفعَّلة:
CONFIG_CGROUP_BPF=y
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NETFILTER_XT_MATCH_BPF=y
CONFIG_INET_UDP_DIAG=y
يفيدك اختبار إعدادات نواة VTS عند التحقّق من تفعيل الإعدادات الصحيحة.
عملية إيقاف xt_qtaguid القديمة نهائيًا
تحلّ أداة eBPF الجديدة محلّ الوحدة xt_qtaguid
والوحدة xt_owner
التي تستند إليها. سنبدأ بإزالة وحدة xt_qtaguid
من نواة Android وإيقاف الإعدادات غير الضرورية.
في إصدار Android 9، يتم تفعيل الوحدة xt_qtaguid
على جميع الأجهزة، ولكن يتم نقل جميع واجهات برمجة التطبيقات العامة التي تقرأ ملف proc الخاص بالوحدة xt_qtaguid
مباشرةً إلى خدمة NetworkManagement
.
استنادًا إلى إصدار نواة الجهاز ومستوى واجهة برمجة التطبيقات الأول، تعرف الخدمة ما إذا كانت أدوات eBPF مفعّلة وتختار الوحدة المناسبة للحصول على إحصاءات استخدام الشبكة لكل تطبيق. ويتم حظر التطبيقات التي تستخدم المستوى 28 من حزمة تطوير البرامج (SDK) والإصدارات الأحدث من الوصول إلى ملفات xt_qtaguid
proc من خلال sepolicy.NetworkManagement
في إصدار Android التالي بعد الإصدار 9، سيتم حظر وصول التطبيقات إلى ملفات xt_qtaguid
proc هذه تمامًا، وسنبدأ في إزالة وحدة xt_qtaguid
من نواة Android الشائعة الجديدة. بعد إزالة xt_qtaguid
، سنعدّل إعدادات Android الأساسية لإصدار النواة هذا بهدف إيقاف وحدة xt_qtaguid
صراحةً، وسيتم إيقاف وحدة xt_qtaguid
نهائيًا عندما يصبح الحد الأدنى لإصدار النواة المطلوب لإصدار Android هو 4.9 أو إصدار أحدث.
في إصدار Android 9، لا يُشترط توفُّر ميزة eBPF الجديدة إلا في الأجهزة التي تم طرحها مع إصدار Android 9. بالنسبة إلى الأجهزة التي تم شحنها بنواة يمكنها دعم أدوات eBPF، ننصحك بتحديثها إلى ميزة eBPF الجديدة عند الترقية إلى إصدار Android 9. لا يتوفّر اختبار CTS لفرض هذا التحديث.
التحقُّق
يجب الحصول بانتظام على حِزم تصحيح من نوى Android الشائعة وAndroid AOSP
main. تأكَّد من أنّ عملية التنفيذ تجتاز اختبارات VTS وCTS ذات الصلة، وnetd_unit_test
، وlibbpf_test
.
الاختبار
تتوفّر
اختبارات net_tests في النواة
للتأكّد من تفعيل الميزات المطلوبة وتوفير تصحيحات النواة المطلوبة
المتوافقة مع الإصدارات القديمة. يتم دمج الاختبارات كجزء من اختبارات VTS في إصدار Android 9. تتوفّر بعض اختبارات الوحدات في system/netd/
(netd_unit_test
وlibbpf_test
).
تتوفّر بعض الاختبارات في netd_integration_test
للتحقّق من السلوك العام
للأداة الجديدة.
مجموعة أدوات اختبار التوافق (CTS) وأداة التحقّق في مجموعة أدوات اختبار التوافق (CTS)
بما أنّ كلا وحدتَي مراقبة عدد الزيارات متوافقان مع إصدار Android 9، لا يتوفّر اختبار CTS لفرض تنفيذ الوحدة الجديدة على جميع الأجهزة. ومع ذلك، بالنسبة إلى الأجهزة التي تعمل بإصدار النواة الأحدث من 4.9
والتي تم طرحها في الأصل مع إصدار Android 9 (أي
المستوى الأول من واجهة برمجة التطبيقات >= 28)، تتوفّر اختبارات CTS على صورة نظام GSI للتحقّق من أنّ
الوحدة الجديدة تم ضبطها بشكل صحيح. يمكن استخدام اختبارات CTS القديمة، مثل TrafficStatsTest
وNetworkUsageStatsTest
وCtsNativeNetTestCases
، للتحقّق من أنّ السلوك متوافق مع وحدة المعرّف الفريد القديمة.
الاختبار اليدوي
تتوفّر بعض اختبارات الوحدات في system/netd/
(netd_unit_test
وnetd_integration_test
وlibbpf_test
).
تتوفّر إمكانية استخدام dumpsys للتحقّق من الحالة يدويًا. يعرض الأمر
dumpsys netd
الحالة الأساسية للوحدة trafficController
وما إذا كان eBPF مفعّلاً بشكل صحيح. في حال تفعيل eBPF، يعرض الأمر
dumpsys netd trafficcontroller
المحتوى التفصيلي لكل خريطة eBPF،
بما في ذلك معلومات مأخوذة من المقبس، وإحصاءات لكل علامة، ومعرّف المستخدم (UID) وiface،
ومطابقة معرّف المستخدم (UID) للمالك.
مواقع الاختبار
تتوفّر اختبارات مجموعة أدوات اختبار التوافق (CTS) في:
- https://android.googlesource.com/platform/cts/+/android16-release/tests/tests/net/src/android/net/cts/TrafficStatsTest.java
- https://android.googlesource.com/platform/cts/+/android16-release/tests/tests/app.usage/src/android/app/usage/cts/NetworkUsageStatsTest.java
- https://android.googlesource.com/platform/system/netd/+/android16-release/tests/bpf_base_test.cpp
يمكن العثور على اختبارات VTS على الرابط https://android.googlesource.com/kernel/tests/+/android16-release/net/test/bpf_test.py.
تتوفّر اختبارات الوحدات في: