Flutter × 実機デバッグで「unauthorized」になった話と対処法
Flutterを触ったばかりの初心者です。
早速実機デバッグに躓いたので、自分用のメモとしてまとめました。
同じように困った方の参考になれば嬉しいです。
発生した問題
flutter devices
で実機を認識はしているものの、
Device xxxxxxxx is not authorized.
You might need to check your device for an authorization dialog.
のようなメッセージが出て、スマホにも「USBデバッグの許可」ポップアップが表示されません。
スマホが2台ありましたが、どちらも同じ状況でした。
試したこと
- スマホのUSB設定で「ファイル転送」などを選んでみるも、ポップアップは出ず
- Flutterのセットアップは問題なさそう(
flutter doctor
は大丈夫) -
adb devices
をコマンドプロンプトで確認すると、unauthorized
のまま
何度コマンドを繰り返しても「Device unauthorized」が表示され、ダメだこりゃーと思ってたんですが、下記を試して解決でございます。
解決方法
- スマホの接続を解除して、
adb kill-server
を実行 - 続けて
adb start-server
でadbサーバを再起動 - そのあとにスマホを再接続したところ、スマホ画面に「USBデバッグを許可しますか?」のポップアップが表示されました!
-
adb devices
を再度実行すると、デバイスがdevice
として認識されるようになりました。
🔍 今回のトラブルの正体
FlutterやAndroid開発で実機デバッグを始める時、この「unauthorized」問題は意外とハマる人は多いのでは(一回乗り越えたら問題ないんでしょうけども…)。
エミュレーターのデバックとは違い、実機では「USBデバッグ許可」が必要です。
Android実機にUSB接続すると、最初の一回に「このPCをUSBデバッグで許可しますか?」という 確認ポップアップ が表示されるはずで、これを許可しない、または表示されないままだと、ADB(Android Debug Bridge)から見ると "unauthorized"(未認可)状態になります。
これがエラーの正体ですね。
なのでポップアップが出てくれないことには、我々はどうすることもできないという…
ちなみにエミュレーターでデバックする場合に、ADB認証が不要な理由としては、エミュレーターはPC上の仮想マシンのため、ADBとの通信は 初めから許可された状態 で動作するそうな。
ですので今回のトラブルは、実機を使う場合ならではの躓きですね…
adb kill-server
→ start-server
でポップアップが出たのか?
🔍 なぜ 1. ADBの常駐プロセスが不調になっていた
ADB はバックグラウンドで常駐しており、接続情報や認証状態をキャッシュしたまま不安定になることがあります。
adb kill-server
でそれを完全に終了させ、adb start-server
でクリーンな状態で再起動したことで、接続が正しく初期化されたようです。
2. PCとスマホ間の認証情報が食い違っていた
unauthorized
状態が続くのは、PCが古い ADB キーを使っていて、スマホ側でそのキーが認識されていなかった可能性があります。
kill-server
→ start-server
によって鍵の再生成や再送信が行われ、ようやくポップアップが出たと考えられます。
3. 別プロセスが ADB ポートをロックしていた
Android Studio や emulator など、他の Android 系ツールが先に ADB ポート(5037)を使っていた可能性があります。
kill-server
によりそれらを強制終了し、ポートを開放することで正常に動作するようになったという見方もできます。
まとめ
実機の「ポップアップが出ない」原因の一例
- USB接続モードが「充電のみ」「データ転送なし」になっている
- USBデバッグがオフになっている
上記を解決しても埒が明かない場合は、ADBサーバーの不調です。
adb kill-server
adb start-server
を使って、adbの接続認証のリセットしましょう!
以上です。 それでは~
Discussion