No Android 4.0, as estatísticas relatadas pelas interfaces de rede do Linux são registradas ao longo do tempo e são usadas para impor limites de cota de rede, renderizar gráficos visíveis ao usuário e muito mais.
Cada driver de dispositivo de rede (Wi-Fi incluído) deve seguir o ciclo de vida padrão do dispositivo do kernel e retornar estatísticas corretas por meio de dev_get_stats()
. Em particular, as estatísticas retornadas devem permanecer estritamente monotônicas enquanto a interface estiver ativa. Os drivers podem redefinir as estatísticas somente após concluir com êxito um unregister_netdev()
ou o equivalente que gera um evento NETDEV_UNREGISTER
para retornos de chamada registrados com register_netdevice_notifier()
/ register_inetaddr_notifier()
/ register_inet6addr_notifier()
.
As operadoras móveis normalmente medem o uso de dados na camada da Internet (IP). Para corresponder a essa abordagem no Android 4.0, contamos com o fato de que para os dispositivos do kernel nos preocupamos com 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 pode não ser o caso. Por enquanto, o recurso conta com essa peculiaridade. Novos drivers também devem ter essa propriedade, e os valores dev_get_stats()
não devem incluir nenhuma sobrecarga de encapsulamento de camadas de rede inferiores (como cabeçalhos Ethernet) e, de preferência, não devem incluir outro tráfego (como ARP), a menos que seja insignificante.
A estrutura do Android coleta apenas estatísticas de interfaces de rede associadas a um NetworkStateTracker
em ConnectivityService
. Isso permite que a estrutura identifique concretamente cada interface de rede, incluindo seu tipo (como TYPE_MOBILE
ou TYPE_WIFI
) e identidade do assinante (como IMSI). Todas as interfaces de rede usadas para rotear dados devem ser representadas por um NetworkStateTracker
para que as estatísticas possam ser contabilizadas corretamente.