在 Android 4.0 中,Linux 網路介面回報的統計資料會隨時間記錄,並用於強制網路配額限制、算繪使用者可見的圖表等。
每個網路裝置驅動程式 (包括 Wi-Fi) 都必須遵循標準的核心裝置生命週期,並透過 dev_get_stats()
傳回正確的統計資料。特別是,在介面處於啟用狀態時,傳回的統計資料必須保持嚴格的單調性。只有在成功完成 unregister_netdev()
或等效作業 (針對使用 register_netdevice_notifier()
/register_inetaddr_notifier()
/ register_inet6addr_notifier()
註冊的回呼產生 NETDEV_UNREGISTER
事件) 後,驅動程式才能重設統計資料。
行動電信業者通常會在網際網路層 (IP) 評估數據用量。為了與 Android 4.0 中的做法相符,我們會利用以下事實:對於我們關心的核心裝置,dev_get_stats()
傳回的 rx_bytes
和 tx_bytes
值會精確傳回傳輸的 Internet 層 (IP
) 位元組。但我們瞭解,其他裝置可能無法達到這個程度。這項功能目前依賴這項特殊性。新版驅動程式也應具備該屬性,且 dev_get_stats()
值不得包含任何較低網路層 (例如乙太網路標頭) 的封裝額外負擔,且最好不要包含其他流量 (例如 ARP),除非該流量可忽略不計。
Android 架構只會從 ConnectivityService
中與 NetworkStateTracker
相關聯的網路介面收集統計資料。這可讓架構具體識別每個網路介面,包括其類型 (例如 TYPE_MOBILE
或 TYPE_WIFI
) 和訂閱者身分 (例如 IMSI)。用於路由資料的所有網路介面都應由 NetworkStateTracker
表示,以便正確計算統計資料。