Androidシステムにおけるタッチ操作のシミュレーション機能と権限

最近、スマートフォンと車載機器間の連携機能について研究しており、いくつか不明な点がありました。特にAndroidの機能に関する質問が多く、WinCEとAndroidのフォーラムにそれぞれ投稿して専門家のアドバイスを求めました。

Androidアプリケーションから他のアプリケーションやシステムアプリケーションを制御する際のタッチ操作のシミュレーションについて、いくつかの方法が存在します。

Instrumentationを用いて画面タッチをシミュレートする場合、自アプリのインターフェース内では以下のような処理を追加しなくても正常に応答します。しかし、アプリがバックグラウンドで動作している状態で他のアプリやシステムアプリを制御しようとすると、権限が許可されないというエラーが発生します。

Root化されたデバイスで、manifestに以下の権限を追加した場合でも:

<uses-permission android:name="android.permission.INJECT_EVENTS" />  

以下の関数を呼び出してアプリにROOT権限を取得した後でも、バックグラウンドで実行中のアプリから画面タッチをシミュレートしようとすると依然としてエラーが発生します。

 1 public static boolean executeRootCommand(String command) {  
 2     Process process = null;  
 3     DataOutputStream outputStream = null;  
 4     try {  
 5         process = Runtime.getRuntime().exec("su");  
 6         outputStream = new DataOutputStream(process.getOutputStream());  
 7         outputStream.writeBytes(command + "\n");  
 8         outputStream.writeBytes("exit\n");  
 9         outputStream.flush();  
10         process.waitFor();  
11     } catch (Exception e) {  
12         Log.e("ROOT_ERROR", "デバイスはRoot化されていません。エラーメッセージ:" + e.getMessage());  
13         return false;  
14     } finally {  
15         try {  
16             if (outputStream != null) {  
17             outputStream.close();  
18         }  
19         if(process != null) {  
20             process.destroy();  
21         }  
22         } catch (Exception e) {  
23             e.printStackTrace();  
24         }  
25     }  
26     return true;  
27 }  
1 09-29 09:36:18.424: E/AndroidRuntime(1872): FATAL EXCEPTION: Thread-12  
2 09-29 09:36:18.424: E/AndroidRuntime(1872): java.lang.SecurityException: 別のアプリケーションへの注入にはINJECT_EVENTS権限が必要です  
3 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.os.Parcel.readException(Parcel.java:1353)  
4 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.os.Parcel.readException(Parcel.java:1307)  
5 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.view.IWindowManager$Stub$Proxy.injectPointerEvent(IWindowManager.java:949)  
6 09-29 09:36:18.424: E/AndroidRuntime(1872):     at android.app.Instrumentation.sendPointerSync(Instrumentation.java:937)  
7 09-29 09:36:18.424: E/AndroidRuntime(1872):     at com.example.touchapp.SocketClient$SocketReceiveThread.run(SocketClient.java:439)  
  1. 画面タッチシミュレーションの方法1
 1 // 画面タッチイベントのシミュレーション - Activity内でのみ有効  
 2 public void simulateTouchEvent(){  
 3     MotionEvent downEvent = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100,  
 4     MotionEvent.ACTION_DOWN, 100, 400, 0);  
 5   dispatchTouchEvent(downEvent);  
 6   MotionEvent upEvent = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100,  
 7         MotionEvent.ACTION_UP, 100, 400, 0);  
 8   dispatchTouchEvent(upEvent);  
 9   downEvent.recycle();  
10   upEvent.recycle();  
11 }  
  1. 画面タッチシミュレーションの方法2
1 // Activity内に追加処理不要、すべてのActivityで応答可能  
2 Instrumentation instrumentation = new Instrumentation();  
3 instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
4     MotionEvent.ACTION_DOWN, 200, 500, 0));  
5 instrumentation.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),   
6     MotionEvent.ACTION_UP, 200, 500, 0));  

この問題を解決するには、システム権限を取得するしかないようです。ネット上の情報によると、以下の2つの方法があります: (1) ソースコードからコンパイル(Linux環境が必要) (2) システム署名を手動で追加(手間はかかりますが、Linux環境不要でWindows環境で操作可能)

これらの方法にも欠点があります: この方法で生成されたプログラムは、元のAndroidシステムまたは自分でコンパイルしたシステムでのみ使用可能です。なぜなら、そのようなシステムで初めてplatform.pk8とplatform.x509.pemの2つのファイルを取得できるからです。他社製のAndroidデバイスではインストールすらできない可能性があります。

元のAndroidのキーで署名したプログラムは、エミュレータ上では正常に動作しましたが、G3にインストールすると直接以下のエラーが表示されました: "Package ... has no signatures that match those in shared user android.uid.system"。これもシステムのセキュリティを保護するための措置です。

自動化テストツールに関する情報: Androidでは、monkeyツールとmonkeyrunnerツールが利用できます。monkeyツールはデバイスまたはエミュレータ上で直接adbシェルを実行し、ユーザーおよびシステムイベントの擬似ランダムストリームを生成します。一方、monkeyrunnerツールはAPIから特定のコマンドとイベントを送信することで、ワークステーションからデバイスやエミュレータを制御します。

monkeyツールは主にストレステストと信頼性テストに使用され、ランダムに様々なキーボードイベントストリームをターゲットアプリケーションに送信し、送信回数をカスタマイズしてテスト対象アプリケーションの安定性と信頼性を観察できます。一方、monkeyrunnerはより強力で、機能テスト、回帰テストに使用でき、カスタムテスト拡張が可能で柔軟性が高いです。

ミラーリング技術の主な技術: AppleのAirPlay Mirroring インテルのWiDi AMDのAWD 3.0 WiGig連合のWiGig Silicon ImageのUltra Gig(Wireless HD) WHDI連合のワイヤレスデジタルホームインターフェース(WHDI) Car Connectivity ConsortiumのMirrorLink Miracast

これらの技術の多くは2.4GHzまたは5GHzの周波数帯を使用しており、異なる技術には異なる伝送速度とビデオフォーマットの規格があります。AirPlay MirroringはiOSおよびMacデバイスの人気により一定のシェアを獲得しています。WiDiはインテルが内蔵したノートPCプラットフォームの利点で市場に参入しています。WiGig技術の伝送速度は7Gbit/sに達し、2013年初頭にはWi-Fi連合と合併したため、今後の発展が注目されます。

タグ: Android イベントインジェクション システム権限 タッチシミュレーション

8月4日 16:11 投稿