AndroidエミュレータでRN製アプリのデバッグをしようと思ったのですが、なんとなくAndroid Studioを立ち上げてエミュレータを起動してRunボタンを押すのが億劫になってしまい、指の赴くままにコマンドラインからアプリを起動してみました。
何も考えないで指を動かしただけなので、もっと良い方法があるかとは思います。読んでもよく分からなかった人は真似せずAndroid Studioを起動してください。
エミュレータを立ち上げる
エミュレータの作成はAndroid Studioを通したほうが楽ですが、作成済みのエミュレータはコマンドラインからでも起動できます。
$ $ANDROID_HOME/tools/emulator -list-avds # 作成済みのエミュレータ一覧を出す Nexus_5X_API_26 Pixel_API_24 Pixel_C_API_25 $ $ANDROID_HOME/tools/emulator @Pixel_C_API_25 # エミュレータを指定して起動する emulator: emulator window was out of view and was recentered emulator: ### WARNING: /etc/localtime does not point to /usr/share/zoneinfo/, can't determine zoneinfo timezone name emulator: ### WARNING: /etc/localtime does not point to /usr/share/zoneinfo/, can't determine zoneinfo timezone name
本来は $ANDROID_HOME/tools
にはPATHを通してあるので、ただ emulator
と打つだけでも起動できますが、説明のために冗長にしてあります。
これでエミュレータの起動を待ちます。
bundlerをスタートしておく
最終的には react-native run-android
を使うので、そのときに一緒にbundlerを立ち上げてもらえるのですが、諸々の事情でyarn startに単純なstart以外にも処理を仕込んである場合などがあると思います。うちの場合はキャッシュに悩まされてつらかったことがあったので --reset-cache
を必ず付けるようにしてたりします。
そんな事情から、 run-android
とは別にbundlerを実行しています。ターミナルのタブをひとつ占有させてあげる感じですね。
$ yarn start yarn run v1.5.1 $ node node_modules/react-native/local-cli/cli.js start --reset-cache Scanning folders for symlinks in /path/to/rnapp/node_modules (51ms) ┌────────────────────────────────────────────────────────────────────────────┐ │ Running Metro Bundler on port 8081. │ │ │ │ Keep Metro Bundler running while developing on any JS projects. Feel │ │ free to close this tab and run your own Metro Bundler instance if you │ │ prefer. │ │ │ │ https://github.com/facebook/react-native │ │ │ └────────────────────────────────────────────────────────────────────────────┘ Looking for JS files in /path/to/rnapp Metro Bundler ready. Loading dependency graph, done.
エミュレータのデバイス名を確認してrun-androidする
エミュレータとbundlerの準備ができたら、あとはアプリを起動するだけです。
react-native run-android
にdeviceIdオプションを付けると、インストール先の実機やエミュレータを指定できるので、先程起動したエミュレータのdeviceIdを調べるところから始めます。
$ $ANDROID_HOME/platform-tools/adb devices # エミュレータや実機のdeviceIdを調べる List of devices attached emulator-5554 device # これがエミュレータのdeviceId $ npx react-native-cli run-android --deviceId emulator-5554 # Androidでアプリを起動する npx: 41個のパッケージを4.999秒でインストールしました。 Scanning folders for symlinks in /Users/y.nakagawa/dev/an-lite-app/packages/app/node_modules (46ms) JS server already running. Building the app...
adbでdeviceIdを調べると、大抵はemulartor-5554が出てきます。面倒であれば調べずに決め打ちでemulator-5554を指定してもいいのかもしれません(というかよくやります)。
コマンドが react-native run-android
ではなく npx react-native-cli run-android
は特に意識の高い話ではなくかなりズボラな話で、何だか面倒になってreact-native-cliをグローバルにもdevDependenciesにもインストールしなくなった*1ので、このときだけ使えればいいやというモチベーションで使っています。この方法の問題として、yarn startとrun-androidで使っているcliの実装が違っているけどいいの?という話はあって、いつか痛い目を見そうな気はしています。
まとめ
Android SDKのemulatorやadbといったコマンドの動きが指に染み付いている人間はこういう変な起動の仕方をすることがありますが、こんなことを新しく覚えるために学習コストを払うくらいなら素直にAndroid Studioを立ち上げたほうが賢明だと思うので、どうしてもやってみたい方以外は真似するのはオススメしません。
*1:たまにしか使わないし・・・