経緯
Firebase Local Emulator Suite を Docker でコンテナ内に構築し
エミュレータからアクセスしようとしたらホストを “10.0.2.2” にしてもアクセスできなかった。
理由はわからないが多分 Docker でやっているから、、、?
なので仕方ないので「adb reverse」コマンドでポート転送し、
エミュレータからも “localhost” で繋げるようにした。
ただ「adb reverse」コマンドはいつの間にか設定が消えたりして不便を感じた。
仕事終わりに開発しようとしたら Firebase Local Emulator Suite に繋がらずに都度モチベーションが削られる。
面倒くさいので gradle task として adb コマンドを実行するメソッドを作り、アプリケーション実行のたびに「adb reverse」が実行されるようにした。
Gradle Taskの実装
最終形
実装としては、アプリケーションの build.gradle に以下のメソッドを作成した。
task connectLocalhost(type: Exec) {
def adb = new File("${project.android.sdkDirectory}", "platform-tools${File.separator}adb")
commandLine adb, 'reverse', 'tcp:9099', 'tcp:9099'
doLast {
exec {
commandLine adb, 'reverse', 'tcp:8080', 'tcp:8080'
}
exec {
commandLine adb, 'reverse', 'tcp:4400', 'tcp:4400'
}
exec {
commandLine adb, 'reverse', 'tcp:4500', 'tcp:4500'
}
}
}
最終形までの変遷
当初、commandline の引数をcommandLine 'adb', 'reverse', 'tcp:8080', 'tcp:8080'
などとし、adb コマンドも文字列として渡していたが、これだと adb コマンドは実行されなかった。
なので以下のブログを参考に、メソッド内で adb のパスを取得するようにした。
その結果以下のような実装になったのだが、これだと一番最後のcommandLine adb, 'reverse', 'tcp:4500', 'tcp:4500'
しか実行されなかった。
task connectLocalhost(type: Exec) {
def adb = new File("${project.android.sdkDirectory}", "platform-tools${File.separator}adb")
commandLine adb, 'reverse', 'tcp:9099', 'tcp:9099'
commandLine adb, 'reverse', 'tcp:8080', 'tcp:8080'
commandLine adb, 'reverse', 'tcp:4400', 'tcp:4400'
commandLine adb, 'reverse', 'tcp:4500', 'tcp:4500'
}
なので以下のブログを参考に実装を変更した。
その結果、「最終形」のメソッドとなった。
Android StudioへGradle Taskの設定
実装した Gradle Task をアプリケーション実行の度にキックするよう Android Studio に設定する。
Android Studioの上部に実行やDebug実行のためのアイコンが並んでいる行がある。
その中の「app」とあるプルダウンから「Edit Configuration…」を選択する。

「General」タブを選択し下にスクロールすると「Before Launch」という設定欄がある。
そこの「+」を押下し「Run Gradle Task」を選択。
「Gradle Project」はフォルダアイコンを押下して作業中のプロジェクトを選択。
「Tasks」には実効するGradle Taskのメソッド名を入れる。
最後に「OK」を押下する。
自分はその後に「▲」マークを押して自分の定義したメソッドを「Gradle-aware Make」より上に来るようにした。
これで実行の度に「adb reverse」が実行されるようになった。
確認したい場合はアプリケーション実行後、terminalで「adb reverse –list」と実行してみると良い。
なおポート転送設定は「adb reverse –remove-all」で全て消せる。
「adb reverse –remove tcp:8080」のように個別に消すこともできるらしい。
まとめ
Gradle にお世話になっているものの、その知識が乏しいように感じる。
学習を進めていきたい。
あとほんとは使用しているツールのバージョンも書きたいのだが業務で疲れてしまって今は書けそうにない。おそらくそんな重要ではないので、気が向いたときに追記するかもしれない。