首页 > 编程知识 正文

了解工作流程,工作流程和工作程序

时间:2023-05-04 02:33:24 阅读:155816 作者:4945

Zygote主要做了三件事:

调用registerZygoteSocket函数创建用于与ActivityManagerService进行通信的套接字接口;

调用startSystemServer函数启动SystemServer;

调用runSelectLoop函数进入无限循环,并在之前创建的套接字接口上等待ActivityManagerService请求创建新的APP应用程序进程

1 .系统启动脚本system/core/rootdir/init.rc文件显示用于启动Zygote进程的脚本命令。

service zygote/system/CT DMT/app _ process-xzygote/system/CT DMT---zygote-- start-system-server

套接字zygote stream 666

onrestartwrite/sys/Android _ power/request _ state wake

onrestartwrite/sys/power/state on

重新开始重新开始媒体

onrestart restart netd

前面的关键字service指示init进程创建一个名为" zygote "的进程。 此zygote进程运行的程序是/system/ctdmt/app_process,后面是传递给app_process的参数。

以下socket关键字指示此zygote进程需要名为' zygote '的socket资源。 这样,在系统引导后,您会看到/dev/socket目录下有一个名为zygote的文件。 此处定义的套接字类型是UNIX域套接字,它用于本地进程间通信

ActivityManagerService请求通过此套接字与zygote进程进行通信,以fork APP化进程。

最后一组onrestart关键字表示此zygote进程重新启动时必须执行的命令

Step 1. app_process.main

此函数是在frameworks/base/cmds/app _ process/app _ main.CPP文件中定义的。

此函数的主要作用是创建AppRuntime变量并调用其start成员函数

Step 2. AndroidRuntime.start

此函数是在frameworks/base/core/JNI/Android runtime.CPP文件中定义的。

该函数的作用是启动Android系统的运行库,主要执行三件事。 一个是调用函数startVM启动虚拟机,一个是调用函数startReg注册JNI方法,另一个是com.Android.internal.OS.zygote init类的main函数

Step 3. ZygoteInit.main

在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。

主要做了三件事。 一个调用registerZygoteSocket函数创建用于与ActivityManagerService通信的套接字接口,另一个调用startSystemServer函数创建SystemServer组件第三,调用runSelectLoopMode函数进入无限循环,并在之前创建的套接字接口上等待ActivityManagerService请求创建新的APP应用程序进程。

step4. zygote init.registerzygotesocket

在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。

此套接字接口是通过表示上述/dev/socket/zygote文件的文件描述符创建的

step5. zygote init.startsystemserver

在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。

Zygote进程使用Zygote.forkSystemServer函数创建新进程并启动SystemServer组件。 返回0的位置(如pid )是新进程运行的路径。 这意味着新创建的进程将执行handleSystemServerProcess函数

step6. zygote init.handlesystemserverprocess

在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。

Zygote进程创建的子进程继承了上一个Step 4中Zygote进程创建的套接字文件描述符,因为此处的子进程不使用它,所以在此调用closeServerSocket函数将其关闭

Step 7. RuntimeInit.zygoteInit

在frameworks/base/core/Java/com/Android/internal/OS/runtime init.Java文件中定义了此函数。

此函数执行两个操作。 一个是调用zygoteInitNative函数执行Binder进程间通信机制的初始化工作。 完成此任务后,此流程中的Binder对象可以方便地进行进程间通信。 另一种方法是调用上面Step 5中传递的com.Android.server.systemment

step8. runtime init.zygoteinitnative

在frameworks/base/core/Java/com/Android/internal/OS/runtime init.Java文件中定义了此函数。

这里调用全局变量gCurRuntime的onZygoteInit函数

Step 9. SystemServer.main

在frameworks/base/services/Java/com/Android/server/systemserver.Java文件中定义了此函数。

此处的main函数首先执行JNI方法init1,然后init1调用此处的init2函数。 在init2函数中创建一个执行某些系统密钥服务启动操作的ServerThread线程对象。

step 10.zygote init.runselectloopmode

在frameworks/base/core/Java/com/Android/internal/OS/zygote init.Java文件中定义了此函数。

调用runSelectLoopMode函数进入无限循环,并在之前创建的套接字接口上等待ActivityManagerService请求创建新的APP应用程序进程

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。