Edited at
AndroidDay 3

Androidの便利なデバッグ手法

More than 1 year has passed since last update.

Android Advent Calendar 3日目の投稿です

3日目の今日はAndroidアプリ開発でよく利用するのデバッグのTipsを紹介します

(Android Studioの機能をメインに紹介していますが、恐らくEclipseでも同様の機能はあると思います)


Logクラスを使ったprintfデバッグ

Logクラスを知らない人はまずいないと思うので、サクッと

Log.e(TAG, error);

Log.w(TAG, warn);
Log.i(TAG, info);
Log.d(TAG, debug);
Log.v(TAG, verbose);

Logクラスの情報はLogcatと呼ばれるコンソールに出力されます

"TAG"は識別できればなんでもいいですが、クラス名が使われることが多いです

private final static String TAG = ClassName.class.getSimpleName();


  • AndroidStudio

AndroidStudioの場合は、[View] -> [ToolWindows] -> [Android]を選択するとLogcatを表示できるDDMS(Dalvik Debug Monitor Server)が下に表示されます


  • DDMS

DDMSは単体でも起動できて、AndroidSDKのtoolsにいます 例えばこんな感じのパスを叩くと起動します

/Applications/Android\ Studio.app/sdk/tools/ddms


  • shellでlogcatをみる

いわゆるcui環境も用意されていて、事前にadbのパスを通しておく必要がありますが、

adb logcat

で起動します

Logcatをpythonスクリプトで見やすく加工したJakeWharton/pidcatというツールもあります!

Logcatでjsonを表示する場合は、こちらが便利です

[Android] JSONの整形ってこんなに簡単にできるの!? 〜ログが劇的に見やすくなる魔法の引数〜(クラスメソッド株式会社)


Android Studioでブレークポイントを仕込んで止める

AndroidStudioではブレークポイントを仕込み、実行中のアプリを止めて状態を確認しながら動作検証することが出来ます

ブレークポイントはエディタスペースの左側のラインをクリックして設定します

(何箇所でも可能ですが空行には設定できません)

ムシっぽいアイコンをクリックすると 通常のビルドと同様アプリケーションが端末にインストールされます

アプリが起動するとDebuggerとAttachするまで待機画面が表示されます(デバッグ時はアプリが少し重くなります)

アプリがブレークポイントで止まると、下のような画面が表示されます

表示されない場合はDDMSと同様に[View] -> [ToolWindows] -> [Debug]を選択すると表示されます

この画面でよく使うのは、


  • 左上の緑色の再生ボタン(次のブレークポイントまで実行)

  • 二つ下の停止ボタン(デバッグの停止)

  • Logcatタブの2つ右の逆コの字ボタン(ステップオーバー[行ごとにステップ実行])

  • 一番右側の電卓ボタン(ブレークポイント地点で任意のコードを評価)

また、Debuggerとの接続が切れてしまった場合、ムシの右側のボタン[Attach debbuger to Android Process]で再度Attach出来ます


プロキシサーバーを使って通信内容を確認する

アプリのソースコードレベルで問題が解決しなかった場合apiサーバーとの通信内容を調べます

例えば開発中はちゃんとstagingサーバーを向いているか、ヘッダーの情報や返ってきたjsonの構造などを確認します

Charlesを使うと開発用のプロキシサーバーを簡単に用意することが出来ます


  • セットアップ

CharlesはこちらからDL出来ます

無料版は30日間利用できて30分おきにアプリが終了するような仕様だったかと

有料版は5000円くらいしますが、値段以上の価値はあると思いました

[端末側の対応]


  • ブラウザからhttp://charlesproxy.com/charles.crt にアクセスし、証明書をインストールします

  • wifi設定からプロキシホスト名(開発機のローカルip)とポート(デフォルトは8888)を設定します

[開発機側の対応]


  • Charlesを起動し、proxyからproxysettingsを開き、SSLタブからLocationsに*を追加します


  • 実際の画面


正常にキャプチャ出来ているとこのような画面になります

下のタブで返ってきたjsonやヘッダ情報が確認できます


  • mitmproxyについて

Charlesとほとんど同じ機能が使えるmitmproxyというcuiベースのツールもあります

mitmproxyについてはiOS実機のSSL通信をプロキシによって傍受したり改ざんする方法に詳しく紹介されています

もちろんAndroidでも利用可能です


Webviewのデバッグ

webviewのデバッグは地獄のように大変だったりしますが、Android4.4以上の端末をお持ちならリモートデバッグが可能です

どこでもいいんですが(Applicationクラスとかがよさそう)、以下のコードを埋め込みアプリをビルドします

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {

WebView.setWebContentsDebuggingEnabled(true);
}

端末を接続した状態でChromeでchrome://inspectを開くとこんな画面が出ます

inspectを押すと見慣れたインスペクタが表示されます 選択された部分はAndroidでもハイライトされます


デバッグ時の小ネタ


  • ビルドを止めたい


今だにAndroidStdioでビルドを止めるがわからないのですが (プロジェクトルートに移動し)gradlew --stopで止まるようです

./gradlew --stop


  • 既にビルドしたapkを端末にインストールする

adbコマンドを使うと再ビルドすることなく既にビルドされたapkを端末に入れることが出来ます

(こちらもプロジェクトルートに移動して)

adb install -r app/build/outputs/apk/app-debug.apk


  • adbの複数端末接続問題

adbは複数端末が繋がれているとオプションでデバイスIDを渡さないとエラーになるんですが

そこら辺の煩わしい問題をpecoを使って解決する方法が以下のエントリーで紹介されています

複数のAndroid端末を同時につないで困ってませんか?それadb-pecoで選択できるよ!

僕が普段やるデバッグ作業はこんな感じなのですが(あとはapiサーバー側のデバッグ)、

なにか他の素晴らしい方法がありましたら教えて下さい