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.