アプリ開発備忘録

PlayStationMobile、Android、UWPの開発備忘録

【Android】Activityを開いたらLogcatにそのActivityへのリンクを表示する

クラッシュログはコードジャンプでクラッシュ箇所に飛べて便利ですよね。その仕組みを自由に使用できないかなと色々調べた結果、正規表現でやっているらしく、特定の文字列を出力するだけでコードジャンプのリンクを生成できました。

文字列

リンクを表示するだけなら、以下のように出力すればいいのですが、同名クラスがあるとどちらのクラスか選択するポップアップが出ます。

(ClassName:1)

しかし以下のように出力することで、同名クラスがあってもちゃんとコードジャンプされます。

Tab+(テキストがあってもなくても良い)+LineBreak+Tabを頭に入れた後に
at クラスのフルネーム、その後に本来は関数名が入るのですが、ここは何でも良いです。
そして括弧でクラスのシンプル名、行数を入力すればOKです。本来なら拡張子がありますが、拡張子の取り方がわからなかったので全部.ktにしたら拡張子がjavaでも動いたので、消してみたら普通に動きました。
行数は何行あるかわからないので1にしました。

\tAnyText\n\tat com.exsample.packagename.ClassName.AnyName(ClassName:1)

Activityを開いたら出力する

ActivityLifecycleCallbacksを使用すればActivityの変化時に処理を行えます。 Applicationに登録して使用します。

これでDebug時にActivityがResumeするたびにActivityへ飛べるリンクが生成されます。

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks {
            override fun onActivityPaused(activity: Activity?) {}
            override fun onActivityStarted(activity: Activity?) {}
            override fun onActivityDestroyed(activity: Activity?) {}
            override fun onActivitySaveInstanceState(activity: Activity?, bundle: Bundle?) {}
            override fun onActivityStopped(activity: Activity?) {}
            override fun onActivityCreated(activity: Activity?, bundle: Bundle?) {}
            
            override fun onActivityResumed(activity: Activity?) {
                if (BuildConfig.DEBUG && activity != null) {
                    Log.d("NowResumedActivity",
                          "\t\n\tat ${activity::class.jvmName}.init(${activity::class.simpleName}:1)")
                }
            }
        })
    }
}

f:id:matsudamper:20200428205436p:plain

AndroidManifest

あとはこれをAndroidManifestに登録してあげれば動きます。

終わりに

これで自分の開発も加速しますし、新人の人にこの画面について作業してもらいますとか言えますし、良いですね。