【私人备忘录】深入理解Android之读书笔记

一、init工作流程:

1、解析两个配置文件,一个是系统配置文件init.rc,另一个是与硬件平台相关的配置文件。init.硬件平台名称.rc。

2、执行各个阶段的动作,创建zygote的工作就是在其中的某个阶段完成的。

3、调用property_init初始化属性相关的资源,并且通过property_start_service启动属性服务。

4、init进入一个无限循环,并且等待一些事情的发生。重点关注init如何处理来自socket和来自属于服务器的相关事情。

二、zygote创建Java环境的步骤:

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)。

三、SystemServer小结:

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通信系统

四、zygote分裂总结:

1、Zygote进程调用runSelectLoopMode

2、SystemServer进程发送消息给Zygote进程

3、Zygote进程fork创建子进程

4、子进程调用android.app.ActivityThread的main函数

五、ViewRoot、Surface、SF之间的关系:

1、ViewRoot有个成员变量mSurface,它是Surface类型,它和一块Raw Buffer有关联。

2、ViewRoot是个ViewParent,它的子view的绘画操作,是在画布Surface上展开的。

3、Surface和SF有交互。

六、ViewRoot和WMS之间的关系:

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函数完成事件处理。

七、Activity的创建和显示总结:

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。

八、Surface从Native层到Java层的总结:

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。

九、关于SurfaceComposerClient:

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对象均持有这块共享内存。

十、关于SurfaceControl:

1、mClient成员变量指向SurfaceComposerClient。

2、mSurface成员变量Binder通信响应端为SurfaceLayer。

3、SurfaceLayer有一个变量mOwner指向它的外部类Layer,而Layer有一个成员变量mSurface指向SurfaceLayer。

4、Native Surface和SF的SurfaceLayer简历Binder联系;

十一、SurfaceFlinger工作流程:

1、调用waitForEvent等待重绘或者事务处理。

2、如果有事务处理请求,则调用handleTransaction进行处理。

3、调用handlePageFlip,对各个显示层进行PageFlip。对于Layer类,它会生成一个新的纹理。

4、调用handleRepaint,它会遍历各个显示层的onDraw函数。

5、调用unlockClient,它会遍历各个显示层的finishPageFlip函数。

6、调用postFrameBuffer,将混合过的内容投递到屏幕。

发布了15 篇原创文章 · 获赞 107 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/llleahdizon/article/details/104154727