Omówienie statystyk interfejsu sieci

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_bytestx_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 NetworkStateTrackerConnectivityService. 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.