通信内容が丸見え!スゴすぎるAndroid Studio 3.0 のネットワークプロファイラ!
Android Studio 3.0 ではプロファイル機能が強化されます。実際にネットワークプロファイラを使ってみたところ、通信内容や応答時間をAndroid Studio上で確認ができ、デバッグなどで大いに役立ちそうな感じ。
使い方と感想などをレポートします。
なお、Android Studio 3.0 は 10/19現在 で RC1 までリリースされてるみたいです。正式リリースが待ち遠しいですね。
確認環境
- macOS Sierra 10.12.6
- Android Studio 3.0 Beta7
実験アプリ
Kotlinで簡単な通信をするアプリを作ってみました。
ボタンをタップすると、
- A3RT の API を実行して結果を TextView にセット
- Picasso で画像をダウンロードして表示
の 2点を行うだけのアプリです。
A3RTは良くあるHTTP/1.1 形式の WebAPI と思ってください。詳細は別記事に書いてますので、ご興味ある方はどうぞ。
今回のサンプルのソースはgithubにありますのでよかったら参照ください。
ネットワークプロファイラを使ってみる
上記アプリを動かしつつネットワークプロファイラを使ってみます。
まず Android Studio 3 の Run -> Edit Configurations… の Profiling タブにある「Enable advanced profiling」にチェックを入れます。
ここの注意書きにもあるように、この機能を有効にするとパフォーマンスが若干落ちるそうですが、使っていて特に遅く感じることはありませんでした。
もっと規模の大きいアプリなら影響が出るのかも。
Enable advanced profiling にチェック後、アプリを起動し、「Android Profiler」のタブをクリックすると、CPU、MEMORY、NETWORK がプロファイリングされているのがわかります。
上の画像で、NETWORK の部分を2回ほどクリックすると、NEWORK の情報だけが大きく表示される状態になります。
この状態で、通信が発生している箇所をマウスでドラッグして範囲選択すると、その選択された範囲で発生した通信がリスト表示されます。
見た感じ、 1往復の HTTP通信が 1項目として表示されているようです。
このアプリでは A3RTのAPI呼び出しと Picasso の画像ダウンロードで 2往復通信が発生しているので、2項目表示されていますね。
この状態でも通信量、レスポンスステータス、応答時間などが表示されるようになっています。
さらに、項目を選択してみると、レスポンスの内容を確認することが出来ます。A3RT のレスポンスがJSON 形式で分かります。
Headers タブで、送信ヘッダ、受信ヘッダも見ることが出来ます。
Picasso の画像ダウンロードの方は、レスポンスとして画像イメージが確認できます。
これ、めちゃくちゃ便利じゃないですか!?
通信内容がテキストでわかるのはもちろん、画像イメージまで確認できるので、デバッグにはとても便利じゃないでしょうか。
また、通信の応答時間や発生のタイミングをタイムラインで視覚的に見れるので、チューニングにも役立ちそう!
トラブルシューティング
わたしが使っててハマったことと解決策書いておきます。
通信しているはずなのにプロファイラ上に表示されない
通信しているはずなのに、プロファイラ上に表示されず、通信内容が見れない・・・・
Android Studio公式ページの下の方の Network connection trouble shooting に情報がありました。
Currently, the Network Profiler only supports the HttpURLConnection and OkHttp libraries for network connections.
現状ではネットワークプロファイラがサポートしているのは HttpURLConnection と OkHttpのみです。
今回のサンプルでは、A3RT の方は普通に OkHttp のクライアントを利用しているので問題なかったですが、Picasso の方は明示的に OkHttp のダウンローダを使うように設定する必要がありました。
1 2 3 4 5 6 7 8 9 |
private fun downloadImage(url: String, imageView: ImageView) { Picasso.Builder(this).downloader(OkHttp3Downloader(this)).build() .load(url) .networkPolicy(NetworkPolicy.NO_CACHE) .fit() .centerCrop() .into(imageView) } |
Picasso と OkHttp3 以外に、OkHttp3Downloader が必要になります。
Picasso 内にも OkHttpDownloader というクラスがありますが、Picasso 2.5.2 時点ではOkHttp 3 に対応しておらず、使おうとするとNoClassDefFoundError が発生します。
1 2 3 4 5 6 7 8 |
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/squareup/okhttp/OkHttpClient; at com.squareup.picasso.OkHttpDownloader.defaultOkHttpClient(OkHttpDownloader.java:31) at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:76) at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:55) at com.squareup.picasso.OkHttpDownloader.<init>(OkHttpDownloader.java:45) ... Caused by: java.lang.ClassNotFoundException: Didn't find class "com.squareup.okhttp.OkHttpClient" |
OkHttp を使っているのにプロファイラ上に表示されない
アプリ起動直後に通信すると、なぜかプロファイラ上に表示されませんでした。
理由はよくわかりませんが、今回のサンプルのようにボタンタップで通信を行うようにすると解決しました。
同じ症状でお困りであれば、試してみてください。
さいごに
現状では HttpUrlConnection か OkHttp を使ったHTTP通信しか見れないという制限はありますが、通信クライアントとして OkHttp を使っているアプリは多いと思いますので、活躍の場は結構あると思います。
Android Studio 3.0 は ネットワークプロファイラ以外のプロファイラも強化されているようなので、他の機能も触ってみると楽しそうです。
正式リリースが待ち遠しいですね。
最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。
Follow @ryuta461
この記事をシェアする