Androidアプリで開発中などにユーザーやアプリの状態を簡単に変更できるようにするため、デバッグメニューを作ることがあると思います。
このデバッグメニューは色んな実装方法がありますが、ぼくのやり方について簡単に紹介しておきます。
ライブラリ
以前はデバッグメニューのライブラリを使うことが多かったです。例えば、 Hyperion-Android などです。ぼくも以前は使ったことあります。
ただ、今は外部ライブラリを一切使用していません。後々に負債にならないようにするためもありますが、このあと紹介する方法で柔軟に対応できるので必要性もなくなりました。
Composeによるデバッグメニュー
ComposeはKotlinコードによりUIを実装していくことになります。そのため、SourceSetを使用してdebugとreleaseのコードを切り替えることが出来ます。
ある画面にデバッグメニューを追加したいと思って、 src/main/java
内に実装します。
// src/main/java 内にコードを配置
Column {
// ここにデバッグメニューを出したい
DebugMenu()
// ...
}
debugビルドからの実行でのみデバッグメニューを表示したいので、実際のデバッグメニューの実装は src/debug/java
内に実装します。
// src/debug/java に配置
@Composable
fun DebugMenu() {
// デバッグメニューの実装
Column {
Button(/* */) {
Text(/* */)
}
}
}
逆にreleaseでの実行ではデバッグメニューを表示したくないので、 src/release/java
内はComposable関数のみを定義して、中身は何もしないようにします。
// src/debug/release に配置
@Composable
fun DebugMenu() {
// 何も実装しない
}
この実装により、debugビルドではデバッグメニューが表示されるが、releaseビルドでは何も表示されない状態になります。また、ほとんどのケースでR8により最適化されると思われます。
この方法を使うと好きな場所にデバッグメニューを表示できますし、デバッグメニュー自体は普通のComposable関数なので、自由に記述できます。
ViewシステムでこのようにUIレイアウトを変えるのはなかなか大変だったのですが、Composeなら簡単にできます。
デバッグ用の起動アイコン
もう一つ別の方法として、デバッグメニューActivityを用意して、それをホーム画面から起動できるように起動アイコンを追加します。
debugビルドでのみ使用される新しい AndroidManifest.xml
ファイルを src/debug
内に配置して、以下のような感じで、デバッグメニューのActivityの定義をします。
<!-- src/debugに配置 -->
<manifest>
<application>
<activity
android:name=".debug.DebugActivity"
android:exported="true"
android:label="(Debug) App"
android:theme="@style/Theme.MyApplication">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
あとは普通にActivityを実装するだけです。もちろんこのActivityも src/debug/java
内に配置します。
こうすることで、debugビルドの場合はメインアイコンとは別にデバッグメニューActivityが起動するアイコンがホーム画面に現れます。
逆にreleaseビルドでは、このアイコンは追加されません。
SourceSetの仕組みを使うと簡単に柔軟なデバッグメニューを追加することが出来ます。