Android 実機のみでタッチイベントを発生させる

Uncategorized
803 words

Androidの自動化アプリを作りたくて、色々試してみたので備忘録します。

まず結論から。

スマホ単体では実現できませんでした。

セキュリティの問題で、普通のアプリには権限が付与されていないみたいです。

rootアプリやシステムアプリなら出来るんですが、それだと敷居が高いので今回は対象外です。

それを踏まえたうえでご覧ください。

方法1

パソコンから 「input touchscreen」コマンドを投げる。

言わずと知れた方法ですね。

検索するとたくさん出てきます。

Android と パソコンを USBデバッグ で繋いで adb で shell を実行します。

1
./adb shell input touchscreen tap x y

この方法は、前回 Python でやっているので割愛です。

方法2

Android アプリ内で Shell コマンドを実行する。

Android は Java で動いているので、Runtime.exec() で 別プログラムが実行できます。

なので、exec で 「input touchscreen tap x y」をやって上げれば クリック出来るんじゃないかと思います。

出来ませんでしたけどね。

エラーにならないで、空振りしている感じです。

試しにアプリを作ってみました。

https://github.com/noitaro/ShellTest

adb shell から投げれるコマンドを アプリ内から直接実行してみました。

1
./adb shell pm list packages

これで、行ける!!

って思ったんですが、そうは問屋が卸しません。

アプリがハングアップしました。

方法3

1+2のハイブリッド型

アプリだけで完結出来ないので、1+2のハイブリッド型で実装します。

まず最初に、パソコンから adb shell を使って Input Host Server を立ち上げます。

次に、アプリから Input Host Server にタッチ情報を送ってデバイスをタップさせます。

欠点は、初めに一度だけ、パソコンと繋いで Input Host Server を立ち上げないと行けないことですね。

でもまあ一度立ち上げてしまえば、アンドロイドを再起動するまで使えるので、いいんじゃないでしょうか。

よくないか。

物は試しでアプリにしました。

https://github.com/noitaro/ResetMara

Input Host Server 開始

APK を入れたら、パソコン側から adb を使って Shell 権限で実行させます。

1
2
./adb shell
sh -c "CLASSPATH=/data/app/com.example.resetmara-1/base.apk /system/bin/app_process /system/bin com.example.resetmara.InputHost"

ちなみに CLASSPATH はインストールした端末毎に違います。

調べ方は pm コマンドでパッケージパスを投げると返ってきます。

1
./adb shell pm path com.example.resetmara

この部分は、起動ツールでも作ろうと思います。

今はとりあえずコマンドを直叩きします。

アプリの TAP ボタンを押す

したらば、Input Host Server に タップ情報が投げられて、Input Host Server が実機をタップします。

ちゃんと指定した箇所がタップされています。

おわりに

とりあえず、やりたいことのやり方が分かりました。

次は、今回のことを踏まえて、Android アプリでマクロを組めるようにしてみたいと思います。

参考サイト

https://qiita.com/siy1121/items/71fadad0c3a1aa085867

https://qiita.com/siy1121/items/9e96cb1eb14d9090a2b6