
这次我们来聊一聊系统相关服务,比如Zygote启动原理,SystemServer启动原理,如何进行添加一个系统服务等。
熟悉这些Android 底层知识更好的方便我们进行代码运行时,出现异常进行分析,每次堆栈信息都是从init进程开始,然后zygote进程,之前一直面对这些信息,都摸不着头脑,如果知晓这些相关信息,更好的让我们对整个应用的启动有了更深入理解,不再简单的停留在应用层上面。
先来说一下Zygote进行相关原理
那Zygote进程有什么作用
SystemServer (因为需要Zygote 中的一些资源比如:常用类,JNI函数,主题资源,共享库)它有个启动三段式:进程启动->准备工作->Loop
Init 进程->加载配置文件init.rc,配置文件定义那些服务需要启动->通过fork与execve 系统调用来启动Zygote进程
pid=0来判断是子进程还是父进程,为0是子进程) fork+handlerfork+execve(sigchid)
Zygote进程死亡,init进程就会收到这个信号,来重新启动Zygote进程Zygote的Native世界 JNI函数fork创建SystemServer进程socket通信进入Loop循坏,当有新的请求,去处理,参数列表通过AMS进行跨进程发送,在子进程进行执行ActivityThread.main()函数Zygote 注意细节Zygote fork 要单线程,避免线程死锁,状态不一致Zygote 的IPC没有采用binder(binder在应用程序进程启动之后创建的binder机制),采用的是本地Socket通信zygote 比 service manager先启动;从这个意义上,他没有 service manager可以注册,所以没法用 binderinit 进程启动的,就算先启动 service manager,也不能保存 zygote 起来的时候 service manger 就已经初始化好了(这就需要额外的同步,太麻烦)socket的所有者是 root,group是system,只有系统权限的用户才能读写,这又多了一个安全保障(注意,这个 socket 是 Unix 域 Socket,不是 internet 域 Socket)说完Zygote 进程启动,我们在说一下Android 系统启动流程,这里面就包括了SystemServer的启动流程,就不单独的讲一下
init进程通过fork方式创建Zygote进程jni函数SystemServer进程并启动Socket的Loop循环SystemServer的main方法只调用了SystemServer的run方法
Looperliandroid_servers.socontextAMS、PowerManagerService与PackageManagerService等服务DropBoxManagerService、BatteryService等CamerManagerService、AlarmManagerService、WindowManagerService等Binder线程池,可以与其他进程通信SystemServiceManager,用于对系统读物服务进程创建,启动与生命周期进程管理publishBinderService方法中最终将Binder函数注册到了ServiceManager中(AMS,PMS,DisplayThread显示,FgThread前台任务,ioThread耗时任务,UIThread负责Ui线程->这里是子线程)SystemServer进程启动创建了ServiceManager,那我们就有必要再来讨论一下ServiceManager相关知识
ServiceManager发起一个binder调用,需要两个参数服务名称及服务实体对象ServiceManager的binder对象ServiceManager发起一个binder调用,带service名称就可以通过getSystemService传入一个服务名称进可以获取,内部通过hashMap的key值进行获取,判断缓存中是否有service,没有就创建,缓存作用是在系统启动的时候预支一些服务放进去,后面再启动的时候并没有放入缓存中
addService方法进行注册,在SystemService启动时候进行注册系统服务 binder机制Loop循环SystemService中服务,还是单独的进程系统服务,都需要在ServiceManager中进行注册,才能够使用服务binder loop中循环最后我们再聊一下系统服务与binder服务区别
systemService中启动,跑在binder线程中,做一些初始化操作,当client客户端有请求操作,在binder线程池中分发请求给对应的binder实体对象来进行处理,处理完再发送回复给客户端系统服务注册,都需要给binder实体对象注册到ServiceManager中,只有系统服务才可以注册
应用服务,应用端发起调用,给AMS,判断是否注册,注册,回调binder返回给应用,没有再进行binder注册,再回调给应用
getSystemService进行获取,内部缓存,hashmapbindService进行绑定,然后进行调用