読者です 読者をやめる 読者になる 読者になる

tomoima525's blog

Androidとか技術とかその他気になったことを書いているブログ。世界の秘密はカレーの中にある!サンフランシスコから発信中。

Debotというデバッグメニューを簡単に追加できるライブラリを作りました

f:id:tomoima525:20151006010239p:plain
先日Debotという名前のライブラリをリリースし、勉強会で発表したりしたのですが、主に英語で書いたりしていたので、ブログにも書こうと思います。

デバッグ用ライブラリとしての特徴

youtu.be

Debotはアプリのツールバーデバッグメニューを簡単に追加できるライブラリです。標準でデバッグ機能として以下がついています。

  • Activity名、Intent情報を表示する
  • 画面密度を表示する
  • アプリ情報(VersionCode,VersionName等)を表示する
  • 自動入力機能(特定のTextViewに指定した文字を入れる)

また、カスタムプラグインで自分が必要なデバッグ機能を容易に追加することができます。
@DebotAnnotationアノテーションをつけたメソッドはDebotから呼び出すことができます。つまりメニューからActivity内の特定の処理を実行することができます。つまり、 デバッグの時に繰り返し入力するなどの作業を自動化できます。

どういうモチベーションで作ったか

このライブラリを作った動機は大きく2つあります。

デバッグの時間を短縮したい

開発時は仕様を検討したり、コードを書いたりもしますが、デバッグ作業は馬鹿になりません。特に入力周りや特定の処理を経ないと確認できない部分など、その画面を再現するために多くの時間が費やされます。そういう時間を減らし、より創造的なことに時間を割けるようにしたいと考えました。

どのアプリでも使うデバッグ機能をモジュール化したかった

いくつかアプリを作っていると、大体以下のことについて考えます。

  • プロダクションのコードにデバッグコードなるべく書きたくない
  • 同じようなデバッグ処理をどのアプリでも大体書いてる
  • 一方でアプリに大してユニークなデバッグ処理もある

例えば、画面が増えてくると、「今見てるこの画面のActivity名ってなんだっけ?」ということが頻繁にあります。そういう時にちょろっと確認できたらよいなと思うのですが、都度書くのも馬鹿らしいです。 Debotのようなライブラリを作ることで、ペロッとデバッグ機能が追加できるんじゃないかと思いました。

簡単な使い方

1.Dependenciesに追加してやります。

compileDebug 'com.tomoima.debot:debot:1.0.1'
compileRelease 'com.tomoima.debot:debot-no-op:1.0.1'

上記によりreleaseに入れなくすることができます。

2.アプリケーションクラスから初期化してやります。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        DebotConfigurator.configureWithDefault(this);
    }
}

3.デバッグ処理をメニューに追加したいActivityに以下を追加します。

public class MainActivity extends AppCompatActivity{

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        Debot.onCreateOptionsMenu(menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        Debot.onOptionsItemSelected(item);
        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onResume() {
        super.onResume();
        Debot.onResume(this);
    }

    @Override
    protected void onPause() {
        super.onPause();
        Debot.onPause(this);
    }
}   

BaseActivityを作って上記を書いてあげると、いちいち書かなくて済むようになるのでおすすめです。 以上でデバッグメニューがデバッグ版のみに表示されるようになります。

カスタムメニューの追加

自分でデバッグ機能を追加したい場合は DebotStrategy を継承してやります。

public class MyDebotStrategy extends DebotStrategy{
    @Override
    public void startAction(@NonNull Activity activity) {
    // Do your things
    }
}

で、アプリケーションクラスで設定してあげます。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        DebotStrategyBuilder builder = new DebotStrategyBuilder.Builder(context)
                .registerMenu("My debug feature", new MyDebotStrategy())
                .build();
        DebotConfigurator.configureWithCustomizeMenu(this, builder.getStrategyList());
    }
}

Activityのメソッドを呼んであげる

例えばデバッグメニューの一つとして"その画面で叩くApiをコールする"という処理を追加したいとします。 Activityに@DebotAnnotationをつけたメソッドを作ってやります。

//Your Activity
@DebotAnnotation("debugApiCall")  //カッコ内はメソッド名と同じにしてやる
public void debugApiCall() {
    ApiClient.call(Api_hoge);
}

メニューに追加するために、DebotCallActiviyMethodStrategy()を呼んであげます。

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        DebotStrategyBuilder builder = new DebotStrategyBuilder.Builder(context)
                .registerMenu("callApi", new DebotCallActivityMethodStrategy("debugApiCall"))
                .build();
        DebotConfigurator.configureWithCustomizeMenu(this, builder.getStrategyList());
    }
}

上記により、デバッグメニューにcallApiが追加され、実行するとApiがコールされるようになります。 ActivityにdebugApiCall()というメソッドがなければ、何も実行されません。

まとめ

ソースコードはこちらにあります。新しいデバッグ機能や不具合などあれば、PR or issueいただけると幸いです。

tomoima525/debot · GitHub