一入源码深似海,查看源码的思路还是要以追踪函数调用栈为主,不要看某个源码文件的整个分析,不然会搞得完全云里雾里。
1.当没有此进程相关的打印的时候试一下下面的指令,可以调低打印等级
adb shell setprop persist.log.tag V
2.zygote进程是第一个java进程,其执行流程为
int main(int argc, char* const argv[])---->E:\AndroidSrc\pie\frameworks\base\cmds\app_process\app_main.cpp
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);---->E:\AndroidSrc\pie\frameworks\base\core\jni\AndroidRuntime.cpp
jclass startClass = env->FindClass(slashClassName);//获取ZygoteInit类的类型
env->CallStaticVoidMethod(startClass, startMeth, strArray);//调用ZygoteInit.java的静态函数main ,正式进入java的世界
public static void main(String argv[])--->E:\AndroidSrc\pie\frameworks\base\core\java\com\android\internal\os\ZygoteInit.java
zygoteServer.registerServerSocketFromEnv(socketName); --->E:\AndroidSrc\pie\frameworks\base\core\java\com\android\internal\os\ZygoteServer.java
private static Runnable forkSystemServer(String abiList, String socketName,ZygoteServer zygoteServer)--->E:\AndroidSrc\pie\frameworks\base\core\java\com\android\internal\os\ZygoteInit.java
pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid,parsedArgs.gids,parsedArgs.runtimeFlags, null,parsedArgs.permittedCapabilities,parsedArgs.effectiveCapabilities);------>E:\AndroidSrc\pie\frameworks\base\core\java\com\android\internal\os\Zygote.java
caller = zygoteServer.runSelectLoop(abiList);---->E:\AndroidSrc\pie\frameworks\base\core\java\com\android\internal\os\ZygoteServer.java
caller.run();//Android应用进程会走到这儿,执行相应的命令