OSXマシン(iOSとAndroidの両方にも使用)からの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を所有しないようにするために、ユーザー起動デーモンから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デバイス」を実行し、それを開いたままにしておきます。