コマンドラインからスクリーンロックを解除する

TouchUtils.clickView() とかで UI に触るようなテストを書いてみると、実行時に

java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission

とか出て失敗することがあった。 ググってみるとスクリーンがロックされているのが原因らしく、実際スクリーンロックを解除してから実行するとちゃんと通った。

エミュレータを起動した直後は必ずロックされた状態になっていて、emulator-arm -help 見てもそれを解除する方法が見当らない。 emulator-arm -no-window で起動してすべてコマンドラインで完結させたかったので解決法を考えた結果、adb 経由で Android にキーイベントを送れることがわかったので、 スクリーンロックを解除するメニューキーを押すようなキーイベントを送る方法でいけた。

あとデバイスがオンラインになるまでブロックするのは adb wait-for-device でいけるけど、デバイスがオンラインになっている状態で adb shell input keyevent 82 しても Killed と言われたりすることもあって、 よくわからないけど Killed が出なくなるまで送り続けるようなスクリプトを書いて実行するようにしてる……

https://gist.github.com/3092913