W systemie Android 4.0 statystyki raportowane przez interfejsy sieciowe systemu Linux są rejestrowane w czasie i są używane do wymuszania limitów przydziału sieci, renderowania wykresów widocznych dla użytkownika i nie tylko.
Każdy sterownik urządzenia sieciowego (w tym Wi-Fi) musi przestrzegać standardowego cyklu życia urządzenia jądra i zwracać poprawne statystyki poprzez dev_get_stats()
. W szczególności zwracane statystyki muszą pozostać monotoniczne, gdy interfejs jest aktywny. Sterowniki mogą zresetować statystyki tylko po pomyślnym zakończeniu unregister_netdev()
lub równoważnej, która generuje zdarzenie NETDEV_UNREGISTER
dla wywołań zwrotnych zarejestrowanych za pomocą register_netdevice_notifier()
/ register_inetaddr_notifier()
/ register_inet6addr_notifier()
.
Operatorzy komórkowi zazwyczaj mierzą wykorzystanie danych w warstwie internetowej (IP). Aby dopasować to podejście w Androidzie 4.0, polegamy na tym, że dla urządzeń jądra zależy nam na wartościach rx_bytes
i tx_bytes
zwracanych przez dev_get_stats()
zwracają dokładnie przesłane bajty warstwy internetowej ( IP
). Ale rozumiemy, że w przypadku innych urządzeń może tak nie być. Na razie funkcja opiera się na tej osobliwości. Nowe sterowniki również powinny mieć tę właściwość, a wartości dev_get_stats()
nie mogą zawierać żadnego narzutu enkapsulacji niższych warstw sieci (takich jak nagłówki Ethernet) i najlepiej nie powinny zawierać innego ruchu (takiego jak ARP), chyba że jest on nieistotny.
Struktura systemu Android zbiera tylko statystyki z interfejsów sieciowych skojarzonych z NetworkStateTracker
w ConnectivityService
. Umożliwia to ramom konkretną identyfikację każdego interfejsu sieciowego, w tym jego typu (takiego jak TYPE_MOBILE
lub TYPE_WIFI
) i tożsamości subskrybenta (takiego jak IMSI). Wszystkie interfejsy sieciowe używane do trasowania danych powinny być reprezentowane przez NetworkStateTracker
, aby statystyki mogły być poprawnie rozliczane.