Omówienie jądra systemu

Funkcja monitorowania i śledzenia wykorzystania danych w poszczególnych aplikacjach oraz w przypadku delegowania zależy od modułu xt_qtaguid w jądrze Linuksa w wersji 3.0 (kernel/net/netfilter/xt_qtaguid). Funkcja oznaczania gniazd w ramce (system/core/libcutils/qtaguid.c) zależy głównie od istnienia interfejsu /proc/net/xt_qtaguid/ctrl wyeksportowanego przez moduł jądra xt_qtaguid.

Moduł filtra sieci quota2 (pierwotnie część xtables-addons) umożliwia funkcji ustawiania limitów związanych z nazwanymi limitami i został rozszerzony o powiadomienie o przestrzeni użytkownika po osiągnięciu określonych limitów. Gdy limit kwoty zostanie osiągnięty, moduł quota2 odrzuca cały następny ruch sieciowy. Możesz też określić dodatkowe reguły, aby ograniczyć ruch danych w tle w aplikacji (patrz com.android.server.NetworkManagementSocketTagger.setKernelCounterSetandroid.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND).

Jak to działa?

Moduł netfilter qtaguid śledzi ruch sieciowy na podstawie gniazda w przypadku każdej aplikacji, używając unikalnego identyfikatora UID tej aplikacji. Z każdym gniazdem w systemie powiązane są 2 składniki tagu. Pierwszym jest identyfikator UID, który jednoznacznie identyfikuje aplikację odpowiedzialną za przesyłanie danych (w systemie Linux można przypisać własność każdego gniazda sieciowego do identyfikatora UID aplikacji wywołującej). Drugi komponent tagu służy do dodatkowego określania ruchu w kategoriach określonych przez dewelopera aplikacji. Za pomocą tych tagów na poziomie aplikacji aplikacja może profilować ruch w kilka podkategorii.

W przypadku aplikacji, które zapewniają przesyłanie danych w sieci jako usługę, takich jak menedżer pobierania czy usługa przesyłania strumieniowego multimediów, można przypisać własność przesyłania danych w sieci do identyfikatora UID aplikacji przesyłającej żądanie za pomocą wywołania funkcji TrafficStats.setThreadStatsUid(). Aby ponownie przypisać własność ruchu sieciowego, rozmówca musi mieć uprawnienie „android.permission.MODIFY_NETWORK_ACCOUNTING”.