天天看点

Android APP线程是由谁创建的

通过老罗的《Dalvik虚拟机进程和线程的创建过程分析》知道Android APP线程是通过pthread_create创建的。这就意味着新创建线程的父亲是pthread_create的调用者,而非zygote。

我以前一直以为所有APP进程或线程都是通过zygote创建出来的,因为通过ps或proc文件可以看到所有APP的父亲都是zygote,这怎么解释呢?

搜索了好久,没有找到相应的解释,就索性read the fucking code,其实还蛮好读懂的。

Android的C库是其独立开发的bionic,查阅了下,有n多好处,这不是重点。

找到pthread_create的实现,可以知道pthread_create是通过调用__pthread_clone完成的,且其入参flags赋值为CLONE_FILES| CLONE_FS | CLONE_VM | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM,包含CLONE_THREAD。

__pthread_clone定义在/bionic/libc/arch-arm/bionic/clone.S

看其代码,貌似通过汇编完成__NR_clone的系统调用。这里不再细究。

内核clone的处理过程中有个关键的函数

copy_process,其中有如下处理:

         if(clone_flags & (CLONE_PARENT|CLONE_THREAD)) {

                   p->real_parent= current->real_parent;

                   p->parent_exec_id= current->parent_exec_id;

         }else {

                   p->real_parent= current;

                   p->parent_exec_id= current->self_exec_id;

         }

ppid的本质就是task的real_parent。

同时,在copy_process中,子进程线程继承了父进程的cgroup属性。

从这里我们可以明确知道,Android APP线程的parent属性继承了其父的parent的属性。

继续阅读