techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

Android Studioにコードジャンプするログを作る

Androidのstacktraceなどでコードジャンプするログが表示されています。
コードジャンプ自体はAndroidStudioの機能になるのですが、ログの作り方を工夫することでコードジャンプすることができるログを作ることができます。
そこで今回はコードジャンプする方法をご説明します。

コードジャンプするログ

Android StudioのAndroid Monitorのログからコードジャンプするには次の構文がログに入っているとAndorid Studioが自動的にリンクをしてくれてクリックするとジャンプすることができます。

(<クラスファイル名>.java:<ファイル内行数>)

Eclipseで開発していた頃はクラスのパッケージ名なども記載が必要でしたがAndroid Studioではその記載がなくても動作するようになりました。
また、パッケージ名を記載する下記の構文で記載すると同じファイル名が存在する場合に直接ジャンプすることができるようになります。

at <クラス名>.メソッド名(<ファイル名>.java:<ファイル内行数>)

コードジャンプするコード(パッケージ名指定)

Log.dでログを出し、ログのメッセージの後ろにコードジャンプする文字列を追加する例となります。

public class CustomLog {

    public static void d(String tag, String message) {
        StackTraceElement[] stack = Thread.currentThread().getStackTrace();
        int index = -1;
        for (int i = 0; i < stack.length; i++) {
            if (stack[i].getMethodName().equals("d")) {
                index = i + 1;
                break;
            }
        }

        String classNameFull = stack[index].getClassName();
        String className = classNameFull.substring(classNameFull.lastIndexOf(".") + 1);
        String methodName = stack[index].getMethodName();
        String lineNumber = String.valueOf(stack[index].getLineNumber());

        Log.d(tag, message + " at " + classNameFull + "." + methodName + "(" + className + ".java:" + lineNumber + ")");
    }
}

CustomLog.dを使ってログを表示すると次のように表示されます。

f:id:muchiki0226:20160817001120p:plain:w300

青色になっている部分をクリックするとdを呼び出しているところへジャンプしてくれます。

コードジャンプするコード(パッケージ名指定なし)

Log.dでログを出し、ログのメッセージの後ろにコードジャンプする文字列を追加する例となります。
こちらはパッケージ名を限定しないやり方となります。

public class CustomLog {

    public static void d2(String tag, String message) {
        StackTraceElement[] stack = Thread.currentThread().getStackTrace();
        int index = -1;
        for (int i = 0; i < stack.length; i++) {
            if (stack[i].getMethodName().equals("d2")) {
                index = i + 1;
                break;
            }
        }

        String classNameFull = stack[index].getClassName();
        String className = classNameFull.substring(classNameFull.lastIndexOf(".") + 1);
        String lineNumber = String.valueOf(stack[index].getLineNumber());

        Log.d(tag, message + "(" + className + ".java:" + lineNumber + ")");
    }
}

CustomLog.d2を使ってログを表示すると次のように表示されます。

青色になっている部分をクリックするとd2を呼び出しているところへジャンプしてくれます。

f:id:muchiki0226:20160817001144p:plain:w200

もし同じファイル名が存在する場合は青色部分をクリックした場合は次のように候補を出してくれます。

f:id:muchiki0226:20160817001154p:plain:w300

メリットとしてはログの付属情報が短くなるのでこちらを利用するほうがわかりやすいかもしれません。

サンプルコード

github.com