1、解析两个配置文件,一个是系统配置文件init.rc,另一个是与硬件平台相关的配置文件。init.硬件平台名称.rc。
2、执行各个阶段的动作,创建zygote的工作就是在其中的某个阶段完成的。
3、调用property_init初始化属性相关的资源,并且通过property_start_service启动属性服务。
4、init进入一个无限循环,并且等待一些事情的发生。重点关注init如何处理来自socket和来自属于服务器的相关事情。
1、创建AppRuntime对象,并调用它的start。此后的活动则由AppRuntime来控制。
2、调动startVm创建Java虚拟机,然后调用startReg来注册JNI函数。
3、通过JNI调用com.android.internal.os.ZygoteInit类的main函数,从此进入Java世界。然后在这个世界刚开创的时候,什么东西都没有。
4、调用registerZygoteSocket。通过这个函数,它可以响应子孙后代的请求。同时Zygote调用preloadClasses和preloadResources,为Java世界添砖加瓦。
5、zygote觉得自己的工作压力太大,便通过调用startSystemServer分裂一个子进程system_server来为java世界服务。
6、zygote完成了Java世界的初创工作,下一步调用runSelectLoopMode。等待请求的到来(比如启动activity)。
1、ZygoteInit调用startSystemServer创建system_server进程
2、SS调用handleSystemServerProcess完成自己的使命
3、handleSystemServerProcess抛出异常,最终调用com.android.server.SystemServer的main函数
4、main函数加载libandroid_server.so并调用native的init1函数
5、init1函数通过JNI调用com.android.server.SystemServer类的init2函数。init2函数创建一个线程,用语加载各种Service
6、init1函数最终加入Binder通信系统
1、Zygote进程调用runSelectLoopMode
2、SystemServer进程发送消息给Zygote进程
3、Zygote进程fork创建子进程
4、子进程调用android.app.ActivityThread的main函数
1、ViewRoot有个成员变量mSurface,它是Surface类型,它和一块Raw Buffer有关联。
2、ViewRoot是个ViewParent,它的子view的绘画操作,是在画布Surface上展开的。
3、Surface和SF有交互。
1、ViewRoot通过IWindowSession和WMS进程进行跨进程通信,IWindowSession定义在IWindowSession.aidl文件中。
2、ViewRoot内部有一个W对象,它也是一个基于Binder通信的类,W是IWindow的Bn端,用于响应请求。IWindow定义在IWindow.adil中。
3、事件分发大致流程:WMS所在的SystemServer进程接收到事件;WMS找到UI位于屏幕顶端的进程所对应的IWindow对象,它是Bp端对象;调用这个IWindow对象的dispatchKey,调用到IWindow的Bn端,它位于ViewRoot中,ViewRoot再根据内部view的位置信息找到真正处理事件的view,然后调用其dispatchKey函数完成事件处理。
1、Activity的顶层View是DecorView,而我们在onCreate中通过setContentView设置的View是其中的一部分。DecorView是一个FrameLayout类型的ViewGroup。
2、Activity和UI有关,它包含一个Window(PhoneWindow)和一个WindowManager(LocalWindowManager)对象,这两个对象控制Activity显示。
3、LocalWindowManager使用WindowManagerImpl作为最终处理对象(Proxy模式),这个WindowManagerImpl中有一个ViewRoot对象。
4、ViewRoot实现了ViewParent接口,它有两个重要的成员变量,一个是mView,它指向Activity顶层UI单元的DecorView,另外一个是mSurface,这个Surface包含了一个Canvas。除此之外,ViewRoot还通过Binder系统和WMS进行了跨进程通信。
5、ViewRoot能处理Handler的消息,Activity的显示就是由ViewRoot在它的performTraversals函数中完成。
6、整个Activity的绘制流程就是从mSurface中lock一块Canvas,然后交给mView去自由发挥画画的才能,最后unlockCanvasAndPost释放这块Canvas。
1、创建一个SurfaceComposerClient。(Java层SurfaceSession对象的构造函数会调用Native的SurfaceSession_init函数,看名字这个对象会和SF进行交互,SF派生于SurfaceComposer)
2、调用SurfaceComposerClient的createSurface得到一个SurfaceControl对象。
3、调用SurfaceControl的writeToParcel把一些信息写到Parcel包中。
4、根据Parcel包的信息构造一个Surface对象。把这个对象保存到Java层的mSurface对象中,这样ViewRoot得到了一个Native的Surface对象。
5、调用Surface的lock。
6、UI画图。
7、调用Surface的unlockAndPost。
1、SurfaceComposerClient成员mSignalServer,是SF在客户端的代理BpSurfaceFlinger,主要作用是在客户端更新完BackBuffer后(刷新了界面),通知SF进行PageFlipping和输出等工作。
2、SurfaceComposerClient成员mControl,它是跨进程的SharedClient,是Surface系统的ControlBlock对象。
3、SurfaceComposerClient成员mClient,它是BClient在客户端的对应物。
4、SF是从Thread派生的,所以它会有一个单独运行的工作线程。
5、BClient和SF之间采用了Proxy模式,BClient支持Binder通信,它接受客户端的请求,并派发给SF执行。
6、SharedClient构建于一块共享内存中,SurfaceComposerClient和Client对象均持有这块共享内存。
1、mClient成员变量指向SurfaceComposerClient。
2、mSurface成员变量Binder通信响应端为SurfaceLayer。
3、SurfaceLayer有一个变量mOwner指向它的外部类Layer,而Layer有一个成员变量mSurface指向SurfaceLayer。
4、Native Surface和SF的SurfaceLayer简历Binder联系;
1、调用waitForEvent等待重绘或者事务处理。
2、如果有事务处理请求,则调用handleTransaction进行处理。
3、调用handlePageFlip,对各个显示层进行PageFlip。对于Layer类,它会生成一个新的纹理。
4、调用handleRepaint,它会遍历各个显示层的onDraw函数。
5、调用unlockClient,它会遍历各个显示层的finishPageFlip函数。
6、调用postFrameBuffer,将混合过的内容投递到屏幕。