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.