ADBの「デバイス待ち」問題の回避


9

Android開発用の継続的インテグレーションサーバーをセットアップしており、デバイスの問題を待つ ADBにすぐに遭遇しました。

記録のために、我々はすでにの組み合わせをたくさん試してみたadb kill-serveradb start-serveradb devices無駄に、など。

残念なことに、インターネット上で見つけたのは「デバイスの取り外しと再接続」のバリエーションですが、これは明らかに私たちにとっての解決策ではありません(CIサーバーの前に人間が座ってデバイスを取り外したり再接続したりするのを惜しむことはできません。各ビルド)。

少し背景として、iOSのCIも実行するため、MacではJenkinsを使用します。

問題に取り組みながら、OSレベルでデバイスが見つかれば、それは少なくとも始まりだと思いました。実際、のようなコマンドをsystem_profiler SPUSBDataType正常に実行すると、ADBが正常に動作しているときに報告するシリアル番号など、デバイスが見つかります。

私はすべてのUSBアクティビティを「更新」するために、いくつかの不自然なコマンドを試みましたが、どこにも行きませんでした。デバイスをマウント/アンマウントできるというわけではありませんが、正直なところ、問題がどこにあるのかさえわかりません。Macはもちろん、低レベルのUSBプロトコルについても十分に知りません。私のADBソースコード潜入は、非常に長いショットでした。

したがって、現時点では、CIサーバーでAndroidを一貫して実行できるようにするソリューションに耳を傾けています。Jenkinsの各ジョブの前にいくつかのコマンドを実行し、ADBまたはその他の黒魔術にパッチを当てます。

回答:


9

それを解決する方法を見つけたので、完全にするためにここに投稿してください。これがそれを解決する最良の方法であると言っているわけではありませんが、私たちにとってはうまくいったことに注意してください。

そのため、CIが長時間(数時間の範囲内)非アクティブになった後に問題が発生することに気付きました。そこでadb devices、10秒ごとに呼び出す簡単なスクリプトを作成しました。そして問題はなくなり、「デバイスを待つ」問題はなくなりました。

Linuxではこれを簡単なcronジョブで、OSXではこれを行うことができlaunchctl、Windowsでも同等の機能があるはずです。

いずれにせよ、10秒ごとにデバイスに「ping」を実行することで解決しました。


1
ありがとう!同じ問題が発生していたようです。USBケーブルを抜き差しすると、デバイスがリストに表示されます。
ホルヘペドレット2014

5

助けられた電話でUSBデバッグを有効にする(設定=>開発者オプション)。


1

OSXマシン(iOSとAndroidの両方にも使用)からのA​​ndroidデバイスとの継続的インテグレーション環境にいくつかの同様の問題がありました。

問題は、Jenkinsにadbサーバーの起動を許可していることです。Jenkinsのジョブは、存在するシェルと存在しないシェルに関連付けられているため、問題が発生します。Jenkinsがadbデーモンを「adbデバイス」呼び出しで開始する場合(たとえば)、adbデーモンはいくつかの短期間のJenkinsシェルによって所有され、そのシェルの実行が終了して終了すると、adbデーモンはクリーンアップされます。 、それが別のadb呼び出しによって自動的に起動されるまで。これにより、adbデーモンの起動と停止のサイクルが発生しますが、必要なのは、デーモンが無期限に稼働し続けることです。

これを修正する1つの方法は、CIマシンで開いたままになっているシェルから「adbデバイス」を実行することです。実行後にこのメッセージが表示されるかどうかによって、それが親プロセスであるかどうかがわかります

blah$ adb devices
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
List of devices attached
xxxxxxxxxxx          device

これは、マシンを再起動するたびに実行する必要がある厄介な手順です。誰かがそのコマンドウィンドウを閉じた場合は、前の問題に戻ります。

理論的には、起動時に.plistファイルを作成してadbデーモンをトリガーすることをお勧めします。次に例を示します:〜/ Library / LaunchAgents / server.adb.plist。これは基本的に、Jenkinsがadb start-serverを所有しないようにするために、ユーザー起動デーモンからadb start-serverを実行するだけです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>server.adb</string>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Shared/Jenkins/android-sdk/platform-tools/adb</string>
        <string>start-server</string>
    </array>
  </dict>
</plist>

ただし、これの問題は、adbを開始するだけでブロックされないため、KeepAlive起動制御機能を使用できないことです。また、それは望ましい目的のために機能していないようです。「デーモン」モードでadbを実行する方法を知っていて、それが戻らない場合は、このlaunchctlメカニズムを設定して、それが停止した場合に自動的に再起動し、Jenkinsが所有権を取得しないようにすることができます。まあ、今のところ、シェルウィンドウで「adbデバイス」を実行し、それを開いたままにしておきます。


1

プログラム可能な電源タップを使用して、各テストを実行する前にUSBハブを再起動することで、これを解決しました。これは、USBケーブルを抜いて再び差し込むのと同じでした。


もっと説明できますか?
Dinesh 2017

1

私はフアン・デルガードによる素晴らしい提案をフォローアップしたかっただけです。MacOS High Sierra adbで、watchコマンドを使用して10秒ごとに実行することも、迅速な回避策として効果的であることがわかりました。

watch -n 10 adb -d devices

これにより、.plistファイルの作成を回避できますが、明らかな欠点は永続的な解決策ではないことです。このwatchコマンドは、以前のバージョンのOSXで使用できるため、そこでも有効です。


watchmacOS Catalina はありませんでしたが、で簡単にインストールできましたbrew install watch
mokagio

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