La funzionalità di monitoraggio e rilevamento 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 delle 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 di quota2
(originariamente parte di xtables-addons
) consente alla funzionalità 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
elimina tutto il traffico di rete successivo. Il framework può anche specificare regole aggiuntive per
limitare il traffico di dati in background per un'app (consulta
com.android.server.NetworkManagementSocketTagger.setKernelCounterSet
e
android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND
).
Come funziona?
Il modulo netfilter di qtaguid
monitora il traffico di rete su base per socket per ogni app utilizzando l'UID univoco dell'app proprietaria. Esistono due componenti tag associati a qualsiasi socket del sistema. Il primo è l'UID che identifica in modo univoco
l'app responsabile del trasferimento dei dati (Linux consente di assegnare 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 in categorie specificate
per gli sviluppatori di app. Con questi tag a livello di app, un'app può profilare il traffico in varie sottocategorie.
Nel caso di app che forniscono il trasferimento di dati di rete come servizio, come il gestore dei download, 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 della funzione TrafficStats.setThreadStatsUid()
. L'utente che effettua la chiamata deve disporre dell'autorizzazione "android.permission.MODIFY_NETWORK_ACCOUNTING
" per riassegnare la proprietà del traffico di rete.