启动第一个用户级进程init进程,解析init.rc配置文件
init中做了哪些事情:
1.创建和挂载启动所需的文件目录
2.初始化和启动属性服务
3.解析init.rc配置文件并启动zygote进程
Zygote启动时做了哪些事情:
1.创建AppRuntime并调用其start方法,启动zygote
2.创建java虚拟机并为java虚拟机注册JNI方法
3.通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层
4.通过registerZygoteSocket方法创建服务器端Socket,并通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程
5.启动SystemServer进程
SystemServcer中做了那些事情:
1.启动Binder线程池这样就可以与其他进程进行通信
2.创建SystemServiceManager,其用于对系统的服务进行创建,启动和生命周期管理
3.启动各种服务(引导服务:ams,pms等,核心服务:BatteryService,DropBoxManagerService等,其他服务:CameraService,InputManagerService)
init.rc中的group配置用来配置应用所对应的权限用户组(pms会根据不同的权限分配不同的用户组),以自己配置一个service中间件为例:
通过在init.rc中的配置会在系统启动时把xiangxueservice拉起来
这里在xiangxueservice应用程序的group中配置了inet用户组
应用安装后pms会给分配一个uid可在proc目录下找到对应uid的文件
给应用声明一个权限后用户组发生变化(以internet为例)
与没有声明权限的对比,groups中多了3003用户组:
所以3003代表的是网络权限,但是在group配置是需要的是用户组的名字而不是id,该如何获取:
android_filesystem_config中声明了所有id对应的变量名称
然后在platform.xml权限映射文件中配置了每个权限对应的group用户组,所以3003用户组的用户名称是inet:
配置完group之后只是拥有了权限还是无法访问网络因为确实SELinux
不同系统如何通信(车载中android(AAOS)如何与qnx通信?):
两个系统中都需要有中间件,中间件技术用到fdbus,先要建立连接,之后服务端暴露一些接口给客户端,客户端通过接口与服务端进行通信
拓展:
通信一般采用SOA架构(面向服务架构):