Android 四大组件 - 进程的 fork 创建过程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 四大组件 - 进程的 fork 创建过程相关的知识,希望对你有一定的参考价值。

参考技术A

相关文章链接:

  

  1. android Framework - 学习启动篇 

    2. Android 系统服务 - AMS 的启动过程 

    3. Android 系统服务 - PMS 的启动过程 

    4. Android Framework - 开机启动 Zygote 进程 

  

 相关源码文件:

  

 无论是点击桌面图标调用 startActivitySafely 还是直接调用 startActivity 在源码中都是调用的 startActivityForResult 方法。由于 Activity 的启动流程有些复杂,因此本文先从进程的 fork 创建过程来入手分析。

  

 activity 的启动过程中会掉用 startSpecificActivityLocked 方法,首先会根据 processName 和 uid 来判断进程是否有创建,如果没有创建进程则需要先创建进程,processName 默认情况是包名,uid 是由 PMS 在启动的过程中解析计算好的,其具体的计算赋值过程可以参考 《Android 系统服务 - PMS 的启动过程》 

  

 如果当前进程没有创建,则调用 Process 的 startViaZygote 方法去创建进程,就是向 Zygote 进程发起创建进程的请求,这里跨进程通信采用的是 Socket 套接字的方式。注意,其中有一个重要的参数 entryPoint 是 android.app.ActivityThread 。

  

 Zygote 启动后会循环处理客户端发过来的请求,当接收到请求后会调用 ZygoteConnection 的 runOnce 方法,解析到客户端的参数后会调用 native 底层的 fork 的方法,至此进程才真正创建完毕。进程 fork 完毕后,Zygote 进程会将信息返回给 AMS,新创建的进程会调用 commonInit 、nativeZygoteInit 和 applicationInit 三个核心方法:

  

 进程 fork 后会执行 ActivityThread 的 main 方法,该方法又会向 AMS 发起绑定 IApplicationThread 请求,这里 IApplicationThread 是一个可以跨进程通信的 Binder 对象,然后 AMS 又会调用 IApplicationThread 的 bindApplication 方法去创建应用的 Application,等应用的 Application 创建完毕后,才会真正的开始创建启动 Activity 。

  

 视频地址: https://pan.baidu.com/s/1tB9hDc_6Aw_L0pgtbAU8Sw

 

   视频密码:6fzw

以上是关于Android 四大组件 - 进程的 fork 创建过程的主要内容,如果未能解决你的问题,请参考以下文章

不为人知的IPC

2016-05-10Android四大组件之Service

2016-05-10Android四大组件之Service

Android深入四大组件应用程序启动过程

Android IPC通信机制之一

Android 四大组件 Service 服务