engineers_blogこんにちは。Androidエンジニアの@syarihuです。Androidアプリを作っていて、エンドポイントを切り替えたり、ユーザの状態1を変えたりしたいときありますよね。エンドポイントの切り替えは、ビルドのやり直しや各環境のapkをインストールするなど手間が発生してしまいます。アプリをビルドし直したりせずに、エンドポイントなどを切り替えられたら嬉しいですよね。いうライブラリを利用して、デバッグ時のみ利用可能なデバッグメニューを作成する方法を紹介します。利用してデバッグ時のメソッドの返り値を任意の値に変更できるように作られたAndroid向けのライブラリです。debug-alterの詳細については開発者本人が書いたQiitaがあるので、そちらを参照してください。良いところ・良くないところは下記の通り。ForwardのAndroidアプリへのdebug-alterの導入を例に説明していきます。build.gradleの設定app/build.gradleに次のように設定します。"com.github.takahirom.debug.alter:annotation:${debug_alter_version}@aar"}pluginの適用をした時点でdebug-alter自体は利用できます。複数のFlavorが存在する場合はFlavorを切り替えるとアノテーションが参照できなくなってしまいます。別途アノテーションのみが含まれるライブラリを導入することで、Flavorを変更してもアノテーションが参照できるようにしています。debug-alterはkaptと非常に相性が悪いです。kaptを利用しているアプリ2で、アプリのKotlinバージョンとdebug-alterのKotlinバージョンに差異があると、kaptのビルドタスクでエラーが発生します。ForwardのAndroidアプリのKotlinのバージョンを上げたところkaptのビルドタスクでエラーが発生してビルドが通らなくなりました。'kotlin-gradle-plugin'を追記しkotlin-gradle-pluginを除外することで、debug-alterのkotlin-gradle-pluginに影響されないようにしました。デバッグ用のApplicationクラスを作成デバッグ時に差し替える値をセットする処理とデバッグメニューを開くための通知を送信する、デバッグ用のApplicationクラスを作成します。android:name="com.moneyforward.android.DebugApplication"独自のApplicationクラスが存在していてonCreateで何らかの初期化処理を行っている場合は、onCreateの直前に差し替え用のアイテムをセットすることで、値を差し替えたいメソッドがonCreate内で呼び出されていても値が差し替わるようになります。デバッグメニューを開くための通知を送信することで、プロダクトの画面に影響することなく通知からデバッグメニューへ遷移できるようにします。差し替え対象のメソッドにアノテーションをつけるdebug-alterでは@DebugReturnがついたメソッドが任意の値を差し替える対象になるため、値を差し替えたいメソッドにアノテーションをつけます。APIのエンドポイントを返却するgetApiEndPointというメソッドをデバッグ時に任意の値に差し替えたい場合は次のように実装します。{プロダクションコードにはこのアノテーションを実装するだけでよいので、とてもよいですね。デバッグ用の値に差し替えるdebug-alterでは@DebugReturnがついたメソッドを呼び出した際に、次の条件に一致する場合にメソッドの通常の返り値ではなくDebugAlterItemのgetメソッドから取得した値を返却します。@DebugReturnがついているメソッドのkey3とDebugAlterのインスタンスにセットされているDebugAlterItemのkeyが一致しているDebugAlterItemのisAlterメソッドの返り値がtrueである上記の判定に利用するDebugAlterItemのリストを簡単に生成できるようにするため、Helperクラスを作成します。Helperクラスの中にメソッドのkeyとメソッドが返却する型を定義したenumクラスを作成しましょう。...差し替える値はPreferenceに保存します。Preferenceのkeyでもそのまま扱えるようにstringリソースに記述し、Preferenceに保存する型はAlterItemTypeという別のenumクラスを作成して、AlterItemInfoのプロパティとしてセットしておきます。次に、DebugAlterItemのオブジェクトを生成するメソッドを用意します。...DebugAlterItemのコンストラクタは引数としてkeyを受け取ります。リソースIDを元に取得した文字列をkeyとしてDebugAlterItemのオブジェクトを生成します。isAlterメソッドはPreferenceに対象のkeyが存在する場合にtrueを返却することで、何もない場合は通常のメソッドを実行します。getStringItemメソッドはPreferenceに保存している値がStringだった場合に利用するメソッドです。PreferenceがString以外の型の場合は、その型のDebugAlterItemを返却するメソッドを別途作成する必要があります。Booleanの場合は、DebugAlterItemを返却するメソッドを作成します。作成したメソッドを利用して、enumを元にDebugAlterItemのリストを返却するメソッドを作成しましょう。...AlterItemInfoが持っているAlterItemTypeを利用して、対象の型のDebugAlterItemが返却されるようにします。作成したgetAlterItemListメソッドを利用して生成したリストを、DebugAlterのsetItemsメソッドに渡します。ついているメソッドを実行した際、条件が一致すればPreferenceにセットした値が返却されるようになりました。デバッグメニューを作るデバッグ時に差し替えたい値を設定するメニュー画面を作成し、デバッグ用のAndroidManifestに追加します。</application>最後に、作成したデバッグメニューを通知がタップされたときに起動するように実装します。ForwardのAndroidアプリにデバッグメニューを実装したので、実際にプレミアム状態をデバッグメニューで切り替えてみます。通知からデバッグメニューを起動し、設定を変更後すぐに反映されているのがわかりますね。これでデバッグメニューの完成です!まとめdebug-alterを利用することで、プロダクションコードにはアノテーションをつけるだけでデバッグ時に値を差し替えられるようになりました。デバッグメニューが実装されたアプリをインストールしてもらうことで、アプリエンジニアの手間を軽減するだけでなく、サーバーサイドのエンジニアが各環境のアプリを確認したい際にも役に立つことでしょう。活用していきましょう。最後にマネーフォワードでは、エンジニアを募集しています。ご応募お待ちしています。↩︎デフォルトではメソッド名がkeyになる。