WSL2のadbからWindowsのAndroid Emulatorを使う

Windows上でAndroidアプリを開発するとき、普通の人、というかWindowsに慣れている人は、普通にWindows上で開発すればいい案件なのだが、自分にとってはLinuxの世界で開発できたほうがいろいろ都合がよいので、WSL2上で開発をしている。

Android Studioや、react-native-debuggerといったツールたちは、WSL2+X Server (X410) という環境でも問題なく動く。 しかし問題はAndroidエミュレータを、WSL2上でうごかすことが現状ではできないのだ。[1]

それで、いままでうまい方法がよくわからなかったので、WSL2上でつくったapkを、Windowsのほうのadbで adb install して実機なりエミュレータにいれる、というかなりめんどくさいことをしていた。 ただ、通常ほとんどの開発がReact Nativeでのものだったため、ネイティブのほうの実装を変更することはあまりなく、一度apkを実機orエミュレータにインストールさえしてしまえばapkを入れなおす必要はないので、あまり問題にはなっていなかった。

ただ最近はReact Nativeばかり書いていて、何年もネイティブ開発をしていないという状況がつづいてしまっているので、ネイティブのほうのキャッチアップもしておかないとな〜という気持ちがたかまってきていて、Holiday projectとしていま仕事で書いてるわりとでかめのアプリをネイティブで再実装する、というのをはじめていて、そうなるってくるとこのいびつな開発環境だとつらすぎるので、ようやく重い腰をあげて、なにか良い方法はないかしらべはじめた。

TL;DR:

Windowsの 5037 ポートをWSL2へreverse port forward。(WLS2上で 127.0.0.1:5037 がWindowsの5037につながるように、という意味)

前準備

Windowsのほうにもadbが必要なのでAndroid Studioをいれておく。どのみちエミュレータをそっちで動かすので入れるとは思うが。

ポートフォワード

adbのhelpコマンドを良くみてみると

-H         name of adb server host [default=localhost]
-P         port of adb server [default=5037]

という部分があって、他のホストのadb serverを使えそうな記述がある。しかし、adbは 127.0.0.1:5037 にbindしてしまうので、実質そのままでは他のホストにつなぐことはできない。[2]

なのでポートフォワードしてみることにした。方法はいろいろあるが、自分の場合はWSL1の環境もあるので、WSL1から

ssh -R 5037:127.0.0.1:5037 127.0.0.1

としている。127.0.0.1に接続していてなんのこっちゃという感じだが、Windowsホストの22番ポートはWSL2ホストにforwardされるようにしているのでこれでWSL2につながるのである。そうしてない人は接続先をWSL2のアドレスにする必要あり。 あと、これをする前にWSL2上でadb serverがうごいている場合はあらかじめ adb kill-server しておく、またWindowsのほうでは adb start-server しておく必要がある。[3]

この状態で、WSL2上で adb devices とかしてみると、Windowsのほうに繋っているエミュレータや実機が普通に見えるようになっているはず。adb shellや、adb installなどもWindowsから操作するのとおなじことがWSL2からおこなえるようになる。便利!

いままでこの環境だとうまく使えなかったFlipperもちゃんと(WSL2サイドで)動くようになってうれしいかぎり。

余談

とまぁ、最終的には実際5037を転送するだけでよかったのだが、最初はリモートのAndroidエミュレータに繋ぐ方法、みたいな検索ワードで調べていたのでまったく答えにたどりつけず、ハマりにハマってかなりの時間をとかしてしまった。あと、Flipperを起動するとadb serverが自動で起動されてしまうことに気付かず、 kill-server してるのになぜか終了できない!(pidがかわってうまれかわってくる)、みたいになってWSL2上のadb serverがとめられなくなったりもした。pstreeでみてみてもsystemdが親にみえるため、Flipperが原因だとはなかなか気が付けなかった。 とはいえ最終的につかえるようになったので、時間をかけたうえに「なんの成果も!! 得られませんでした!!」となる最悪の自体はさけられたのでよしとしよう。