実行中のアクティビティにタッチスクリーンイベントを挿入できるサービスをバックグラウンドで実行するアプリケーションを作成しようとしています。 Instrumentation.sendPointerSync(motionEvent);
を呼び出すことで、アプリケーションの一部であるアクティビティにイベントを注入できます。ただし、実行中のアプリケーションからアクティビティなしでこれを行おうとすると、「持っていない」という許可エラーが表示されます。 INJECT_EVENTS許可。この許可をマニフェストに次のように追加しました:<uses-permission Android:name="Android.permission.INJECT_EVENTS"></uses-permission>
それでも同じ許可例外がスローされます。少し検索して、INJECT_EVENTS許可を受け取るには、システムが署名されているのと同じ署名でアプリに署名する必要があるという答えが得られました。しかし、これが正確に何を意味するのかはわかりません。カスタムromを見つけてビルドし、アプリケーションが署名されているのと同じ署名で署名する必要があります。次に、デバイスにカスタムROMをインストールし、アプリをインストールすると、タッチイベントを正しく挿入できますか?この場合、次のように既にまとめられているカスタムROMから始める方が良いでしょう このページから それとも、gitのコピーを取得する必要がある状況ですか? Android myslefをプロジェクトしてビルドしますか?そして、いずれにせよ、これを実現するために適切な方向で作業できるように私を指すことができる場所を知っていますか?
実際、これはルート化されたデバイスでは非常に簡単です。/systemで実行されているアプリは、必要な権限にアクセスできると思います。そのため、手動でアプリを/ systemに手動でインストールします(ここで説明されているように http://androidforums.com/droid-all-things-root/64603-installing-apk-system-app-directory.html ) :
端末エミュレータで次のコマンドを実行して、/ systemディレクトリを読み取り/書き込みとして再マウントし、SDCARDから/ system/appディレクトリにアプリケーションをインストールします。
su
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
cp /sdcard/APP.apk /system/app
コンピューターからadbを使用する場合は、次のコマンドを実行します。
adb remount
adb Shell cp /sdcard/APP.apk /system/app
このプロセスを簡素化するために、数人のユーザーがGoogleマーケットプレイスのルートエクスプローラーを利用しています。
または、これを確認してください: コンパイル方法Androidシステム権限を持つアプリケーション
separateプロセスにイベントを注入するには、both installアプリを/ system/app and signシステム証明書付きのAPK。
<uses-permission Android:name="Android.permission.INJECT_EVENTS"/>
これには、電話で実行されるシステムの構築に使用されるGoogleキーを使用してキーストアを構築するために、AOSPソースが必要です。
AOSPディレクトリがある場合、@ Eliは 'keytool-importkeypair'という素敵なスクリプトを使用してキーストアを構築する方法を示す優れた仕事をします。
例としてIntelliJを使用して、[ビルド]メニューから[署名付きAPKを生成...]を選択します。上記で作成されたキーストアを見つけ、指定されたパスワード(Androidなど)を入力し、必要に応じてキーに同じパスワードを入力します。署名されたapkは、通常の場所(./out/production//)ではなく、プロジェクトルート(!)に書き込まれることに注意してください。
adb root
adb remount
adb Push MyApp.apk /system/app
「インストール」は自動的に行われます。ただし、通常のアプリのインストールプロセスとは異なり、APKのネイティブライブラリはnot/ system/lib /にコピーされます。 NDKを使用して独自のネイティブライブラリをビルドして呼び出す場合は、手動で行う必要があります。
タッチイベントの使用:
次に、証明書を生成します。
./keytool-importkeypair -k google_certificate.keystore -p Android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
次に、Eclipseからアプリをエクスポートし、生成した新しい証明書で署名します
API 18からはUiAutomationクラスがありますが、これはユーザーのアクセス許可にバインドされていません。
詳細については、 http://developer.Android.com/reference/Android/app/Instrumentation.html#getUiAutomation() を参照してください
この署名レベルの権限をバイパスするソリューションを探している人がいて、タッチイベントを作成したい場合
ソースをC++レベルまで見て、アプリがタッチイベントを作成できるかどうかを実際にチェックします。以下は、アプリを許可するかどうかを実際にチェックする関数です。
bool InputDispatcher::hasInjectionPermission(int32_t injectorPid, int32_t injectorUid) {
return injectorUid == 0
|| mPolicy->checkInjectEventsPermissionNonReentrant(injectorPid, injectorUid);
}
そのため、関数は、アプリのユーザーIDが0に設定されている場合にtrueを返します。
ファイル/data/system/packages.xml
を編集して、アプリのuidを0に変更しました。このファイルには、すべてのアプリに割り当てられたuidが含まれています。アプリに対応するuserId
属性を0に設定して、このファイルを編集します。
必要なのは、アプリを強制的に閉じて、再起動することだけです。 INJECT_EVENTS
権限をバイパスできます。