2013-07-27 10 views
7

Czuję, że jestem teraz na wariackich pigułkach. Określona część mojej aplikacji działa dobrze przez kilka dni, a dziś po prostu przestała działać i nie mogę zrozumieć dlaczego. Ta część mojego kodu służyła do generowania danych całkowitych od momentu uruchomienia, które każda konkretna aplikacja wysłała i otrzymała. Teraz, wartości zawsze pokazać się jako 0.getUidRxBytes() i getUidTxBytes() zawsze zwracają 0 w systemie Android 4.3

Kilka rzeczy, które mogą lub nie mogą mieć wpływ na to:

1.) Moja Nexus 4 został właśnie zaktualizowany do Androida 4.3 dzisiaj, ale wątpię, że jest to problem, ponieważ działało to dobrze zaraz po aktualizacji.

2.) W aktualizacji Android API 18 niektóre metody interfejsu API Statystyk ruchu są teraz nieaktualne, ale są to metody, których nie używam, więc nie powinno to mieć żadnego efektu. http://developer.android.com/reference/android/net/TrafficStats.html

Cała pomoc jest bardzo doceniana.

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))); 

Update [23 stycznia 2014]: Testowanie getUidRxBytes() i getUidTxBytes() na moim Nexus 4 z Androidem 4.4.2 pokazuje, że wartości nie są już 0, ale zgłaszają poprawnych statystyk .

+0

Pomimo swoich zastrzeżeń, myślę, że te dwie rzeczy, które wymienione są prawdopodobnie najbardziej prawdopodobne przyczyny. –

+0

Doceniam odpowiedź Roberta, ale tak jak powiedziałem, nie sądzę, żeby to mogły być problemy, ponieważ wszystko działało po tym, jak zaktualizowałem się do wersji 4.3. Kilka godzin później zaczęło zgłaszać 0 z jakiegoś powodu. – Richard

+0

Zapalę nexus z powrotem do 4.2, aby sprawdzić, czy to działa, brb – Richard

Odpowiedz

3

Klasa TrafficStats pobiera informacje o ruchu w sieci z katalogu /proc/uid_stat/<uid>. Zawiera informacje o tcp, udp bajtach i pakietach wysłanych i odebranych. Jeśli pliki nie są obecne, klasa TrafficStats nie może pobrać statystyk sieci. Możesz sprawdzić, czy pliki są obecne, Jeśli nie masz szczęścia i powinieneś szukać w inny sposób.

Jeśli pliki są obecne, możesz spróbować odczytać je samodzielnie.

Również getUidTxBytes() i getUIDRxBytes() zgłaszają tylko ruch TCP i omijany ruch UDP. Jeśli twoja aplikacja wykonuje dużo ruchu UDP (np. Voip), nie otrzymasz żadnych informacji. Istnieje już bug złożony do tego: https://code.google.com/p/android/issues/detail?id=32410

+0

Pliki istnieją w określonym katalogu. Każdy identyfikator uid ma folder o nazwie po sobie, np. 10033. W każdym folderze znajdują się dwa pliki tekstowe, jeden o nazwie "tcp_rcv" i inny "tcp_snd", z których każdy zawiera w sobie liczbę. A te liczby nie są równe 0, więc getUidRxBytes() i getUidTxBytes() powinny zwracać odpowiednie wartości. Dziękuję za pomoc. – Richard

+0

Czy ktoś o poprawki dla 6.0.x? Lub alternatywne metody? dzięki – martin

4

I zgłaszali ten problem do AOSP śledzenia błędów: here

Mam również utworzonego alternatywnego rozwiązania problemu, który mam wklejony poniżej:

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

Dwa razy napisałeś "textReceived" na ostatnim wierszu kodu. Również nie zamknąłeś czytników i użyłeś "String.valueOf" (i dwa razy) zamiast wywoływać "Long.toString". Mam również pytanie na ten temat: oficjalna dokumentacja mówi, że pobiera dane od ostatniego uruchomienia, ale wygląda na to, że ta metoda zajmuje cały numer, eevn przed bieżącą sesją systemu operacyjnego. Jak to mogło się stać? –

2

Zrobiłem kilka szczegółowych badań na ten temat i wyjaśnić niektóre szczegóły, ponieważ Android 4.3 interfejs TrafficStats API zmienił się w sposobie wydobywania szczegółów z urządzenia.

Przed wprowadzeniem Androida 4.3 statystyki ruchu UID były dostępne dla TCP i UDP oraz dołączone API dla bajtów i pakietów & wysłane i odebrane. Dane zostały wyodrębnione z plików/proc/uid_stat/[pid]/*.

W systemie Android 4.3 programiści postanowili przejść na lepszy i bardziej bezpieczny interfejs API, korzystając ze statystyk UID xt_qtaguid, które są częścią modułu jądra netfiltra w systemie Linux. To API (procfs) umożliwia dostęp w oparciu o identyfikator UID procesu, dlatego przy próbie dostępu do interfejsu API TrafficStats w systemie Android => 4.3 otrzymasz zero informacji o nie-własnym UID.

BTW, zobowiązują się, że przyczyną problemu jest następujący: https://github.com/android/platform_frameworks_base/commit/92be93a94edafb5906e8bc48e6fee9dd07f5049e

* Poprawa TrafficStats UID API. Odłóż statystyki dotyczące warstw transportowych, pozostawiając tylko podsumowane statystyki warstw sieciowych . Ulepsz dokumentację, aby mieć pewność co do warstw, w których występują pomiary , oraz ich zachowania od momentu uruchomienia. Pod maską przejdź do używania statystyk UID xt_qtaguid. Bug: 6818637, 7013662 Change-Id: I9f26992e5fcdebd88c671e5765bd91229e7b0016 *

+0

Więc oficjalny framework zwraca 0 dla wszystkich aplikacji z wyjątkiem bieżącego? dlaczego jest uważane za bezpieczniejsze? są tylko liczbami statystycznymi i są nawet dostępne za pośrednictwem ustawień systemu operacyjnego. Czy czytanie z "/ proc/uid_stat" nadal działa i zwraca poprawne wyniki? Niektóre osoby twierdzą, że wszystko zostało naprawione na Androidzie 4.4, ale nie widzę, aby zostało naprawione (zwraca 0 dla wszystkich aplikacji). –

Powiązane problemy