(1)Input触控事件处理
(2)应用进程创建与启动
通知桌面应用的Activity
进入Paused
状态后,若需要启动的应用Activity
所在的进程不存在,先调用AMS的startProcessAsync()
创建应用进程,其中会执行Zygote.forkAndSpecialize()
创建子进程。应用进程初始化时会设置默认的java异常处理机制,并JNI调用启动进程的binder线程池,然后通过反射创建ActivityThread
对象调用main()
创建并启动主线程的loop消息循环,接着通过binder调用AMS的attachApplication()
接口将自己attach注册到AMS中。
(3)应用主线程消息循环机制建立
(4)应用Application和Activity组件创建与初始化
AMS执行应用的attachApplication()
注册请求过程中,会触发调用handleBindApplication()
初始化函数,创建应用Application
的context
对象,还会让Art虚拟机加载应用APK的Dex文件到内存,并加载应用APK的Resource
资源,然后创建应用的Application
对象,还有执行Application.onCreate()
。Application
初始化后,会调用ActivityStackSupervisor.realStartActivityLocked()
创建Activity
的context
对象,通过反射创建Activity
对象,并执行Activity.attach()
创建应用窗口的PhoneWindow
对象和设置WindowManage
。在Activity.onCreate()
中setContentView()
会创建窗口的DecorView
对象,在onResume
方法会执行WindowManager.addView()
开启视图绘制逻辑,创建Activity
的ViewRootImpl
对象,调用ViewRootImpl.setView()
开启UI界面绘制动作。
(5)应用UI布局与绘制
调用ViewRootImpl.setView()
会执行requestLayout()
调用触发measure、layout和draw动作,然后通过Binder调用WMS的addView
接口,实现添加和注册应用窗口操作。界面第一次执行绘制任务时,会通过Binder IPC调用WMS的relayout
接口,实现窗口尺寸的计算,并向系统申请用于本地绘制渲染的Surface
。
(6)RenderThread渲染
(7)SurfaceFlinger合成显示
应用通过Binder调用dequeueBuffer()
从SurfaceFlinger进程中管理的BufferQueue中申请一个处于free状态的可用Buffer,如果此时没有可用Buffer则阻塞等待。接着选择使用CPU或GPU渲染,再通过Binder调用queueBuffer()
将缓存数据返回给应用进程对应的BufferQueue,并申请sf类型的Vsync唤醒SurfuaceFlinger处理。在收到Vsync信号后,使用acquireBuffer()
获取对应BufferQueue中的Buffer进行合成操作,然后调用releaseBuffer()
将Buffer置为可用free状态,返回到应用对应的BufferQueue中。