あるマシンで Android アプリケーションのコードを記述/コンパイルし、別のマシンで起動したエミュレーターでリモートでデバッグすることは可能ですか? エミュレーターが常にラップトップの CPU の半分を消費することにうんざりしています。
10 に答える
cmb が言及したコマンドを以前に試したことはありません (または気づいたことさえありません)adb connect
が、TCP ポートを自分で (SSH 経由などで) 転送することが正常に機能することを確認できます。
エミュレーターはインスタンスごとに 2 つの TCP ポートをリッスンします。5554 は telnet インターフェイス用で、5555 は DDMS などのツールとの制御通信用です。したがって、ポート 5555 のみを転送するだけで済む可能性があります (ただし、これまで両方で試しただけです)。後続の各エミュレーターは、次に使用可能な偶数 + 奇数のポート番号のタプル (最大で約 5580 だと思います) を使用します。
参考までに、ローカル マシンで次の手順を実行しました。
ssh -NL 5554:localhost:5554 -L 5555:localhost:5555 myuser@remote-server
killall adb; adb devices
エミュレーターは、起動時にローカルの adb サーバーに通知しようとしていると思います。したがって、ローカルの 5554+ ポートをプローブするために adb を再起動する必要があります。
ssh コマンドの は、リモートマシンlocalhost
のローカル インターフェイスを指すことに注意してください。
adb devices
新しいエミュレーターが表示されました — emulator-5554
— そして、ローカル マシンで実行されているかのように使用できました。
この質問は非常に古いものだと思いますが、問題を少し異なる方法で解決したため、この簡単な解決策を見つけるのに時間がかかりました。
GUI が好きなので、通常は Windows7 PC またはラップトップ (作業している場所によって異なります) をフロントエンドとして使用しますが、すべての編集/コンパイル/デバッグをヘッドレス Ubuntu サーバーで行うことを好みます。それが提供するコマンドラインの力。私の目標は、余分なサービス (sshd など) やファイアウォール ホールを使用せずに、各 Windows システムを可能な限りシン クライアントにすることです。
したがって、ここにシナリオがあります:
- System-A: Android エミュレーターが動作する Windows7 システム
- System-B: SDK がインストールされた Ubuntu サーバー
前述の問題は、System-A のエミュレーターが外部イーサネット インターフェイスではなく localhost にバインドされるため、System-B の adb が System-A のエミュレーターにアクセスできないことです。System-B への SSH 接続のために、PuTTY でリモート ポート フォワーディングを設定するだけです。トリックは、2 つのトンネルを作成するときに「リモート」ラジオ ボタンをオンにして、トンネルの方向が逆になるようにすることです (ログインしているサーバーからログインしているクライアントへのトンネリング)。
最後に、SSH 接続を確立した後、adb を使用して System-B の「localhost」に接続します。
System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555 device
これで、通常どおりイメージのダウンロード/デバッグができるようになりました。ラップトップを取り出してコーヒーを飲みたい場合は、別の Windows システムに切り替えるのは簡単なことです。
さらに、同じ方法でポート 5037 をトンネリングすることにより、実際に adb サーバー接続を転送して、実際の Android デバイスを System-A の USB 経由で接続し、System-B からイメージをダウンロードすることができます。これを機能させるには、SSH セッションを開始する前に、adb サーバーが System-B ではなく System-A で実行されていることを確認する必要があります。
まず、System-A で adb サーバーを起動します (コマンド プロンプト)。
C:\> adb start-server
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
C:\> adb devices
List of devices attached
3435F6E6035B00EC device
次に、System-B の adb サーバーを強制終了します。
System-B$ adb kill-server
最後に、System-B への ssh セッションを再起動して確認します
System-B$ adb devices
List of devices attached
3435F6E6035B00EC device
これが私がWindowsでそれを解決した方法です。私はクリストファーのリードにほぼ従いましたが、編集できないため、新しい回答が必要になります。
私が抱えていた問題は、ADB とエミュレーターが 0.0.0.0 ではなく 127.0.0.1 をリッスンしていたことです。そうでなければ、私はTCPMonを使用していたでしょう。これは、Windows では異なるか、SDK の最新バージョンで変更されていると思います。( で確認できますnetstat -ban
。)
エミュレーターを実行するマシンにWinSSHDをインストールしました。(freeSSHdでも動作するはずですが、ログインが機能しませんでした。)
Windows ファイアウォールでポート 22 (TCP) を開きました。(WinSSHD でそれができる場合があります。)
WinSSHD GUI で仮想アカウントを作成しました。
開発マシンからエミュレータ マシンへの新しい PuTTY 接続を作成し、接続できることを確認しました。
次に、PuTTY でトンネリングをセットアップします: Connection -> SSH -> Tunnels
Source port: 5554
Destination: localhost:5554
Type: Local/Auto
Source port: 5555
Destination: localhost:5555
Type: Local/Auto
(トンネルを維持するために、PuTTY を接続して開いたままにします。)
ここで、リモート マシンでエミュレータを起動し、そこで ADB が実行されていないことを確認しました。
開発マシンで ADB を再起動しました (
adb kill-server
、その後adb start-server
)。adb devices
リモートエミュレータは として表示されましたemulator-5554 device
。これで、Eclipse/ADT から直接アプリをデプロイして実行できるようになりました。そこでは、エミュレーターがローカル エミュレーターであるかのように [仮想デバイス] の下に表示されました。
2 台のマシンが同じプライベート ネットワークにあり、SSH 暗号化を使用する必要がない場合 (これは一般的なケースです)、これを行う簡単な方法を見つけました。SSH トンネルは非常に長く、インストールが難しい場合があるため、これが役立つ場合があります。例えば、Cygwin/Windowsに初めてSSHデーモンをインストールするのは諦めに繋がるかもしれません(まあ諦めました)。
Windows では、次の手順を実行するには、Cygwin をパッケージhttptunnelと共にインストールする必要があります。これは Linux / httptunnelでも動作するはずですが、試していません。
いずれかのマシンでエミュレーターを実行します (ホスト名がHostEmulatorであるとしましょう)
他のマシンで Eclipse を開始します (これをHostEclipseと呼びましょう)
各マシンで Cygwin ターミナルを開き、次に、
HostEmulatorで、次の cygwin コマンドを入力します。
hts -F localhost:5554 10000 hts -F localhost:5555 10001
htsはHTTP トンネル サーバーを意味します。
これらの 2 つのコマンドは、ポート 10001 と 10001 をリッスンし、これらのポートの I/O をローカル ポート 5554 と 5555 にリダイレクトする 2 つのハーフ ブリッジを作成します。それらのいくつかを実行している場合は、このページの他の返信に見られるように、より高いポート番号を使用します)。
HostEclipseで、次のものを入力します。
htc -F 5554 HostEmulator:10000 htc -F 5555 HostEmulator:10001
htcはHTTP トンネル クライアントを意味します。
これらのコマンドは、不足しているハーフ ブリッジを作成します。これらはローカル ポート 5554 および 5555 をリッスンし、これらのポートの I/O を、先ほど HostEmulatorで作成したハーフブリッジにリダイレクトします。
次に、引き続きHostEclipseで、次の 3 つのコマンドを入力します。
adb kill-server adb start-server adb devices
そうしないとリモートエミュレーターが検出されないため、これにより adb が再起動されます。起動時に何らかのスキャンを実行している必要があります。次に、確認用にデバイス (使用可能なエミュレーター) を一覧表示します。
- そして、そこに行きます。
リモート エミュレーターをローカルであるかのように操作できます。両方のマシンで Cygwin ターミナルを開いたままにしておく必要があります。そうしないと、作成したハーフブリッジが強制終了されます。
ここではマシン間の交換にポート 10000 と 10001 を使用しましたが、もちろん、まだ使用されていない限り、他のポートを使用できます。
ssh サービスの開始に失敗したときの Windows + AndroVM (ホストオンリー アダプターが必要) のソリューション。そのため、追加のソフトウェアは必要ありません。
adb connect <Andro VM IP>
adp tcpip 555
コマンド プロンプトで、管理者として実行します。
netsh interface portproxy add v4tov4 listenport=5555 listenaddress=<host ip> connectport=5555 connectaddress=<Andro VM IP>
Windows ファイアウォールで TCP ポート 5555 を開きます。
次に、2 番目の PC から次を実行します。
adb connect <host ip>
Android エミュレーターはデフォルトでローカル ポート 5555 をリッスンするため、リモート エミュレーターに接続する 1 つの方法は、ポート転送ツールを使用してすべての LAN パケットをローカル 5555 ポートに転送することです。
そのような優れたツールの 1 つがTrivial Port Forwardです。
コマンドは次のとおりです。
trivial_portforward.exe 1234 127.0.0.1 5555
ここで 1234 は、開発用コンピューターが接続するポート番号です。127.0.0.1 はループバック アドレスで、5555 はエミュレータのポートです。
より詳細な例については、ブログ投稿 を参照してください。
SDKを備えた2台目のマシンがありませんが、エミュレータのリッスンポート(デフォルトは5554、5555)がリッスンしている0.0.0.0
、つまりリモートマシンから到達可能でありadb --help
、コマンドが表示されていることに注意してくださいconnect <host>:<port>
。コマンドが機能するadb devices
ように表示されると思います。adb
Eclipseの場合は、「実行/構成の実行...」を試して、ターゲットを手動に設定します。これにより、「デバイスチューザー」が提供されます。これには、adbが接続されている場合にリモートエミュレーターが含まれると思います。試すだけの価値があります。