2013-07-27 7 views
7

私は今、狂気のような気分になります。私のアプリケーションの特定の部分は数日間うまくいきましたが、今日は機能しなくなりました。理由を理解できません。私のコードのこの部分は、それぞれの特定のアプリが送受信したブート以降の合計データを出力するために使用されていました。getUidRxBytes()とgetUidTxBytes()はAndroid 4.3で常に0を返します

1)私のネクサス4はただのAndroid 4.3今日に更新されましたが、私は疑う、これは次のとおりです。さて、値は常に0

として、またはこれに影響を与えてもしなくてもよいカップルの事を表示しますこれは私が更新した直後にうまくいったからです。

2)Android API 18のアップデートでは、Traffic Stats APIのいくつかのメソッドは廃止されましたが、これは私が使用していないメソッドなので、これは効果がありません。 http://developer.android.com/reference/android/net/TrafficStats.html

すべてのサポートをよろしくお願いいたします。

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

更新[2014年1月23日]:テストgetUidRxBytes()とgetUidTxBytes()のAndroid 4.4.2を実行している私のNexus 4の上の値は、もはや0ではないが、正しい統計を報告していることを示しています。

+0

あなたの異議にもかかわらず、私はあなたが言及した二つのことは、おそらく最も可能性の高い原因であると思います。 –

+0

私は、回答Robertを感謝しますが、私が言ったように、私は4.3に更新した後、すべてが機能したので、これらが問題になるとは思わない。何らかの理由で0を報告し始めたのは数時間後でした。 – Richard

+0

それが動作するかどうかを確認するために、ネクサスを4.2にフラッシュします。 – Richard

答えて

3

TrafficStatsクラスは、/proc/uid_stat/<uid>ディレクトリからのネットワークトラフィックに関する情報を取得します。これには、送受信されたtcp、udpバイトおよびパケットに関する情報が含まれます。ファイルが存在しない場合、TrafficStatsクラスはネットワーク統計情報を取得できません。あなたはファイルが存在するかどうかを確認することができます。もしあなたが運が良ければ、他の方法を探すべきです。

ファイルが存在する場合は、それを自分で読むことができます。また

getUidTxBytes()とgetUIDRxBytes()レポートのみTCPトラフィックおよびUDPトラフィックを欠場。あなたのアプリがvoipのようなUDPトラフィックをたくさんしている場合は、情報が得られません。 https://code.google.com/p/android/issues/detail?id=32410

+0

ファイルの詳細を更新します。あなたが指定したディレクトリに存在します。各uidには、それ自体の後に名前が付けられたフォルダがあります。各フォルダには2つのテキストファイルがあります.1つは "tcp_rcv"と呼ばれ、もう1つは "tcp_snd"です。それぞれに数字が入っています。これらの数値は0ではないので、getUidRxBytes()とgetUidTxBytes()は適切な値を返す必要があります。ご協力ありがとうございました。 – Richard

+0

6.0.xの修正プログラムはありますか?または代替の方法は?ありがとう – martin

4

私はAOSP課題追跡に問題が報告されている:

:私は下に貼り付けている私も、問題への代替解決策を作成しました here

を はすでにこのために提出されたバグがあります

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

"textReceived"はコードの最後の行に2回書いてあります。また、読者を閉じずに、 "Long.toString"を呼び出す代わりに "String.valueOf"(および2回)を使用しました。私はこれについても質問があります:正式な文書では、最後の起動からデータを取得すると言われていますが、この方法はOSの現在のセッションの前に全部eevnになります。どのようにそれができますか? –

2

私は、Android 4.3以降TrafficStats APIは、それがデバイスから詳細を抽出方法で変更された、これについていくつかの詳細な研究を行っている、といくつかの詳細を明確にします。

前のAndroid 4.3へのUIDのトラフィックの統計情報は、TCPとUDPのために利用可能であったとバイトと送信されたパケット&のためのAPIを含め、受信しました。そのデータは/ procの/ uid_stat/[PID]/*ファイルから抽出しました。

Android 4.3では、Linuxのnetfilterカーネルモジュールの一部であるxt_qtaguid UID統計を使用して、開発者はより安全で安全なAPIに切り替えることにしました。 このAPI(procfsのは)プロセスのUIDに基づいてアクセスを可能にし、あなたは、自分ではないUIDのためにゼロ情報を取得します=> 4.3のAndroidでTrafficStats APIにアクセスしようとする理由です。

ところで、問題は以下の原因となったことにコミット: https://github.com/android/platform_frameworks_base/commit/92be93a94edafb5906e8bc48e6fee9dd07f5049e

* TrafficStats UID APIを改善します。 トランスポート層の統計情報を非推奨にし、集約された ネットワーク層の統計情報のみを残します。 測定値が であるレイヤーと、起動後の動作について明確になるようにドキュメントを改善しました。フードの下で、 xt_qtaguid UID統計を使用するように移動します。 バグ:6818637、7013662 変更-ID:I9f26992e5fcdebd88c671e5765bd91229e7b0016 *

+0

公式のフレームワークは現在のものを除くすべてのアプリケーションで0を返しますか?なぜそれはより安全と考えられるのですか?統計値だけであり、OSの設定でも利用可能です。また、 "/ proc/uid_stat"からの読み込みは正しく動作し、正しい結果を返しますか? Android 4.4ですべてが修正されたと主張する人もいますが、修正されているとは限りません(すべてのアプリケーションで0を返します)。 –