Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

ネットワーク トラフィック ツールを使用してネットワーク トラフィック データを収集する

ネットワーク トラフィック ツールはサポートが終了しました。Android Studio 3.0 以降を使用している場合は、Network Profiler を使用して、ネットワーク経由でアプリがデータを転送する方法とタイミングについて調査することをおすすめします。

アプリが生成するネットワーク トラフィックは、アプリが稼働しているデバイスのバッテリー寿命に大きな影響を与えます。トラフィックを最適化するには、トラフィックを測定して、ソースを識別する必要があります。ネットワーク リクエストの直接的な発生源となるのは、ユーザー アクションや、アプリコード、アプリと通信するサーバーです。

DDMS ツールの一部であるネットワーク トラフィック ツールを使用すると、アプリがネットワーク経由でデータを転送する方法やタイミングについて確認できます。

このレッスンでは、ソースコードをタグ付けすることでネットワーク リクエストを測定、分類する方法と、アプリのネットワーク トラフィックをデプロイ、テスト、可視化する方法について説明します。

ネットワーク リクエストをタグ付けする

アプリは、さまざまな理由でデバイス上のネットワーク ハードウェアを使用します。アプリのネットワーク リソース使用を適切に最適化するには、アプリがどのくらいの頻度で、どのような理由でネットワークを使用しているのか把握する必要があります。パフォーマンス分析を行うために、ネットワーク ハードウェアの使用を以下のカテゴリに分類します。

  • ユーザー開始型ネットワーク リクエスト - ユーザーが開始したリクエスト。たとえば、ニュースアプリ内の更新済み記事のリストに対するリクエストが該当します。
  • アプリ開始型ネットワーク リクエスト - ユーザー アクションとは無関係に Android アプリのコード内で開始されたリクエスト。たとえば、ニュースアプリ内で未読記事のテキストをキャッシュする場合のアプリ リクエストが該当します。
  • サーバー開始型ネットワーク リクエスト - ユーザー アクションとは無関係にサーバーがアプリに対して開始したリクエスト。たとえば、ニュースアプリ内で新しく利用可能になった記事に関する通知が該当します。

以下では、定数を使用してアプリのソースコードをタグ付けし、トラフィックを 3 つのリクエスト タイプのいずれかに分類する手順について説明します。ネットワーク トラフィック ツールは、トラフィックのタイプごとに色付けできるため、各トラフィック ストリームを個別に可視化して最適化することができます。 ここで説明する手順では、ユーザー開始型、アプリ開始型、サーバー開始型として識別されるアプリ内スレッドの実行に基づいて、ネットワーク トラフィックがレポートされます。

  1. アプリの開発プロジェクトで、ネットワーク使用の各タイプを示す 3 つの定数を定義します。

    Kotlin

        const val USER_INITIATED: Int = 0x1000
        const val APP_INITIATED: Int = 0x2000
        const val SERVER_INITIATED: Int = 0x3000
        

    Java

        public static final int USER_INITIATED = 0x1000;
        public static final int APP_INITIATED = 0x2000;
        public static final int SERVER_INITIATED =0x3000;
        
  2. ネットワークを使用するうえで広く利用されているクラスを検索することで、アプリ内のネットワーク コードを見つけます。
    1. Android Studio で、[Edit] > [Find] > [Find in Path] を選択します。
    2. 次の文字列を [Text to find] フィールドに貼り付けます。
      extends GcmTaskService|extends JobService|extends AbstractThreadedSyncAdapter|HttpUrlConnection|Volley|Glide|HttpClient
    3. [Regular expression] チェックボックスをオンにします。
    4. [File mask(s)] チェックボックスをオンにして、「*.java」と入力します。
    5. [Find] ボタンをクリックします。
  3. 前のステップで判明した結果に基づいて、ネットワーク リソースを使用するアプリ内の各実行スレッドに対して setThreadStatsTag(int) メソッドを追加して、アプリのネットワーク トラフィック使用をタグ付けします。次のサンプルコードをご覧ください。

    Kotlin

        if (BuildConfig.NETWORK_TEST && Build.VERSION.SDK_INT >= 14) {
            try {
                TrafficStats.setThreadStatsTag(USER_INITIATED)
                // make network request using HttpClient.execute()
            } finally {
                TrafficStats.clearThreadStatsTag()
            }
        }
        

    Java

        if (BuildConfig.NETWORK_TEST && Build.VERSION.SDK_INT >= 14) {
            try {
                TrafficStats.setThreadStatsTag(USER_INITIATED);
                // make network request using HttpClient.execute()
            } finally {
                TrafficStats.clearThreadStatsTag();
            }
        }
        

    注: タグ設定が実稼働コードに入らないように、必ず、APK を生成する際に使用したビルドタイプに基づいて、このコードの追加を条件付きにしてください。上記の例の場合、BuildConfig.NETWORK_TEST フィールドによって、この APK がテスト バージョンであることが示されています。

注: アプリのネットワーク トラフィックをタグ付けする方法は、使用している API がネットワーク ソケットにアクセスして管理する方法に応じて異なります。一部のネットワーク ライブラリでは、TrafficStats ユーティリティを使用してアプリのトラフィックをタグ付けすることができない場合があります。

ネットワーク トラフィック ツールを使用したネットワーク トラフィックのタグ付けとトラッキングの詳細については、DDMS におけるネットワーク使用の詳細表示をご覧ください。

ネットワーク テストのビルドタイプを設定する

パフォーマンス テストを実施する場合、APK を可能な限り実稼働ビルドに近づける必要があります。ネットワーク テストでこれを実現するには、debug ビルドタイプを使用するのではなく、network-test ビルドタイプを作成します。

  1. Android Studio 内でアプリを開きます。
  2. プロジェクトの build.gradle ファイルを編集して、ネットワーク テスト用のデバッグ可能ビルドタイプを作成します。次のサンプルコードをご覧ください。
        android {
            ...
            buildTypes {
                debug {
                    // debuggable true is default for the debug buildType
                }
                network-test {
                    debuggable true
                }
            }
            ...
        }
        

ネットワーク テスト APK をデプロイする

前の手順で設定した network-test ビルドタイプによって生成された APK をデプロイするには:

  1. テストデバイスで、[開発者向けオプション] が有効になっているか確認します。このオプションを確認し有効にする方法については、ハードウェア デバイスを使用するをご覧ください。
  2. USB ケーブルを使用して、テストデバイスを開発マシンに接続します。
  3. Android Studio で、ウィンドウの左端にある [Build Variants] を選択します。
  4. [Sync Project with Gradle Files] ボタンをクリックして、[Build Variants] リストにアプリ モジュールの network-test を入力します。
  5. リストから [network-test] を選択します。
  6. アプリのデバッグ可能バージョンをデバイスにデプロイするには、[Run] > [Debug] を選択します。

ネットワーク トラフィック ツールを実行する

Android Studio のネットワーク トラフィック ツールを使用すると、実行中のアプリのネットワーク リソース使用状況をリアルタイムで確認できます。

テストの再現性を高めるには、アプリのデータを消去して、アプリを既知の初期状態にしてから開始する必要があります。以下では、これまでのキャッシュ データとネットワーク データを含め、アプリデータをすべて消去する手順について説明します。この手順により、アプリは、以前キャッシュしたすべてのデータを再キャッシュする必要がある状態に戻ります。この手順は必ず行ってください。

ネットワーク トラフィック ツールを起動して、ネットワーク リクエストを可視化するには:

  1. Android Studio を起動して、Android Device Monitor を起動し、ネットワーク トラフィック ツールを起動します。 プロンプトが表示された場合は、受信ネットワーク接続を許可します。
  2. Android Device Monitor ウィンドウの上部にある [DDMS] ボタンをクリックして、[Network Statistics] タブを選択します。このタブが表示されない場合は、ウィンドウを広げて、[Window] > [Reset Perspective] を試してください。
  3. [Devices] タブで、デバイス上にあるデバッグ可能アプリのリストから、デバッグするアプリを選択し、[Network Statistics] タブで [Start] ボタンをクリックします。

    注: デバイスに対して [Allow USB Debugging] を求めるプロンプトが表示される場合があります。[OK] を選択してデバッグを続行します。

  4. 次の adb コマンドを使用して、アプリデータを消去します。
        adb shell pm clear package.name.of.app
        
  5. アプリを起動して、アプリの主要なユースケースを実践するテストプランを実行します。このプランでは、ユーザーがアプリを操作していないアプリアイドル時間を許可する必要もあります。これにより、アプリ開始型とサーバー開始型のネットワーク アクセスが発生するようになります。
  6. アプリデータを消去し、テストプランをもう一度実行して、テストを繰り返します。テストを数回繰り返して、パフォーマンス データの再現性を検証します。

ネットワーク トラフィックのタグ付けを使用すると、ネットワーク トラフィック ツール内でネットワーク トラフィックごとに異なる色で表示できるようになるため、各リクエスト カテゴリを視覚的に区別しやすくなります。図 1 をご覧ください。

図 1: 3 つのカテゴリに応じてタグ付けしたネットワーク トラフィック