Android剖析Framework知识点

Zygote进程是怎么启动的?

首先Init进程是Linux进程启动后用户空间的第一个进程,然后去加载inti.rc配置文件,看需要加载哪些服务,Zygote就是其中之一。还有ServiceManager进程。 父进程fork出子进程,如果子进程挂了,那么父进程会收到子进程发送过来的SIGCHLD信号,进而做处理。

Zygote进程启动之后做了什么?

1.Zygote的native层:启动Android虚拟机,注册Android的JNI函数,进入Java层。

2.Zygote的Java层:预加载资源(包括主题资源,共享库等),fork出SystemServer,然后进入loop循环.

 

Android系统启动流程?

init.rc里面需要加载的进程有zygote,servicemanager,surfaceflinger和media等。主要需要了解zygote的启动流程,如上。还要了解systemserver的启动流程。下面来看看systemserver启动流程。

zygote启动systemserver进程后,在systemserver进程中初始化相关系统服务AMS,PMS,包括启动bind线程。因为systemserver里面的系统服务需要与我们的应用进程通信,而通信就是通过bind机制。还包括调用Java类的入口函数main(),在main()函数里面加载loop,共享库,创建上下文等。

系统服务是怎么启动的?

把系统服务的bind注册到serviceManager里面,通过这种方式发布系统服务。系统服务跑在什么线程?bind线程。

systemServer启动系统服务时怎么解决相互依赖?

分批启动,分阶段启动。

 

如何使用系统服务?

通过getSystemService(name)方法获取ServiceFetcher,并调用其getService方法。

如何注册系统服务?

通过调用ServiceManager的addService方法。

什么时候注册的系统服务?

SystemServer启动的时候。系统服务不完全是在SystemServer进程里面,还有一小部分单独开辟进程,比如ServiceManager。

系统服务和bind的应用服务有什么区别?

启动方式上的区别:系统服务大部分跑在SystemServer进程里面,也是在SystemServer里面启动的,如AMS,WMS,PMS。大部分服务跑在binder线程,少部分服务才跑在自己的工作线程。这里启动服务主要是服务初始化工作。而应用服务是客户端主动请求。

注册方式上的区别:先看系统服务的注册,无论是跑在SystemServer进程,还是独立进程,都要把binder实体对象注册到ServiceManager,是在启动的注册。而应用服务则是客户端向AMS发起bindService调用,AMS根据该bind对象是否已经注册进行不同的处理。

使用方式上的区别:系统服务通过上下文的getSystemServer()方法。而应用服务通过bindService发送请求,然后通过回调返回binder。

ServiceManager的启动:

1.启动进程:init进程读取init.rc配置文件,然后开启ServiceManager进程。

2.启用binder机制:

3.发布自己的服务:

4.等待并响应请求:

进程启动方式:

1.fork,子进程共享父进程资源

2.fork + execve(path,...),子进程资源由path指定。

什么时候触发应用进程启动?

启动组件时,如果没有该组件所在的进程没有启动,则启动进程,这是由framework层实现。

 

如何启动应用进程,即APP?

AMS通过socket向zygote发消息,zygote收到消息后去启动应用进程。zygote fork出应用进程后,执行ActivityThread的main函数。应用进程启动后向AMS报告,注册ApplicationThread。

如何启动binder机制?

binder启动时机,应用进程启动流程中,zygote启动应用进程的时候启动binder机制。

1.打开binder驱动;

2.映射内存,分配缓冲区;

3.注册binder线程;

4.进入binder loop;

 

谈谈你对Application的理解。

Application的作用。

1.保存应用的全局变量。

2.初始化操作。

3.提供应用上下文。应用开启几个进程,这里创建几个Application对象。

Application的继承关系。

Application继承ContextWrapper,ContextWrapper继承Context。

Application的生命周期。

1.Application构造函数。

2.attachBaseContext,获取上下文的方法,因此如果在上面Application构造方法里面使用了上下文就会报错。

3.onCreate。

 

谈谈对Context的理解

Application继承关系:Application继承ContextWrapper,ContextWrapper继承Context。

Application调用顺序:先调用Application构造函数,然后调用attachBaseContext,最后调用onCreate。

Activiy的继承关系:Activity继承ContextThemeWrapper,ContextThemeWrapper继承ContextWrapper。

Activiy调用顺序:先调用Activiy构造函数,然后调用attachBaseContext,最后调用onCreate。

Service继承关系:Service继承ContextWrapper,ContextWrapper继承Context。

Service调用顺序:先调用Service构造函数,然后调用attachBaseContext,最后调用onCreate。

第一个问题:应用里面有多少个Context?不同的Context之间有什么区别?

只有Application,Activity和Service有Context,而广播和ContentProvider没有。所以,Application,Activity和Service这三者的数量加起来,就是Context的数量。Activity由于需要显示UI,所以继承的是ContextThemeWrapper,而Application和Service继承的是ContextWrapper。

第二个问题:Activity里面的this和getBaseContext有什么区别?

this返回的是Context。 getBaseContext返回的是ContextWrapper里面的mBase。

第三个问题:getApplication和getApplicationContext有什么区别?

都是返回Application对象,getApplicationContext是Context里面的抽象方法,而getApplication是Activity和Service特有的,在别的地方不能用,比如广播不能用。

第四个问题:应用组件的构造函数,attachBaseContext,onCreate的调用顺序?

先调用构造函数,然后调用attachBaseContext,最后调用onCreate。

第五个问题:Context的作用。

Context是组件的上下文,便于访问系统资源,调用系统服务等。

 

Activity的启动流程?

创建Activity对象,获取Application,创建ContextImpl,attach上下文,生命周期回调onCreate()以及其他。

第一个问题:启动Activity会经历哪些生命周期回调?

第二个问题:冷启动大致流程,涉及哪些组件,通信过程是怎样的?

第三个问题:启动过程中,生命周期的回调原理?

 

Activity的显示原理?

第一个问题:PhoneWindow是什么,怎么创建的?

第二个问题:setContentView的原理,DecorView是什么?

第三个问题:ViewRoot是什么?有什么作用?

第四个问题:View的显示原理是什么?WMS发挥什么作用?

 

应用的UI线程是怎么启动的?

第一个问题:什么是UI线程?

UI线程就是刷新UI所在的线程,而且是单线程。

UI线程==主线程吗?

对于Activity来说,UI线程就是主线程。

对于View来说,UI线程就是View对应的VIewRootImpl创建时所在的线程。

Activity的DecorView对应VIewRootImpl是在主线程创建的。 

因此,如果VIewRootImpl不是在主线程创建,也可以刷新UI。

第二个问题:UI线程的启动流程,消息循环是怎么创建的?

第三个问题:了解Android的UI显示原理,UI线程和UI之间是怎么关联的?

 

Service启动原理

 

BinderService绑定原理

应用向AMS发起bindService调用,如果binder句柄存在,则AMS直接回调binder句柄,然后应用拿到bindre句柄去调用Service。

如果应用向AMS发起bindService调用时,binder句柄不存在,则AMS先向Service请求binder句柄,Service返回binder句柄给AMS,然后AMS回调binder句柄给应用,应用拿到bindre句柄去调用Service。当然,这个流程的前提是Service已经存在,如果Service不存在,则进入启动Service流程。

动态广播的注册和收发原理

1.注册广播封装了一个binder到AMS;

2.发广播的时候通过intent找到对应的receiver;

3.普通动态广播在系统端是并行分发,应用端串行分发;

 

Content Provider启动原理

应用A向AMS请求provider的binder对象,如果provider组件没有启动,,则先启动该组件。provider启动后通过attachApplication向AMS报告自己启动完毕,AMS收到后向provider发起bindApplication让provider创建application同时初始化provider。然后provider通过publishContentProvider将binder对象发布给AMS,AMS收到后将该binder对象返回给应用A。应用A就可以向provider发起CRUD调用。流程图如下:

 

屏幕刷新机制

首先View调用requestLayout()方法要重绘,也就是把Runnable放入choreographer的消息队列,choreographer并没有马上去处理该消息,而是向SurfaceFliger请求下一个Vsync信号,当下一个Vsync信号到来时向choreographer发通知,choreographer收到该通知后才处理消息队列里的消息。流程如下:

丢帧一般是什么原因引起的?

主线程有耗时操作,耽误了 View的绘制。

Android刷新频率60帧每秒,每隔16ms调用onDraw绘制一次?

刷新频率是指Vsync发出的频率,但不一定每次都去绘制。需要应用层主动发起绘制,在下一个Vsync信号来临时才绘制。

 onDraw完后屏幕会立即刷新吗?

不会,要等下一个Vsync信号。 

如果界面没有重绘,还会每隔16ms刷新屏幕吗?

会,只是看不出来。界面没有重绘表示应用层不会收到Vsync信号,但是屏幕还是每隔16ms发出Vsync信号。

如果在屏幕快要刷新的时候才去绘制会丢帧吗?

要等下一个Vsync信号。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章