Android アプリ内のウィジェットを識別し、クリックするとそのプロパティを表示するツールに取り組んでいます。これを正常に実行できるスタンドアロン ツールを作成しましたが、スタンドアロン ツールを最終製品にパッケージ化するために必要な Eclipse プラグインに変換する際に問題が発生しています。
ツールが動作する方法は、最初に透過オーバーレイ アプリケーションがエミュレータ上で実行されることです。このアプリケーションは、ユーザーが画面を押した座標を収集し、Android ログに書き込みます。次に、テスト対象のアプリケーションをエミュレータ上で起動します。
Adb logcat は、標準入力として、ウィジェットの識別を処理する monkeyrunner スクリプトにパイプされます。リアルタイムで、monkeyrunner スクリプトは logcat 入力を解析して座標プレス情報を取得します。monkeyrunner スクリプトは AndroidViewClient (https://github.com/dtmilano/AndroidViewClient ) を使用します。これは、画面上のすべての View オブジェクトとそれらのプロパティをリストできるツールです。座標プレス情報を使用して、ビューのリストから正しい座標プロパティを持つビューが選択され、そのプロパティが出力されます。
私が抱えている問題は、Eclipse/Java のコンテキスト内で、logcat 出力のモンキーランナー スクリプトへのパイピングを処理しようとしたことに起因しています。adb logcat と monkeyrunner を別々の同時プロセスで実行し、logcat の InputStream を monkeyrunner の OutputStream に転送すると、monkeyrunner が座標情報を入力として受け取ることがないため、ロックの問題があるようです。ストリーム ハンドラも別のスレッドに配置しようとしましたが、これは効果がありませんでした。
並行プロセスが問題の原因となる場合があるため、monkeyrunner 内で直接 logcat から読み取ることを考えました。これにより、メイン プロセスは 1 つだけになりました。monkeyrunner 内で、エミュレーターとの接続が確立されると、エミュレーターで adb シェルを開くことができます (https://developer.android.com/tools/help/MonkeyDevice.html#shell)。Logcat はかなり一般的な adb コマンドですが、device.shell("logcat") を実行すると失敗します。
[main] [com.android.chimpchat.adb.AdbChimpDevice] Error executing command: logcat
と
[main] [com.android.chimpchat.adb.AdbChimpDevice]com.android.ddmlib.ShellCommandUnresponsiveException –
残念ながら、私の Google スキルでは、この問題の解決策を見つけることができませんでした。