IngressのGlyph Hackをハック中。
フレームバッファのバイナリをBitmapに変換して必要なとこだけキャプチャするのは完了。
こうして人の脳は退化していくわけですね。
ついでに自前の検出器を作成して、それがどの図柄なのかを検出するのも完了。
画面上の表示位置が変わらないし図柄がすごく単純なので、OpenCVなんて使う必要は全くありませんでした。
そしてあとは自動で絵を描くだけだ~と思ったら、後一歩のところで壁にぶつかりました。
そもそも、画面キャプチャ、検出器作成まで出来たら、あとはイージーだと思って何も調べてなかったのですが、結構厄介な問題がありました。
よそ様のアプリを操作するためにタッチイベントを生成するには、android.permission.INJECT_EVENTSが必要なのですが、こいつがいわゆるシステム権限らしくうまく動きません。
AndroidManifest.xmlで宣言しても、SecurityExceptionが発生します。
システム権限ということであれば、/system/app配下に放り込めば良いのかと考え、以下のようにしてADB Shellから無理やり放り込んでシステムアプリ化してみました。
$ adb shell $ su # mount -o rw,remount /system # cp /sdcard/AutoGlyph.apk /system/app # chmod 644 /system/app/AutoGlyph.apk # reboot
が、やはり動きません。
INJECT_EVENTSはprotectionLevelがsignatureで、公式の説明にはthe application that declared the permissionと同じ証明書で署名されていないとダメだとあります。
googleの署名じゃないとダメってことでしょうか?
もしかするとprotectionLevelがsignatureOrSystemであれば、システムアプリ化するだけでいけたのかもしれませんが。。
これはお蔵入りの予感。。
ただ、LMT Launcherとかは普通に動いてるわけで、何かやり方はあるんでしょう。
セキュリティ的には出来ちゃダメな気もしますが。
システムアプリを偽装できるのか、Input Subsystemあたりを利用するのか。
LMT Launcherのpackagenameがcom.android.lmtなのが気になりますが、それだけではダメな気がします。
う~ん。。