あるマシンでコード/コンパイルAndroidアプリケーションを記述し、別のマシンで起動されたエミュレータでリモートでデバッグすることは可能ですか?エミュレーターにうんざりしていて、ラップトップのCPUの半分を絶えず消費しています。
回答:
私は以前adb connect
cmbが言及したコマンドを試したことがない(または気づいたこともない)が、自分で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を再起動する必要があります。
localhost
sshコマンドのは、リモートマシンのローカルインターフェイスを指すことに注意してください。
adb devices
新しいエミュレータを示しました— emulator-5554
—私はそれを自分のローカルマシンで実行しているかのように使用できました。
killall adb
エミュレータは複数の接続を受け入れずoffline
、ローカルマシン用であるため、サーバー上でも同様に行う必要があることに注意してください。
これが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でトンネリングを設定します。接続-> SSH->トンネル
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から直接アプリをデプロイして実行できるようになりました。エミュレーターは、ローカルエミュレーターであるかのように、仮想デバイスの下に表示されました。
私はこの質問が本当に古いことに気づきましたが、問題を少し違った方法で解決し、この簡単な解決策を理解するのにしばらく時間がかかりました。
私は通常、GUIが好きなので、フロントエンドとしてWindows7 PCまたはラップトップ(作業している場所に応じて)を使用しますが、すべての編集/コンパイル/デバッグをヘッドレスUbuntuサーバーで行うことを好みますそれが提供するコマンドラインパワー。私の目標は、追加のサービス(sshdなど)やファイアウォールの穴を開けることなく、各Windowsシステムを可能な限りシンクライアントにすることです。
だからここにシナリオがあります:
前述の問題は、システムAのエミュレーターが外部イーサネットインターフェースではなくローカルホストにバインドするため、システムBのadbがシステムAのエミュレーターにアクセスできないことです。System-BへのSSH接続用にPuTTYでリモートポート転送を設定するだけです。トリックは、2つのトンネルを作成するときに「リモート」ラジオボタンをチェックして、トンネルの方向が逆になるようにすることです(ログインしているサーバーからログインしているクライアントへのトンネリング)。
最後に、SSH接続を確立した後、システムBの「localhost」にadbで接続します。
System-B$ adb connect localhost
connected to localhost:5555
System-B$ adb devices
List of devices attached
localhost:5555 device
これで、通常どおり画像/デバッグをダウンロードできます。ラップトップを取り出してコーヒーを飲みたい場合は、別のWindowsシステムに切り替えるのは簡単です。
さらに、同じ方法でポート5037をトンネリングすることにより、実際にadbサーバー接続を転送して、システムAでUSBを介して実際のAndroidデバイスを接続し、システムBから画像をダウンロードすることができます。これが機能するためには、SSHセッションを開始する前に、adbサーバーがSystem-Aで実行されており、System-Bでは実行されていないことを確認する必要があります。
まず、システム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
2つのマシンが同じプライベートネットワークにあり、SSH暗号化を使用する必要がない場合(これは一般的なケースです)、これを行う簡単な方法を見つけました。SSHトンネルは非常に長く、インストールが難しい場合があるため、これは役立つ場合があります。たとえば、Cygwin / Windowsで初めてSSHデーモンをインストールすると、あきらめる可能性があります(まあ、あきらめました)。
Windowsの場合、以下では、httptunnelパッケージを使用してCygwinをインストールする必要があります。これはLinux / httptunnelでも動作するはずですが、私は試しませんでした。
いずれかのマシンでエミュレータを実行します(ホスト名がHostEmulatorであるとしましょう)
他のマシンでEclipseを起動します(これをHostEclipseと呼びます)。
各マシンでCygwinターミナルを開き、次に、
でHostEmulator、次のcygwinのコマンドを入力します:
hts -F localhost:5554 10000
hts -F localhost:5555 10001
htsはHttp Tunnel Serverを意味します。
これらの2つのコマンドは、ポート10001および10001をリッスンし、これらのポートのI / Oを、エミュレーター(実際には最初に起動されたエミュレーター)が使用するポートであるローカルポート5554および5555にリダイレクトする2つのハーフブリッジを作成します。あなたがそれらのいくつかを実行している場合、それらはこのページの他の返信で見られるように、より高いポート番号を使用します。
でHostEclipse、これらのものを入力してください:
htc -F 5554 HostEmulator:10000
htc -F 5555 HostEmulator:10001
htcはHttp Tunnel Clientを意味します。
これらのコマンドは、欠けているハーフブリッジを作成します。ローカルポート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>
提案された解決策はどれも私にとってうまくいきませんでした。私はEmirikolのソリューションから始めてそれを改良しました。新しいAndroid API> 21の場合、エミュレーターがオフラインで表示され、Genymotion設定に移動してAndroid SDKパスを空のままにする必要があったからです。そしてコマンドラインから:
netsh interface portproxy add v4tov4 listenport=5555 connectport=5555 connectaddress=<emulatorIP>
netsh interface portproxy add v4tov4 listenport=5554 connectport=5554 connectaddress=<emulatorIP>
ソース:http : //www.sarpex.co.uk/index.php/2016/10/02/connect-genymotion-emulator-remotely/ 免責事項、私は作者です。
adbを実行すると、サーバーのコピーがまだ実行されていない場合は、サーバーのコピーが起動されます。そのコピーをデバイスを使用してマシン上で自分で開始できます。SDK4.3以降では、サーバーにリモートマシンをリッスンするように指示する-aオプションを指定できます。終了しない次のコマンドでそれを行います:
adb -a -P 5037 server nodaemon
デバイスを使用するマシンで、環境変数のADB_SERVER_SOCKETをtcp:xxxx:5037に設定します(または-Lオプションを使用して各adb呼び出しに同じ値を指定します)。ここで、xxxxはIPアドレスまたはホスト名です。デバイスを備えたマシン、および5037は上記のコマンドで指定したポートと一致します。
これを使用して、エンドツーエンドのテストを並行して実行しているマシン、および実際のデバイスをリモートで共有したい開発者に、3台のマシンに広がる約100のエミュレータへのアクセスを提供します。
adb forwardおよびadb reverseを使用して、エミュレータとの間でポートを転送できます。ポートは、デバイスを備えたマシン(「adb forward」を実行しているマシンではない)に表示されます。
adb -L tcp:remotehost:1234 devices
場合は、Android StudioがリモートADBをサポートしているかどうかを確認する必要があります。ローカルデバイス。
手元にSDKを備えた2台目のマシンはありませんが、エミュレーターのリッスンポート(デフォルトは5554、5555)がリッスンしている0.0.0.0
、つまりリモートマシンから到達可能でありadb --help
、connect <host>:<port>
コマンドが表示されます。私はそれはそれはに表示するだろうと仮定しadb devices
てadb
、コマンドがそれに取り組んでいます。Eclipseの場合、「実行/構成を実行」を試して、ターゲットを手動に設定します。これにより、「デバイスチューザー」が提供されます。adbが接続されている場合、リモートエミュレーターが含まれると思います。試すだけの価値があります。