Panoramica del kernel

La funzionalità di monitoraggio e monitoraggio dell'utilizzo dei dati per app e delegato si basa sul modulo xt_qtaguid nel kernel Linux android-3.0 (kernel/net/netfilter/xt_qtaguid). La funzionalità di tagging dei socket nel framework (system/core/libcutils/qtaguid.c) si basa principalmente sull'esistenza dell'interfaccia /proc/net/xt_qtaguid/ctrl esportata dal modulo del kernel xt_qtaguid.

Il modulo netfilter quota2 (originariamente parte di xtables-addons) consente di impostare limiti di quota denominati ed è stato esteso per supportare la notifica dello spazio utente quando vengono raggiunti determinati limiti. Una volta raggiunto il limite di quota, il modulo quota2 scarta tutto il traffico di rete successivo. Il framework può anche specificare regole aggiuntive per limitare il traffico di dati in background per un'app (fai riferimento a com.android.server.NetworkManagementSocketTagger.setKernelCounterSet e android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND).

Come funziona?

Il modulo qtaguid netfilter monitora il traffico di rete in base al socket per ogni app utilizzando l'UID univoco dell'app proprietaria. Esistono due componenti tag associati a qualsiasi socket nel sistema. Il primo è l'UID, che identifica in modo univoco l'app responsabile del trasferimento dei dati (Linux consente di attribuire la proprietà di ogni socket di rete all'UID dell'app chiamante). Il secondo componente del tag viene utilizzato per supportare un'ulteriore caratterizzazione del traffico nelle categorie specificate dagli sviluppatori di app. Utilizzando questi tag a livello di app, un'app può profilare il traffico in diverse sottocategorie.

Nel caso di app che forniscono il trasferimento di dati di rete come servizio, ad esempio il download manager, il servizio di streaming multimediale e così via, è possibile attribuire la proprietà del trasferimento di dati di rete all'UID dell'app richiedente utilizzando la chiamata di funzione TrafficStats.setThreadStatsUid(). Il chiamante deve disporre dell'autorizzazione "android.permission.MODIFY_NETWORK_ACCOUNTING" per riassegnare la proprietà del traffico di rete.