概要
アプリケーション開発にバグ[1]はつきものです。必然的に、デバッグ[2]作業を行う機会も出てきます。
本記事ではAndroidアプリ開発初心者向けに、Android Studioを利用して開発を行う際に使えるデバッグテクニックの基礎をお伝えします。参考にしてみてください。
環境
IDE:Android Studio3.5.2(3.4以上)
どんなときに使うのか
デバッグ機能ですので、もちろん基本的にはデバッグを行う際に使うことになるのですが、そうはいってもいつでも使えるというわけではありませんし、必要のない作業をして無駄に時間をつかってしまうこともあります。
- テストしてみたが思うような結果にならず、関係するコードの要所で情報を確認したいとき
- 不具合の原因となっている場所がある程度特定できており、詳細な検証をしたいとき
- 他人の書いたコードの内容を検証したいとき
最後のものに関してはすこしデバッグと外れていますが、おおまかに分けて上に列挙したような場面で使うことになると思ってください。
主な機能
Android Studioには、快適な開発をサポートしてくれる機能が多々用意されています。その中からデバッグに関連する3つの機能を抜き出して紹介します。
システムログの利用
よく使われるデバッグ手法のひとつとして、プリントデバッグと呼ばれるものがあります。システムログに情報を出力して行う形のデバッグです。
Android Studioには、標準のログ機能としてLogcatというものが用意されています。ここではシステムログと、すべてのアプリケーションログを確認することができます。
左側にアイコンが並んでおり、ここから細かい設定を行うこともできます。詳しくは公式サイトを覗いてみてください。
Logcatにはいくつか規定のログレベルがあり、出力するログの内容に応じて出力を切り替えることができます。
メソッド |
ログレベル(優先度) |
概要 |
---|---|---|
Log.e(tag.message) |
Error |
エラーの情報 |
Log.w(tag.message) |
Warn |
警告、エラーとは言えないが非推奨 |
Log.i(tag.message) |
Info |
正常な使用で発生する情報、通知 |
Log.d(tag.message) |
Debug |
開発時に利用するデバッグメッセージ |
Log.v(tag.message) |
Verbose |
詳細な処理内容など |
この表の中ではErrorの優先度が最も高く、表の中で下に行くにつれて優先度が下がります。
ログレベルでフィルタをかける
上で紹介したログレベルを用いて、ログにフィルタをかけることができます。画像の赤枠で囲まれたドロップダウンリストで設定します。設定した優先度のログのみが表示されるわけではなく、それ以下のレベルのログも同時に表示されることに注意してください。
コラム:Assertレベル
上記の表で出てきたものの他に、Assertというログレベルが選択できると思います。これはErrorレベルよりも上位のログレベルで、あまり使われることはありません。そもそも発生することを想定していないような事態が起こった、つまりひどい失敗が見つかった時に使うためのもののようです。表では紹介しませんでしたが、ログに出力するためのメソッドも用意されていて、Log.wtfという名前がついています。ちょっとクスッとさせられる(使うタイミングで笑う余裕はないかもしれませんが)洒落た名前ですね。
特定のログを探す
先程見ていただいたログレベルのフィルタの隣に、検索用のバーが用意されています。ここにキーワードを入力することで、特定のログを探すことができます。
ここまではプログラムを通常通り動かしながらのデバッグ方法でしたが、次はプログラムを一旦止めてじっくり検証する方法の紹介です。
デバッガーの利用
デバッガー(Debugger)とは、デバッグのサポート機能です。IDEには必ずと言っていいほどついている機能の一つで、Android Studioにも用意されています。適用すると、アプリケーションの動作中に、プログラムを一時停止させて検査することができるようになります。
ブレークポイント
プログラムを一時停止できるといっても、ランダムな場所で勝手に処理を中断されてしまうと困りますね。そこで、ソースコード上でプログラムを止める箇所を指定できるようになっています。これを ブレークポイント と呼びます。
左側に見える赤い丸のマークがブレークポイントのマークです。
デフォルトでは、ブレークポイントの貼られたコードが実行される直前で毎回一時停止します。この他に、条件を設けて特定の場合のみ処理を停止させることもできます。設定用画面はCtrl+Shift+F8で表示させてください。
各設定項目とその内容については以下のようになっています。
項目 |
内容 |
---|---|
Enabled |
ブレークポイント有効・無効の切り替え |
Suspend |
停止させる範囲をスレッド単位か全体かで選択 |
Condition |
処理の中断を行う条件(条件式)を指定 |
Log |
ログへの出力に関する設定 |
Instance / Class / Caller filters |
特定のインスタンス / クラス / メソッドから呼び出された場合のみ停止させるよう設定 |
Pass count |
ここに指定した回数ごとに停止 |
Remove once hit |
一度だけ停止し、その後無効化 |
デバッグウィンドウ
デバッガーを起動している状態で、プログラムを一時停止させている間、デバッグウィンドウを使って様々な情報を確認できます。
赤く囲われている部分がデバッグウィンドウです。いくつか機能を紹介します。
項目 |
内容 |
---|---|
Variants |
停止している地点で使われている変数の値を確認したり、値の変更を行ったりする |
Watches |
指定した変数の監視を行う |
ステップオーバー |
1行ずつコードを実行。このとき、メソッドの呼び出しがあっても呼び出されたメソッドの中に入ることはない |
ステップイン |
1行ずつコードを実行。メソッドの呼び出しがあればそのメソッド内部の処理に入る |
ステップアウト |
実行中のメソッドの外に移動 |
1行ずつゆっくり動作の検証を行えるため、処理の内容や結果を細かく把握したいときに重宝します。
さて次は、画面のレイアウトに関するデバッグ機能の紹介です。
Layout Inspector の利用
Androidアプリを制作する際、レイアウトの多くはXMLファイルを使って静的に記述します。ただ、場合によってはプログラム実行中に動的に生成することもあります。動的にレイアウトを生成する場合、レイアウトファイルのDesignタブでレイアウト構造を確認することはできません。Layout Inspectorを使うと、実行中のレイアウト構造を確認することができるようになります[3]。
デバッガーとLayout Inspectorは同時に使えませんのでご注意ください。
取得したレイアウトのデータはファイルとして保存されます。これはスナップショットと呼ばれるもので、いつでも閲覧が可能です。プロジェクトウィンドウのドロップダウンでAndroidビューを選択していた場合、保存したスナップショットを見ることはできませんので、Projectビューに変更してから探してください。
生成したレイアウトがどのような構造になっているのか確認したいときや、レイアウトが崩れてしまって設定を修正したいときに、設定を確認しながらソースを修正することが可能です。上の画像ではKENスクールのAndroidアプリ開発講座で使用する最終課題の1画面をスナップショットに保存して表示しています。カレンダー部分はJavaのコードで生成しています。受講生さんに課題として書いていただく部分ではないのですが、Javaのソースコードとスナップショットを見比べて、どのコードがどこを生成しているのか確認することができますね。
最後に
デバッグ用のツールは、使い方を知っているとデバッグの難易度をぐんと下げてくれる頼もしいツールです。ここで上げた例以外にも便利に使える場面、機能がたくさんありますので、ぜひ積極的に利用して使いこなしてください!
[1] プログラムの欠陥のこと。機械の不調の原因を指すことも。英語で「虫」を指す単語で符丁のようなものなのですが、プログラムの不調の原因がコンピュータ内部に入り込んだ本物の虫だった、というエピソードもあるのだとか。
[2] バグを取り除く作業のこと。つまり、プログラミングにおいては、プログラムの欠陥を見つけ、正常な状態に書き換える作業のこと。
[3] 静的に記述している場合でももちろん利用自体はできますが、XMLファイルのDesignタブで確認したほうが早い場合も多いです。