W Androidzie 4.0 statystyki przekazywane przez interfejsy sieciowe systemu Linux są rejestrowane z upływem czasu i służą m.in. do egzekwowania limitów kwoty sieciowej oraz do renderowania wykresów widocznych dla użytkownika.
Każdy sterownik urządzenia sieciowego (w tym Wi-Fi) musi być zgodny ze standardowym cyklem życia urządzenia jądra i zwracać prawidłowe statystyki za pomocą funkcji dev_get_stats()
. W szczególności zwracane statystyki muszą być ściśle monotoniczne, gdy interfejs jest aktywny. Kierowcy mogą zresetować statystyki tylko po pomyślnym ukończeniu unregister_netdev()
lub równoważnego procesu, który generuje zdarzenie NETDEV_UNREGISTER
dla wywołań zwrotnych zarejestrowanych za pomocą funkcji register_netdevice_notifier()
/ register_inetaddr_notifier()
/ register_inet6addr_notifier()
.
Operatorzy komórkowi zwykle mierzą wykorzystanie danych na poziomie Internetu (IP). Aby dopasować to podejście w Androidzie 4.0, korzystamy z faktu, że w przypadku urządzeń z jądrem interesują nas wartości rx_bytes
i tx_bytes
zwracane przez dev_get_stats()
, które dokładnie odpowiadają liczbie bajtów przesłanych na poziomie Internetu (IP
). Zdajemy sobie sprawę, że w przypadku innych urządzeń może być inaczej. Obecnie ta funkcja opiera się na tej osobliwości. Nowe sterowniki powinny mieć tę samą właściwość, a wartości dev_get_stats()
nie powinny obejmować opóźnienia związanego z enkapsulacją na niższych warstwach sieci (np. nagłówków Ethernet) i najlepiej nie powinny obejmować innego ruchu (np. ARP), chyba że jest on nieistotny.
Platforma Androida zbiera statystyki tylko z interfejsów sieci powiązanych z NetworkStateTracker
w ConnectivityService
. Dzięki temu framework może dokładnie zidentyfikować każdy interfejs sieci, w tym jego typ (np. TYPE_MOBILE
lub TYPE_WIFI
) oraz tożsamość abonenta (np. IMSI). Wszystkie interfejsy sieci używane do kierowania danych powinny być reprezentowane przez NetworkStateTracker
, aby można było prawidłowo uwzględniać statystyki.