Logcatウィンドウを使って、Androidデバイス上で動作しているAndroidアプリのデバッグ方法について学習します。
Logcatウィンドウの画面構成
Logcatウィンドウには、ウィンドウ上部のプルダウンリストで選択したAndroidアプリのログメッセージが表示されます。Logcat ウィンドウの構成を次に示します。
番号 | 名称 | 説明 |
---|---|---|
① | Logcatクリア | 表示されているログメッセージをクリアする |
➁ | 終端スクロール | ログメッセージの一番下にジャンプし、最新のログメッセージを表示する |
③ | アップ | 収集したログメッセージを上に移動する |
④ | ダウン | 収集したログメッセージを下に移動する |
⑤ | ソフトラップ使用 | 改行を有効にし、水平スクロールを無効にする |
⑥ | 印刷 | ログメッセージを印刷する |
⑦ | 再起動 | ログメッセージをクリアし、Logcat を再起動する |
⑧ | Logcatヘッダー | 「Configure Logcat Header」ダイアログが開き、日時の表示など、各ログメッセージの外観をカスタマイズする |
⑨ | スクリーンキャプチャ | スクリーンショットをキャプチャする |
⑩ | スクリーンレコード | デバイスの画面を録画する |
⑪ | アプリ終了 | Androidアプリを終了する |
⑮ | Androidデバイス | 接続されたAndroidデバイスを指定する |
⑯ | Androidアプリ | Androidアプリを指定する |
⑰ | ログレベルメニュー | Logcatウインドウに表示されるログメッセージの量を制御するために、ログレベルを設定する |
⑱ | Logcatメッセージの検索 | 検索フィールドに文字列を入力して、入力したログメッセージをフィルタリングする |
⑲ | フィルタメニュー | フィルタオプションを選択する |
ログメッセージの書き込み・表示
すべてのログメッセージに、タグとログレベルが関連付けられます。
タグは、ログメッセージの発信元であるAndroidアプリを示す短い文字列で、独自のタグには、現在のクラスの名前など、実行場所を特定できる任意の文字列を使用できます。
ログレベルは、次のいずれかになります。
名称 | 説明 |
---|---|
Verbose | すべてのログメッセージを表示する(デフォルト) |
Debug | 障害の要因調査で使用する |
Info | 対処は必要ないが、通知する必要がある情報が出力される |
Warn | 問題が発生していても、処理が継続できる場合に出力する。早急な対処は必要ないが、対処することが望ましい潜在的な問題がある |
Error | 問題が発生して、処理が継続できなかった場合に出力される。処理を継続するには、対処が必要になる |
Assert | 予期しない例外やライブラリ等が使用不可能となる |
ログメッセージの書き込み
LOGクラスを使用して、作成しているJavaコードにログメッセージを書き込むと、Androidアプリの実行時に、Logcatウィンドウに表示されるログメッセージを作成できます。ログメッセージの書き込みには、次のLogメソッドを使用します。
Log.e(tag, message)(エラー)
Log.w(tag, message)(警告)
Log.i(tag, message)(情報)
Log.d(tag, message)(デバッグ)
Log.v(tag, message)(Verbose-詳細)
Logメソッドに割り当てられた優先度を次に示します。
- e:Error
- w:Warning
- i:Info
- d:Debug
- v:Verbose(最も低い優先度)
Logcatウィンドウへの表示
ログレベルメニュー(Logcatウィンドウ⑰)で、次のいずれかの値を選択します。選択した値より下にあるログレベルのログメッセージが表示されます
Logcatウィンドウに表示される形式は次のとおりです。
date time PID-TID/package priority/tag: message
- PIDはプロセスIDの略で、TIDはスレッドIDの略。スレッドが 1 つしか存在しない場合、これらは同一になることがある
- Logメソッドの1番目のパラメータはLogcatウィンドウでは「tag」として表示され、2番目のパラメータはLogcatウィンドウでは「message」として表示される
例えば次のようにLogメソッドを埋め込みます。
Log.d("MyApp", "Start"); // ログメッセージの書き込み
Logcatウィンドウで次のように表示されます。
2022-02-13 08:19:45.941 5475-5475/com.example.myapplication D/MyApp: Start //Logcatウィンドウへの表示
ログメッセージの検索(Logcat ウィンドウ⑱)に、Logメソッドで与えたtagを設定します。これによりAndroidアプリの実行と対応付けられ、デバックが可能となります。
計算アプリのデバッグ
「5.6 練習問題(計算アプリの作成)」で作成した計算アプリに、Logメソッドを次のように埋め込んでログメッセージを出力し、計算アプリのデバッグを行います。
MainActivity.java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.Toast;
import android.widget.Button;
import android.view.View;
import androidx.appcompat.app.AlertDialog;
import android.content.DialogInterface;
import android.widget.TextView;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView textView = null;
private EditText firstValue;
private EditText secondValue;
private boolean plus = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("MyApp", "Start"); // #①
Log.e("MyApp", "Start"); // #➁
Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(myToolbar);
// ボタンの取得
Button button = (Button) findViewById(R.id.button);
// リスナーの登録
button.setOnClickListener((View.OnClickListener) this);
textView = findViewById(R.id.textView);
firstValue = findViewById(R.id.firstValue);
secondValue = findViewById(R.id.secondValue);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.top_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d("MyApp", "OptionsItemSelected"); // #③
ImageView myImage = findViewById(R.id.imageView);
switch (item.getItemId()) {
case R.id.item1:
myImage.setImageResource(android.R.drawable.ic_input_add);
plus = true;
return true;
case R.id.item2:
myImage.setImageResource(android.R.drawable.presence_offline);
plus = false;
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onClick(View v) {
textView.setText(" ");
if (v.getId() == R.id.button) {
new AlertDialog.Builder(MainActivity.this)
.setTitle("計算アプリ")
.setMessage("計算を行いますか?")
.setPositiveButton(
"はい",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String value = "";
if (plus) {
value = String.valueOf(Integer.parseInt(firstValue.getText().toString()) +
Integer.parseInt(secondValue.getText().toString()));
} else {
value = String.valueOf(Integer.parseInt(firstValue.getText().toString()) *
Integer.parseInt(secondValue.getText().toString()));
}
Log.i("MyApp", value); // #④
textView.setText("= " + value);
}
})
.setNegativeButton(
"いいえ",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//
}
})
.show();
}
}
}
- #①は、ログレベルがDebugで、ログメッセージ「Start」を出力する
- #➁は、ログレベルがVerboseで、ログメッセージ「Start」を出力する
- #③は、ログレベルがInfoで、ログメッセージ「OptionsItemSelected」を出力する
- #④は、ログレベルがInfoで、ログメッセージとして計算して結果を出力する
「6.1 Androidデバイスへのダウンロード・実行」に従って、変更した計算アプリをビルドしてAndroidデバイスにダウンロードします。
次のように、Androidデバイス上で動作している計算アプリを操作します。
- GUIコンポーネント「TopMenuBar」に表示されている「X」アイコンをクリックする
- 2か所の入力欄にそれぞれ「2」と「3」を入力する。
- 「計算」ボタンを押して、表示されたダイアログで「はい」ボタンを押す
埋め込んだLogメソッドからのログメッセージが、Logcatウインドウに次のように表示されます。
本節の説明は以上になります。