【独学】はじめてのAndroidプログラミング – 6.2 アプリケーションのデバッグ方法

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デバイス上で動作している計算アプリを操作します。

  1. GUIコンポーネント「TopMenuBar」に表示されている「X」アイコンをクリックする
  2. 2か所の入力欄にそれぞれ「2」と「3」を入力する。
  3. 「計算」ボタンを押して、表示されたダイアログで「はい」ボタンを押す

埋め込んだLogメソッドからのログメッセージが、Logcatウインドウに次のように表示されます。

本節の説明は以上になります。

タイトルとURLをコピーしました