Android マニフェストで「エクスポート」と宣言されているサービスを実装した Android アプリケーションがあります。このエクスポートされたサービスを開始しようとしているこのデバイスには、さまざまなアプリケーションが多数インストールされています。それらはすべて、このコードを使用して、エクスポートされたサービスを開始しています。
MY_ACTION = "com.phantom.foobar.action.xyz"
PACKAGE_NAME = "com.phantom.foobar"
CLASS_NAME = "com.phantom.foobar.IpcService"
public static void startSaveUrlAction(Context context, String foo, String bar) {
Intent intent = new Intent(MY_ACTION);
intent.setClassName(PACKAGE_NAME, CLASS_NAME);
intent.putExtra(FOO, foo);
intent.putExtra(BAR, bar);
context.startService(intent);
}
マニフェスト ファイルのアプリケーション タグ内のサービスの説明:
<service
android:name=".IpcService"
android:exported="true" />
問題は、起動できるアプリケーションと起動できないアプリケーションがあることです。そのサービスを開始できないアプリケーションの logcat 情報は次のとおりです。
01-02 16:04:05.574 1385 2698 W ActivityManager: Unable to start service Intent { cmp=another.music.player/com.phantom.foobar.IpcService } U=0: not found
01-02 16:04:05.575 1385 2699 W ActivityManager: Unable to start service Intent { cmp=another.music.player/com.phantom.foobar.IpcService } U=0: not found
私が間違っていなければ、{ cmp=another.music.player/com.phantom.foobar.IpcService }
これは で構成されるコンポーネント名です{ cmp = package_name/class_name }
。PACKAGE_NAME
asを指定しましcom.phantom.foobar
たが、間違った意図を開始しようとしています。この場合、another.music.player
エクスポートされたサービスを開始しようとしているアプリケーションのパッケージ名です。
これは、一部のアプリケーションでのみ発生します。なぜこれが起こっているのか知りたいです。アプリケーションがパッケージ外でインテントを開始するのを防ぐことができる属性または何か(Androidマニフェストで設定できるある種の属性)はありますか?
抽象化された詳細:
他のアプリケーションのメソッドをフックできる Xposed Framework を使用しています。Android API からメソッドをフックしました。そのメソッドが他のアプリケーションで呼び出されるたびに、そのアプリケーションから情報を抽出し、そのコンテキストを使用してエクスポートされた IntentService を開始com.phantom.foobar
し、上記の関数を使用してアプリケーションに情報を渡します。