2013-07-27 13 views
7

Mi sento come se fossi in pillole pazze in questo momento. Una parte specifica della mia applicazione ha funzionato bene per diversi giorni e oggi ha smesso di funzionare e non riesco a capire perché. Questa parte del mio codice veniva utilizzata per generare i dati totali dopo l'avvio che ogni app specifica ha inviato e ricevuto. Ora, i valori mostrano sempre come 0.getUidRxBytes() e getUidTxBytes() restituiscono sempre 0 in Android 4.3

Un paio di cose che possono o non possono influenzare questo:

1.) Il mio Nexus 4 è stato appena aggiornato ad Android 4.3 di oggi, ma dubito che questo è un problema perché questo ha funzionato bene subito dopo che ho aggiornato.

2.) Con l'aggiornamento dell'API Android 18, alcuni metodi dall'API di Statistiche traffico sono ora deprecati, ma questi sono metodi che non sto nemmeno utilizzando, quindi questo non dovrebbe avere alcun effetto. http://developer.android.com/reference/android/net/TrafficStats.html

Tutto l'aiuto è molto apprezzato.

PackageManager packageManager=this.getPackageManager(); 
List<ApplicationInfo> appList=packageManager.getInstalledApplications(0); 

for (ApplicationInfo appInfo : appList) { 
    String appLabel = (String) packageManager.getApplicationLabel(appInfo); 
    int uid = appInfo.uid; 
    Log.d("data", String.valueOf(TrafficStats.getUidRxBytes(uid) + TrafficStats.getUidTxBytes(uid))); 

Aggiornamento [23 gennaio, 2014]: Testing i getUidRxBytes() e getUidTxBytes() sul mio Nexus 4 in esecuzione 4.4.2 Android dimostra che i valori non sono più 0, ma stanno segnalando le statistiche corrette .

+0

Nonostante le vostre obiezioni, penso che le due cose che hai menzionato sono probabilmente le cause più probabili. –

+0

Apprezzo la risposta Robert, ma come ho detto, non penso che questi potrebbero essere i problemi, perché tutto ha funzionato dopo che ho aggiornato a 4.3. Sono trascorse alcune ore quando ha iniziato a segnalare 0 per qualche motivo. – Richard

+0

lampeggerà il nexus indietro a 4.2 per vedere se funziona, brb – Richard

risposta

3

La classe TrafficStats ottiene le informazioni sul traffico di rete dalla directory /proc/uid_stat/<uid>. Questo contiene informazioni sui byte tcp, udp e pacchetti inviati e ricevuti. Se i file non sono presenti la classe TrafficStats non può ottenere le statistiche di rete. Puoi controllare se i file sono presenti, se non sei sfortunato e dovresti cercare un altro modo.

Se i file sono presenti, puoi provare a leggerlo da solo.

Anche getUidTxBytes() e getUIDRxBytes() riportano solo il traffico TCP e mancano il traffico UDP. Quindi se la tua app sta facendo un sacco di traffico UDP (come voip), allora non avrai nessuna informazione. Esiste già un bug presentata per questo: https://code.google.com/p/android/issues/detail?id=32410

+0

I file esiste nella directory che hai specificato. Ogni uid ha una cartella chiamata dopo sé, ad es. 10033. All'interno di ogni cartella ci sono due file di testo, uno chiamato "tcp_rcv" e un altro "tcp_snd", ciascuno contenente un numero al loro interno. E questi numeri non sono 0, quindi getUidRxBytes() e getUidTxBytes() dovrebbero restituire valori corretti. Grazie per l'aiuto. – Richard

+0

Qualcuno sulle correzioni per 6.0.x? O metodi alternativi? grazie – martin

4

Ho riportato la questione al AOSP issue tracker: here

Ho creato anche una soluzione alternativa al problema che ho incollato qui di seguito:

private Long getTotalBytesManual(int localUid){ 

File dir = new File("/proc/uid_stat/"); 
String[] children = dir.list(); 
if(!Arrays.asList(children).contains(String.valueOf(localUid))){ 
    return 0L; 
} 
File uidFileDir = new File("/proc/uid_stat/"+String.valueOf(localUid)); 
File uidActualFileReceived = new File(uidFileDir,"tcp_rcv"); 
File uidActualFileSent = new File(uidFileDir,"tcp_snd"); 

String textReceived = "0"; 
String textSent = "0"; 

try { 
     BufferedReader brReceived = new BufferedReader(new FileReader(uidActualFileReceived)); 
     BufferedReader brSent = new BufferedReader(new FileReader(uidActualFileSent)); 
     String receivedLine; 
     String sentLine; 

     if ((receivedLine = brReceived.readLine()) != null) { 
      textReceived = receivedLine; 
     } 
     if ((sentLine = brSent.readLine()) != null) { 
      textSent = sentLine; 
     } 

    } 
    catch (IOException e) { 

    } 
return Long.valueOf(textReceived).longValue() + Long.valueOf(textReceived).longValue(); 

} 
+0

Hai scritto "textReceived" due volte sull'ultima riga di codice. Inoltre non hai chiuso i lettori e hai usato "String.valueOf" (e due volte) invece di chiamare "Long.toString". Ho anche una domanda su questo: la documentazione ufficiale dice che ottiene i dati dall'ultimo avvio, ma sembra che questo metodo prende l'intero numero, eevn prima della sessione corrente del sistema operativo. Come potrebbe essere? –

2

Ho effettuato alcune ricerche dettagliate su questo e per chiarire alcuni dettagli, poiché Android 4.3 l'API TrafficStats è cambiata nel modo in cui estrae i dettagli dal dispositivo.

Prima di Android 4.3 le statistiche di traffico UID erano disponibili per TCP e UDP e API inclusa per byte e pacchetti & inviati e ricevuti. Questi dati sono stati estratti dai file/proc/uid_stat/[pid]/*.

In Android 4.3, gli sviluppatori hanno deciso di passare a un'API migliore e più sicura, utilizzando le statistiche UI xt_qtaguid, che fa parte del modulo del kernel netfilter in Linux. Questa API (procfs) consente l'accesso in base al processo UID, ed è per questo che quando si tenta di accedere all'API TrafficStats in Android => 4.3 otterrete zero informazioni per l'UID non personale.

btw, il commit che ha causato il problema è il seguente: https://github.com/android/platform_frameworks_base/commit/92be93a94edafb5906e8bc48e6fee9dd07f5049e

* Migliorare TrafficStats API UID. Deprecare le statistiche del livello di trasporto, lasciando solo le statistiche del livello di rete riepilogate. Migliorare la documentazione per essere chiari sui livelli in cui si verificano le misure e il loro comportamento dopo l'avvio. Sotto il cofano, passa a utilizzare le statistiche UID xt_qtaguid. Bug: 6.818.637, 7.013.662 Change-Id: I9f26992e5fcdebd88c671e5765bd91229e7b0016 *

+0

Quindi il framework ufficiale restituisce 0 per tutte le applicazioni eccetto quella attuale? perché è considerato più sicuro? sono solo numeri statistici e sono persino disponibili tramite le impostazioni del sistema operativo. Inoltre, la lettura dal "/ proc/uid_stat" funzionerà ancora e restituirà i risultati corretti? Alcune persone sostengono che tutto è stato risolto su Android 4.4, ma non vedo che sia stato corretto (restituisce 0 per tutte le app). –

Problemi correlati