4

デバイスでアプリケーションを起動すると、(プログラムで)通知される必要があります。実行(起動)時にアプリの通知を受け取ることは可能ですか?

4

2 に答える 2

3

現在実行中のプロセスはActivityManager#getRunningAppProcessesで取得できます。ただし、デバイスをルート化せずにアプリケーションの起動時に通知を受け取ることは絶対に不可能です。

Android が新しいアプリケーションを開始すると、Zygote は新しいプロセスをフォークします。

static void Dalvik_dalvik_system_Zygote_forkAndSpecialize(const u4* args,
    JValue* pResult)
{
    pid_t pid;

    pid = forkAndSpecializeCommon(args, false);

    RETURN_INT(pid);
}

libdvm.so を変更して置き換えることができます。

別のアプローチ

動的にリンクされているプログラムは、動的リンカーなど、起動時に特定のファイルにアクセスします。これは、静的にリンクされたプログラムではトリガーされないため、セキュリティ上の目的には役に立ちませんが、それでも興味深い場合があります。

#include <stdio.h>
#include <sys/inotify.h>
#include <assert.h>
int main(int argc, char **argv) {
    char buf[256];
    struct inotify_event *event;
    int fd, wd;
    fd=inotify_init();
    assert(fd > -1);
    assert((wd=inotify_add_watch(fd, "/lib/ld-linux.so.2", IN_OPEN)) > 0);
    printf("Watching for events, wd is %x\n", wd);
    while (read(fd, buf, sizeof(buf))) {
      event = (void *) buf;
      printf("watch %d mask %x name(len %d)=\"%s\"\n",
         event->wd, event->mask, event->len, event->name);
    }
    inotify_rm_watch(fd, wd);
    return 0;
}

これにはルート権限が必要なため、JNI とルート化されたデバイスを使用すると、これを実行できます。

于 2013-03-02T07:42:27.053 に答える
2

いいえ、公開 SDK を使用してこれを行うことは実際には不可能です。

せいぜい、一番上にあるフォアグラウンド プロセスのActivityManagerを常にポーリングし続け、そのログを保持することができます。ただし、これは最も正確で効率的な方法ではありません。

于 2013-03-02T06:58:17.450 に答える