In Android 4.0, le statistiche riportate dalle interfacce di rete Linux vengono registrate nel tempo e vengono utilizzate per imporre limiti di quota di rete, rendere i grafici visibili all'utente e altro ancora.
Ciascun driver di dispositivo di rete (incluso Wi-Fi) deve seguire il ciclo di vita del dispositivo del kernel standard e restituire statistiche corrette tramite dev_get_stats()
. In particolare, le statistiche restituite devono rimanere rigorosamente monotone mentre l'interfaccia è attiva. I driver possono ripristinare le statistiche solo dopo aver completato correttamente un unregister_netdev()
o un equivalente che genera un evento NETDEV_UNREGISTER
per i callback registrati con register_netdevice_notifier()
/ register_inetaddr_notifier()
/ register_inet6addr_notifier()
.
Gli operatori mobili in genere misurano l'utilizzo dei dati a livello di Internet (IP). Per abbinare questo approccio in Android 4.0, ci basiamo sul fatto che per i dispositivi del kernel ci preoccupiamo dei valori rx_bytes
e tx_bytes
restituiti da dev_get_stats()
restituiscono esattamente i byte del livello Internet ( IP
) trasferiti. Ma capiamo che per altri dispositivi potrebbe non essere il caso. Per ora, la caratteristica fa affidamento su questa particolarità. Anche i nuovi driver dovrebbero avere quella proprietà e i valori dev_get_stats()
non devono includere alcun sovraccarico di incapsulamento dei livelli di rete inferiori (come le intestazioni Ethernet) e preferibilmente non dovrebbero includere altro traffico (come ARP) a meno che non sia trascurabile.
Il framework Android raccoglie solo statistiche dalle interfacce di rete associate a un NetworkStateTracker
in ConnectivityService
. Ciò consente al framework di identificare concretamente ogni interfaccia di rete, incluso il suo tipo (come TYPE_MOBILE
o TYPE_WIFI
) e l'identità dell'abbonato (come IMSI). Tutte le interfacce di rete utilizzate per instradare i dati devono essere rappresentate da un NetworkStateTracker
in modo che le statistiche possano essere contabilizzate correttamente.