2013-07-27 37 views
7

Tôi cảm thấy như tôi đang uống thuốc điên ngay bây giờ. Một phần cụ thể của ứng dụng của tôi đã hoạt động tốt trong vài ngày và hôm nay nó chỉ dừng hoạt động và tôi không thể hiểu tại sao. Phần này của mã của tôi được sử dụng để xuất tổng dữ liệu kể từ khi khởi động mà mỗi ứng dụng cụ thể đã gửi và nhận. Bây giờ, các giá trị luôn luôn hiển thị như 0.getUidRxBytes() và getUidTxBytes() luôn trả về 0 trong Android 4.3

Một vài điều mà có thể hoặc không có thể ảnh hưởng này:

1.) Nexus của tôi 4 chỉ được cập nhật Android 4.3 ngày hôm nay, nhưng tôi nghi ngờ đây là một vấn đề bởi vì điều này làm việc tốt ngay sau khi tôi cập nhật. 2. Với bản cập nhật API Android 18, một số phương pháp từ API Thống kê lưu lượng truy cập hiện không được chấp nhận, nhưng đây là những phương pháp mà tôi thậm chí không sử dụng, vì vậy điều này sẽ không có hiệu lực. http://developer.android.com/reference/android/net/TrafficStats.html

Tất cả trợ giúp đều được đánh giá cao.

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

Cập nhật [23 Tháng Một 2014]: Kiểm tra các getUidRxBytes() và getUidTxBytes() trên Nexus 4 chạy 4.4.2 Android của tôi cho thấy rằng các giá trị không còn 0, nhưng được báo cáo số liệu thống kê chính xác .

+0

Bất chấp sự phản đối của bạn, tôi nghĩ hai điều bạn đề cập có lẽ là nguyên nhân có khả năng nhất. –

+0

Tôi đánh giá cao phản hồi của Robert, nhưng như tôi đã nói, tôi không nghĩ rằng đây có thể là vấn đề, bởi vì mọi thứ đã hoạt động sau khi tôi cập nhật lên 4.3. Đó là một vài giờ sau đó khi nó bắt đầu báo cáo 0 vì lý do nào đó. – Richard

+0

sẽ flash nexus trở lại 4.2 để xem có hoạt động không, brb – Richard

Trả lời

3

Lớp TrafficStats nhận thông tin về lưu lượng truy cập mạng từ thư mục /proc/uid_stat/<uid>. Thông tin này chứa thông tin về các byte và gói tin tcp, udp được gửi và nhận. Nếu các tệp không có mặt thì lớp TrafficStats không thể có được số liệu thống kê mạng. Bạn có thể kiểm tra xem các tập tin có hiện diện không, nếu bạn không may mắn và nên tìm cách khác.

Nếu các tệp hiện diện, bạn có thể tự mình đọc nó.

Ngoài ra báo cáo getUidTxBytes() và getUIDRxBytes() chỉ lưu lượng truy cập TCP và bỏ lỡ lưu lượng UDP. Vì vậy, nếu ứng dụng của bạn đang thực hiện rất nhiều lưu lượng truy cập UDP (như voip) thì bạn sẽ không nhận được bất kỳ thông tin nào. Hiện đã là một lỗi đã đệ đơn xin này: https://code.google.com/p/android/issues/detail?id=32410

+0

Các tệp tồn tại trong thư mục bạn đã chỉ định. Mỗi uid có một thư mục được đặt tên theo chính nó, ví dụ: 10033. Trong mỗi thư mục có hai tệp văn bản, một tệp được gọi là "tcp_rcv" và một "tcp_snd" khác, mỗi tệp chứa một số trong đó. Và những con số này không phải là 0, vì vậy getUidRxBytes() và getUidTxBytes() phải trả về các giá trị thích hợp. Cảm ơn sự giúp đỡ của bạn. – Richard

+0

Có bất kỳ bản sửa lỗi nào cho 6.0.x không? Hoặc phương pháp thay thế? cảm ơn – martin

4

tôi đã báo cáo vấn đề với theo dõi vấn đề AOSP: here

Tôi cũng đã tạo ra một giải pháp thay thế cho vấn đề mà tôi đã dán dưới đây:

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

Bạn đã viết "textReceived" hai lần ở dòng mã cuối cùng. Ngoài ra bạn đã không đóng các độc giả, và sử dụng "String.valueOf" (và hai lần) thay vì gọi "Long.toString". Tôi cũng có một câu hỏi về điều này: tài liệu chính thức nói rằng nó nhận được dữ liệu kể từ lần khởi động cuối cùng, nhưng có vẻ như phương pháp này lấy toàn bộ số, eevn trước phiên hiện tại của hệ điều hành. Lam thê nao điêu đo co thể? –

2

Tôi đã thực hiện một số nghiên cứu chi tiết về điều này và để làm rõ một số chi tiết, vì Android 4.3 API TrafficStats đã thay đổi theo cách trích xuất chi tiết từ thiết bị.

Trước Android 4.3 thống kê lưu lượng truy cập UID có sẵn cho TCP và UDP và API được bao gồm cho byte và gói & được gửi và nhận. Dữ liệu đó được trích xuất từ ​​các tệp/proc/uid_stat/[pid]/*.

Trong Android 4.3, nhà phát triển đã quyết định chuyển sang API tốt hơn và an toàn hơn, sử dụng thống kê UID xt_qtaguid, là một phần của mô-đun hạt nhân netfilter trong Linux. API này (procfs) cho phép truy cập dựa trên quá trình UID, và đây là lý do tại sao khi bạn cố gắng truy cập vào TrafficStats API trong Android => 4.3, bạn sẽ nhận được không có thông tin cho UID không sở hữu.

btw, các cam kết rằng gây ra vấn đề này là như sau: https://github.com/android/platform_frameworks_base/commit/92be93a94edafb5906e8bc48e6fee9dd07f5049e

* Cải thiện TrafficStats UID API. Không chấp nhận thống kê lớp vận chuyển, chỉ để lại số liệu thống kê lớp mạng tóm tắt . Cải thiện tài liệu hướng dẫn rõ ràng về các lớp nơi các phép đo xảy ra và hành vi của chúng kể từ khi khởi động. Dưới mui xe, hãy chuyển sang sử dụng số liệu thống kê UID xt_qtaguid. Lỗi: 6818637, 7013662 Id thay đổi: I9f26992e5fcdebd88c671e5765bd91229e7b0016 *

+0

Vì vậy, khung chính thức trả về 0 cho tất cả các ứng dụng ngoại trừ ứng dụng hiện tại? tại sao nó được coi là an toàn hơn? chúng chỉ là số liệu thống kê, và chúng thậm chí có sẵn thông qua các thiết lập của hệ điều hành. Ngoài ra, sẽ đọc từ "/ proc/uid_stat" vẫn hoạt động và trả lại kết quả chính xác? Một số người cho rằng toàn bộ mọi thứ đã được khắc phục trên Android 4.4, nhưng tôi không thấy rằng nó đã được sửa (trả về 0 cho tất cả các ứng dụng). –

Các vấn đề liên quan