Androidエミュレーターによるリモートデバッグ


93

あるマシンでコード/コンパイルAndroidアプリケーションを記述し、別のマシンで起動されたエミュレータでリモートでデバッグすることは可能ですか?エミュレーターにうんざりしていて、ラップトップのCPUの半分を絶えず消費しています。

回答:


71

私は以前adb connectcmbが言及したコマンドを試したことがない(または気づいたこともない)が、自分で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を再起動する必要があります。

localhostsshコマンドのは、リモートマシンのローカルインターフェイスを指すことに注意してください。

adb devices新しいエミュレータを示しました— emulator-5554—私はそれを自分のローカルマシンで実行しているかのように使用できました。


1
Putty SSHポート転送を備えた私のWindows 7マシンからでも、魅力のように動作します。ありがとうございました。
gsbabil

1
@JimMcKeeth:上記のネットワーク構成に基づいて、Puttyを開き、[接続]> [SSH]> [トンネル]に移動します。次に、Source-port:5556およびDestination:localhost:5554のエントリを追加します。Source-port:5557とDestination:localhost:5555で同じことを繰り返します。乾杯!
gsbabil 2013

5
killall adbエミュレータは複数の接続を受け入れずoffline、ローカルマシン用であるため、サーバー上でも同様に行う必要があることに注意してください。
Henrique de Sousa

誰でも英語で説明できますか?
Anil GR

21

これがWindowsで解決した方法です。私はクリストファーのリードにほとんど従いましたが、編集することができないので、新しい答えが必要になります。

私が抱えていた問題は、ADBとエミュレーターが0.0.0.0ではなく、127.0.0.1をリッスンしていたことでした。そうでなければ、私はTCPMonを使用したでしょう。これはWindowsでは異なるか、SDKの最新バージョンで変更されたと思います。(で確認できnetstat -banます。)

  1. エミュレーターを実行するマシンにWinSSHDをインストールしました。(私はそれがfreeSSHdでも動作するはずだと思いますが、そこではログインを取得できませんでした。)

  2. Windowsファイアウォールでポート22(TCP)を開きました。(WinSSHDがそれを実行できる場合があります。)

  3. WinSSHD GUIで仮想アカウントを作成しました。

  4. 開発マシンからエミュレーターマシンへの新しいPuTTY接続を作成し、接続できることを確認しました。

  5. 次に、PuTTYでトンネリングを設定します。接続-> SSH->トンネル

    Source port: 5554
    Destination: localhost:5554
    Type: Local/Auto

    Source port: 5555
    Destination: localhost:5555
    Type: Local/Auto

    (トンネルを維持するには、PuTTYを接続して開いたままにします。)

  6. 次に、リモートマシンでエミュレータを起動し、ADBがそこで実行されていないことを確認しました。

  7. 開発マシンでADBを再起動しました(adb kill-server、次にadb start-server)。

  8. adb devicesリモートエミュレータはと表示されましたemulator-5554 device。これで、Eclipse / ADTから直接アプリをデプロイして実行できるようになりました。エミュレーターは、ローカルエミュレーターであるかのように、仮想デバイスの下に表示されました。


よくできました!詳細をありがとう。
ジムマッキース2013

1
いいですが、明確にしたいのですが、手順4の後でパテを閉じて、手順5でもう一度開き、トンネルを構成して再接続します。手順6〜8:最初にエミュレータを起動し、次に(ホストマシンで)adbを起動します。ステップ9:クライアントマシンでadbを再起動し、「adb devices」と入力して問題がないことを確認します。通常のDDMSやEclipseも同様に機能するはずです。
ミスタースミス

@MisterSmith非常に有効なポイントです。編集を送信してみませんか?:)
Henrik Heimbuerger 2014

@MisterSmithこのコメントを反映するように回答を編集してください。問題の成功にとって非常に重要です。また、ありがとうございます。ゲストマシンからホストに接続できるようになりました。
meanbunny 2015

20

私はこの質問が本当に古いことに気づきましたが、問題を少し違った方法で解決し、この簡単な解決策を理解するのにしばらく時間がかかりました。

私は通常、GUIが好きなので、フロントエンドとしてWindows7 PCまたはラップトップ(作業している場所に応じて)を使用しますが、すべての編集/コンパイル/デバッグをヘッドレスUbuntuサーバーで行うことを好みますそれが提供するコマンドラインパワー。私の目標は、追加のサービス(sshdなど)やファイアウォールの穴を開けることなく、各Windowsシステムを可能な限りシンクライアントにすることです。

だからここにシナリオがあります:

  • システムA:Androidエミュレーターが実行されているWindows7システム
  • System-B:SDKがインストールされたUbuntuサーバー

前述の問題は、システム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

System-AにAndroid SDKをインストールせずにこれを行う方法はありますか?(Windowsマシン?)
キース・トゥーンブリー、2011

いいえ。デバイスと通信するには、adbサーバーとusbドライバーがSystem-Aで実行されている必要があるためです。
Patrick McKinnon

私もこれを次のような設定で行いました:Windows 7(エミュレーターを実行中)-> Linux(ネットワークのためにホップが必要です...)-> Eclipseを実行しているOSX。「adbデバイス」でデバイスを表示し、Eclipseからエミュレーターを使用できます。問題は、エミュレータのAndroidターゲットを認識しないことです。そのため、実行するたびに手動でターゲットを選択する必要があります。
フランク

Mac OS Xのパテが必要な場合は、mac-tools.org / putty-fur-mac-os-x / 02/2012で見つけることができます。私にとっては、そのツールで動作しました。
Bruno Bieri 2013年

@PatrickMcKinnonは問題なく動作しましたが、System-Bで「adbデバイス」を呼び出すと不正になりました。System-Bの「adbデバイス」では、正常に機能していることが示されています。何か助けは?
Tejas Sherdiwala 2017

5

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

htsHttp Tunnel Serverを意味します

これらの2つのコマンドは、ポート10001および10001をリッスンし、これらのポートのI / Oを、エミュレーター(実際には最初に起動されたエミュレーター)が使用するポートであるローカルポート5554および5555にリダイレクトする2つのハーフブリッジを作成します。あなたがそれらのいくつかを実行している場合、それらはこのページの他の返信で見られるように、より高いポート番号を使用します。

  • HostEclipse、これらのものを入力してください

    htc -F 5554 HostEmulator:10000
    htc -F 5555 HostEmulator:10001

htcHttp Tunnel Clientを意味します。

これらのコマンドは、欠けているハーフブリッジを作成します。ローカルポート5554および5555をリッスンし、これらのポートのI / Oを、HostEmulatorで直前に作成したハーフブリッジにリダイレクトします。

  • 次に、引き続きHostEclipseで、次の3つのコマンドを入力します

    adb kill-server
    adb start-server
    adb devices

そうしないとリモートエミュレータが検出されないため、adbが再起動します。起動時にスキャンを実行している必要があります。そして、チェックのためにデバイス(利用可能なエミュレーター)をリストします。

  • そして、あなたは行き​​ます。

ローカルであるかのようにリモートエミュレータを操作できます。両方のマシンでCygwinターミナルを開いたままにする必要があります。そうしないと、作成したハーフブリッジを強制終了します。

ここではマシン/マシンの交換にポート10000と10001を使用しましたが、もちろん、それらがまだ使用されていない限り、他のポートを使用できます。


2

私の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>

1

提案された解決策はどれも私にとってうまくいきませんでした。私は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/ 免責事項、私は作者です。


完璧な答えと記事!Genymotionを使用する場合は、このソリューションを使用してください。この記事はWindowsとMacについて書かれていますが、ローカルのUbuntuとリモートのUbuntuがあり、すべて正常に動作します。私の週を救った!
konstantin_doncov

1

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」を実行しているマシンではない)に表示されます。


このソリューションの詳細を教えてください。私はあなたが言ったすべてを行いましたが、Android Studioの「Select Deployment Target」にデバイスがありません。2台目のコンピュータでGenymotionを使用しています。
konstantin_doncov 2018年

@ don-progコマンドラインから機能するかどうかは言いません:機能するadb -L tcp:remotehost:1234 devices場合は、Android StudioがリモートADBをサポートしているかどうかを確認する必要があります。ローカルデバイス。
android.weasel 2018

0

手元にSDKを備えた2台目のマシンはありませんが、エミュレーターのリッスンポート(デフォルトは5554、5555)がリッスンしている0.0.0.0、つまりリモートマシンから到達可能でありadb --helpconnect <host>:<port>コマンドが表示されます。私はそれはそれはに表示するだろうと仮定しadb devicesadb、コマンドがそれに取り組んでいます。Eclipseの場合、「実行/構成を実行」を試して、ターゲットを手動に設定します。これにより、「デバイスチューザー」が提供されます。adbが接続されている場合、リモートエミュレーターが含まれると思います。試すだけの価値があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.