No Android 4.0, as estatísticas informadas pelas interfaces de rede do Linux são registradas ao longo do tempo e usadas para aplicar limites de cota de rede, renderizar gráficos visíveis para o usuário e muito mais.
Cada driver de dispositivo de rede (incluindo Wi-Fi) precisa seguir o ciclo de vida
padrão do dispositivo do kernel e retornar estatísticas corretas pelo
dev_get_stats(). Em particular, as estatísticas retornadas precisam permanecer
estritamente monótonas enquanto a interface estiver ativa. Os drivers só podem redefinir
as estatísticas depois de concluir uma unregister_netdev()
ou o equivalente que gera um evento NETDEV_UNREGISTER para
callbacks registrados com register_netdevice_notifier() /
register_inetaddr_notifier() / register_inet6addr_notifier().
Operadoras de dispositivos móveis geralmente medem o uso de dados na camada de Internet
(IP). Para corresponder a essa abordagem no Android 4.0, contamos com o fato de que
para os dispositivos do kernel, os valores rx_bytes e tx_bytes
retornados por dev_get_stats() retornam exatamente os bytes da camada da Internet
(IP) transferidos.  Mas entendemos que para outros dispositivos isso
pode não ser o caso. Por enquanto, o recurso depende dessa
peculiaridade. Os novos drivers também precisam ter essa propriedade, e os
valores de dev_get_stats() não podem incluir nenhum overhead de encapsulamento
de camadas de rede mais baixas (como cabeçalhos Ethernet) e, de preferência,
não podem incluir outro tráfego (como ARP), a menos que ele seja
negligível.
O framework do Android só coleta estatísticas de interfaces de rede
associadas a um NetworkStateTracker em ConnectivityService. Isso
permite que o framework identifique concretamente cada interface de rede,
incluindo o tipo (como TYPE_MOBILE ou TYPE_WIFI) e
a identidade do assinante (como IMSI).  Todas as interfaces de rede usadas para
encaminhar dados precisam ser representadas por um NetworkStateTracker para que
as estatísticas possam ser contabilizadas corretamente.
