2013-03-02 44 views

回答

2

不,这不是真的可以使用公共SDK。

最好的情况是,您可以不断地继续轮询ActivityManager以查找顶级的前台进程,并保存日志。但是,这并不是最准确或有效的方法。

3

您可以通过ActivityManager#getRunningAppProcesses获取当前正在运行的进程。但是,当应用程序启动而不让设备植根时,通知绝对不可能。

当安卓开始一个新的应用程序,受精卵将一个新的进程:

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

    pid = forkAndSpecializeCommon(args, false); 

    RETURN_INT(pid); 
} 

您可以修改和替换libdvm.so。

Another approach

其动态链接将要访问的启动某些文件,如动态连接器的任何程序。这将是无用的,安全的目的,因为它不会在静态链接程序触发,但仍可能会感兴趣:

#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; 
} 

这需要root权限,所以用JNI和扎根设备,你就可以去做这个。

相关问题