Android进程生命周期

bootloader引导启动内核后,内核作为pid=0的0号进程,fork出kthreadd和init两个进程。其中kthreadd是所有内核进程的祖宗,init是所有用户进程的祖宗。init fork出Zygote,这是所有Java进程的祖宗。

kernel找init的顺序是:

init启动后,做以下几件事情:

init.rc 由一个个 section 组成, 每一个 section 定义了一个 Action, 或者一个 Service。 Action 由 trigger 和 一组 command 组成。trigger 表示触发这个 Action 的条件, command 表示这个 Action 被触发后所执行的一系列动作。 Service 描述了一个服务的名字,执行路径,启动参数等信息。还可以通过 option 来约定服务的一些行为,权限等。比如是否只启动一次,服务进程的 uid, gid等。

init.rc 的所有语法介绍都可以在 Android/system/core/init/README.md 这个文件里面查找到

更多init.rc内容,可查阅 https://qiushao.net/2020/03/01/Android%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91%E8%BF%9B%E9%98%B6/init.rc%E4%BB%8B%E7%BB%8D/

也可通过trigger命令触发执行,如下图:

当init解析完init.rc后,会触发执行

属性监听:

子进程退出信号(SIGCHLD)监听:

可以通过setprop ctl.start ctl.stop 来启动或暂停某个指定服务 如setprop ctl.stop p2p_supplicant

servicemanager的特殊身份,导致如果servicemanager重启,配套的很多其他service也需要重启。

https://www.protechtraining.com/static/slides/Deep_Dive_Into_Binder_Presentation.html#slide-13

zygote 与 systemserver

https://www.codecentric.de/wissens-hub/blog/android-zygote-boot-process


Android进程管理核心组件

Activity的组织

通过命令dumpsys activity 查看四大组件上述 信息。

dumpsys activity activities查看activity的信息。

AndroidManifest.xml中可以通过组件的taskAffinity属性设置taskRecord名称。 通过android:process属性设置新的进程名称。

fork因为在多线程下可能导致死锁的局限性,如果zygote使用binder机制进行通信,当zygote调用fork时,可能会有死锁问题。故zygote不采用binder机制通信,而选择socket通信。

当zygote要启动新进程时,会使用抛出MethodAndArgsCaller的异常,而不是直接调用fork启动新进程,是因为如果直接调用fork会导致函数调用栈非常长,抛异常到顶层去fork,可以解决这个问题。

启动新Activity进程的流程

启动新Service进程的流程

结构

启动service有两种方式

startService方法启动service

bindService方法启动service

ContentProvider的创建流程

BroadcastReceiver的创建流程

设备启动时,Packager MangerService会遍历所有包,将所有reciver通过addActivity注册到ActivityIntentResolver中


TODO property 存储在哪里?

Table of Contents