以前作過一個給客戶apk進程開放cap_net_raw權限的事情,爲了客戶能用本身的方法抓取tcp/ip包,對android的fork有了一些瞭解android
首先這個apk進程是zygote fork的,zygote進程的權限包含了cap_net_raw,但fork後android對apk的permission作了重寫經過setcapabilities(),這時只須要在重寫時加上這個cap_net_raw權限便可app
這裏先介紹一下流程tcp
fork fork fork函數
1,swapper -- swapper -- swapper線程
-- init -- initrest
-- service~進程
-- zygote -- zygoteip
-- apkci
-- kthreaddit
2,第一次fork,kernel/init/main.c
rest_init->kernel_thread()->do_fork(clone_vm),kthreadd和init共享swapper的地址空間,可是kernel_init執行do_execve去alloc進程地址空間mm_struct;
第二次fork,android/system/core/init/service.cpp,解析並啓動init.rc
bool Service::Start()->fork();
第三次fork,android/frameworks/base/core/jni/com_android_internal_os_Zygote.cpp
static pid_t ForkAndSpecializeCommon()->fork()
3,對於kthreadd,kernel要建立新進程時,會把該進程放到kthread_create_list中由kthreadd進程建立出來
4,再說一下fork函數,fork()->clone()->do_fork(),do_fork()中徹底copy父進程(子進程會建立本身獨立的進程地址空間),只是子進程返回pid=0,父進程返回子進程的pid,以此來區分
5,進程和線程的區別,就是是否有獨立的地址空間;因此內核線程的建立(kernel_thread())最終都是調用do_fork(clone_vm)來共享地址空間,用戶線程的建立(pthread_create())最終也是調用do_fork(clone_vm);而用戶進程的建立(fork())調用do_fork(),其中會新alloc本身獨立的進程地址空間;