Android開発のために継続的インテグレーションサーバーをセットアップしています。ADBの デバイスを待機しています 問題がすぐに発生しました。
参考までに、私たちはすでにadb kill-server
、adb start-server
、adb devices
などの多くの組み合わせを試して、役に立たなかった。
残念なことに、インターネット上で見つけたのは「デバイスの取り外しと再接続」のバリエーションですが、これは明らかに私たちにとっての解決策ではありません(CIサーバーの前に人間が座ってデバイスを取り外したり再接続したりする余裕はありません。各ビルド)。
少し背景として、iOSのCIも実行するため、MacではJenkinsを使用します。
問題に取り組みながら、OSレベルでデバイスが見つかれば、それは少なくとも始まりだと思いました。実際、system_profiler SPUSBDataType
のようなコマンドを実行すると、ADBが正常に動作しているときに報告するシリアル番号を含むデバイスが正常に検出されます。
私はすべてのUSBアクティビティを「更新」するために、いくつかの不道徳なコマンドを試みましたが、どこにも行きませんでした。デバイスをマウント/アンマウントできるというわけではありませんが、正直なところ、問題がどこにあるのかさえわかりません。Macはもちろん、低レベルのUSBプロトコルについても十分に知りません。私の ADBソースコード の潜入は、非常に長いショットでした。
したがって、この時点で、CIサーバーでAndroid=を実行できるようにするソリューションの準備は万端です。Jenkinsの各ジョブの前にいくつかのコマンドを実行し、ADBやその他のブラックマジックにパッチを適用してください。騙す。
それを解決する方法を見つけたので、完全にするためにここに投稿してください。これがbestの解決方法であると言っているわけではありませんが、私たちにとっては有効です。
そのため、CIが長時間(数時間の範囲内)非アクティブになった後に問題が発生することに気付きました。そこで、10秒ごとにadb devices
を呼び出す簡単なスクリプトを作成しました。そして問題はなくなり、「デバイスを待つ」問題はなくなりました。
Linuxでは、単純なcron
ジョブでこれを実行でき、OSXではlaunchctl
で実行できます。また、Windowsで同等のものがあると確信しています。
いずれにしても、10秒ごとにデバイスに「ping」を実行することで解決しました。
助けられた電話でUSBデバッグを有効にする(設定=>開発者オプション)。
Android OSXマシンのデバイス(iOSとAndroidの両方にも使用))の継続的インテグレーション環境でいくつかの同様の問題がありました。
問題は、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を実行するだけです。
<?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デバイス」を実行し、開いたままにしておきます。
プログラム可能な電源タップを使用して、各テストを実行する前にUSBハブを再起動することで、これを解決しました。これは、USBケーブルを抜いて再び差し込むのと同じでした。
juan-delgadoによる優れた提案をフォローアップしたかっただけです。 MacOS High Sierraで、adb
コマンドを使用してwatch
を10秒ごとに実行することも、迅速な回避策として効果的であることがわかりました。
watch -n 10 adb -d devices
これにより、.plist
ファイルの作成を回避できますが、明らかな欠点は永続的な解決策ではないことです。 watch
コマンドは、以前のバージョンのOSXで使用できるため、そこでも有効です。
USBケーブルを交換してここで解決