Przegląd jądra

Funkcja monitorowania i śledzenia wykorzystania danych przez poszczególne aplikacje i przekazywania tych informacji zależy od modułu xt_qtaguid w jądrze systemu Linux w wersji android-3.0 (kernel/net/netfilter/xt_qtaguid). Funkcja tagowania gniazd w platformie (system/core/libcutils/qtaguid.c) zależy głównie od istnienia interfejsu /proc/net/xt_qtaguid/ctrl eksportowanego przez moduł jądra xt_qtaguid.

Moduł quota2 netfilter (pierwotnie część xtables-addons) umożliwia ustawianie nazwanych limitów kwot i został rozszerzony o funkcję powiadamiania przestrzeni użytkownika o osiągnięciu określonych limitów. Po osiągnięciu limitu moduł quota2 odrzuca cały kolejny ruch sieciowy. Platforma może też określać dodatkowe reguły ograniczające ruch danych w tle w przypadku aplikacji (patrz com.android.server.NetworkManagementSocketTagger.setKernelCounterSetandroid.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND).

Jak to działa?

Moduł qtaguid netfilter śledzi ruch sieciowy na poziomie gniazda w przypadku każdej aplikacji, używając unikalnego identyfikatora UID aplikacji będącej właścicielem. Z każdym gniazdem w systemie są powiązane 2 komponenty tagu. Pierwszy to UID, który jednoznacznie identyfikuje aplikację odpowiedzialną za przesyłanie danych (system Linux umożliwia przypisanie własności każdego gniazda sieciowego do identyfikatora UID aplikacji wywołującej). Drugi komponent tagu służy do dodatkowej charakterystyki ruchu w aplikacji w kategoriach określonych przez dewelopera aplikacji. Za pomocą tych tagów na poziomie aplikacji może ona podzielić ruch na kilka podkategorii.

W przypadku aplikacji, które zapewniają przesyłanie danych w sieci jako usługę, np. menedżera pobierania, usługi strumieniowego przesyłania multimediów itp., można przypisać własność przesyłania danych w sieci do identyfikatora UID aplikacji wysyłającej żądanie za pomocą wywołania funkcji TrafficStats.setThreadStatsUid(). Aby ponownie przypisać własność ruchu w sieci, wywołujący musi mieć uprawnienie „android.permission.MODIFY_NETWORK_ACCOUNTING”.