この記事は
abd shellでコマンドを打ってその結果を扱う、ということをアプリ内でやりたく、その関係の処理について調べたので簡単にまとめました。
単にコマンドを実行する
try {
// $ adb shell input touchscreen tap 100 100
new ProcessBuilder("input", "touchscreen", "tap", "100", "100").start();
} catch (IOException ignored) {}
-
new ProcessBuilder("input touchscreen tap 100 100").start();
とすると、input touchscreen tap 100 100
というコマンドが実行されたとみなされ、例外が発生した。
出力を扱う
try {
// $ adb shell pm list package
execAdbCommand("pm", "list", "package");
} catch (IOException ignored) {}
/**
* adb shellのコマンドを実行し、その結果をログに出す
* @param command 実行するコマンド
* @throws IOException
*/
public void execAdbCommand(String... command) throws IOException {
Process process = new ProcessBuilder(command).start();
BufferedReader bufferedReader
= new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = bufferedReader.readLine()) != null) {
Log.i(TAG, line);
}
}
logcatのログを扱ってみる
- 自アプリのlogしか扱えなかった...(Android 4.1以降はできないよう)。
- try−catchはもっと小さいスコープでやる方がいいのでしょうが、今回は見やすさ優先して全体囲んでいます。
/**
* logcatの出力を集め、再度logcatで出力する
* @param time ログを集める時間(ミリ秒)
*/
public void outputLogcat(final long time) {
new Thread(new Runnable() {
@Override
public void run() {
try {
// logcatをクリアしておく
new ProcessBuilder("logcat", "-c").start();
Thread.sleep(time);
Process process = new ProcessBuilder("logcat", "-d").start();
BufferedReader bufferReader
= new BufferedReader(new InputStreamReader(process.getInputStream()));
// 読み込んだログをすぐ出力すると、その出力したログをまた読み込んでしまうので、
// 一旦全部保存する
List<String> logs = new ArrayList<>();
String line;
while ((line = bufferReader.readLine()) != null) {
logs.add(line);
}
for (String log : logs) {
Log.i(TAG, log);
}
} catch (IOException | InterruptedException ignored) {}
}
}).start();
}
課題
やりたかったことは、adb shell getevent -lt /dev/input/event1
の出力(タッチイベント情報)を得ることでしたが、自アプリの情報でないためなのか、取得できませんでした。
引き続き調査します。