通過老羅的《Dalvik虛擬機進程和線程的創建過程分析》知道Android APP線程是通過pthread_create創建的。這就意味着新創建線程的父親是pthread_create的調用者,而非zygote。
我以前一直以爲所有APP進程或線程都是通過zygote創建出來的,因爲通過ps或proc文件可以看到所有APP的父親都是zygote,這怎麼解釋呢?
搜索了好久,沒有找到相應的解釋,就索性read the fucking code,其實還蠻好讀懂的。
內核clone的處理過程中有個關鍵的函數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的系統調用。這裏不再細究。
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的屬性。