android Framework知识点简记

一、开机启动 init进程执行

init进程解析init.rc文件,将信息存放到service、on、import的三个链表中,使用fork机制启动各个服务进程,使用epoll机制守护各个服务进程,当某个核心服务挂掉之后,soket会发送一个1字符,init进程会受到这个字符,并且拿到这个服务进程的pid,然后去service链表里面查询servie信息,然后启动service。 (核心服务进程举几个例子,serviceManager, mediaservice, surfaceflinger, zygote,bluetooth)

二、启动zygote进程 (app_main.cpp)

1、启动虚拟机(AndroidRuntime.cpp)
2、注册jni函数(AndroidRuntime.cpp)
3、通过jni启动java的com.android.internal.os.ZygoteInit的main方法
4、预加载(预加载类文件、预加载系统资源、预加载opengl、预加载一些so库)
1)fork有一个copyonwrite技术,子进程可以复用父进程的资源。读时共享,写时复制。
就是复制mm结构体,里面有各个资源的内存地址,当某个子进程写的时候就重新copy一份对应数据,然后修改,再把指针指向这个新内存。
5、使用epoll循环等待监听去孵化新的进程

额外知识:一个应用有多个进程的好处
1)多个进程就有多个application,这样每个进程就可以做自己的初始化代码加载,这样可以使主进程快速启动。当一个大型app有多个进程时候,一般一个进程处理自己业务,比如音视频模块是一个单独的进程,那这样音视频项目组维护项目的时候,就不容干扰到其他项目的代码,进行比较高效的解耦。
2)多进程防止应用被杀掉,不过现在已经不使用这套方案了,一般都是通过各个手机厂商的push推送来完成通知消息的。如果有其他业务逻辑也可以通过push推送来触发。因为做华为linknow、hms core 消息中心 的消息推送业务也是通过push来实现的。

三、启动SystemServer

1、在ZygoteInit的main里面畜类循环等待监听去孵化新的进程以外,还会去启动SystemServer, 会通过抛异常的方式去反射启动SystemServer(基本上所有的进程启动透视抛异常来启动方法的,就是为了打印栈信息)。
2、SystemServer里面的main执行,首先去执行new一个ActivityThread然后去attach(true)创建一个context、application。当attach的参数是true的时候是不会和ams交互的,也就不会启动MainActivity。
3、初始化三类服务 引导服务、核心服务、其他服务,并将他们注册到ServiceManager里面, 其中有4个非常重要的服务ams、pms、wms、ims。

四、mediaserver启动的时候注册binder服务流程
  1. 进程启动进入Main_mediaserver.cpp的main函数。
  2. 初始化ProcessState,初始化的时候进行了以下操作:
    (1) 打开binder驱动,调用的是驱动层的 binder_open函数,并拿到文件描述符fd。
    (2) 设置驱动层最大的线程数15,调用的是驱动层的 binder_ioctl 函数。
    (3) 调用mmap函数映射一块内存,驱动层调用的是binder_mmap函数,传入参数是fd和 1M-8k的内存大小
  3. 跨进程获取ServiceManager的代理对象。
    (1) 调用ProcessState对象的getStrongProxyForHandle函数获取Bpbinder(0)。
    (2) 根据宏定义ServiceManager的一个代理对象BpServiceManager(new Bpbinder(0))。
    4.根据ServiceManager的代理对象去注册mediaserver。
    (1) 接着MediaPlayerService::instantiate() 会调用BpServiceManager的addService()函数,
    参数"media.player" 为注册名 ,参数MediaPlayerService()为注册的Binder对象。
    (2) addService()函数会调用,remote()->transact()函数执行将binder对象信息跨进程注册到serviceManager里面,transact()函数的参数ADD_SERVICE_TRANSACTION代表注册操作。
五、ServiceManager启动的时候注册驱动管理者和循环等待

1、打开binder驱动
2、 成为驱动的管理者
3、 循环等待处理client请求
(1)client注册binder的时候,ServiceManager会读取收到的数据,数据里面有两个关键信息handle值,name值。并且新建一个svcinfo的结构体来保存这两个信息。然后把svcinfo加入到自己管理的链表上。handle是驱动层给一个序号,用来标记binder对象在驱动层里面红黑树的位置。
(2)client获取查询binder的时候,ServiceManager会读取收到的数据,根据读取到的name值,去svcinfo链表里面查找handle,并返回到驱动层,驱动层会用handle值去红黑树里面查找binder对象返回给客户端。

六、binder驱动的执行

1、binder_open()函数
2、binder_mmap()函数
3、binder_oictl()函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值