launch Activity流程

(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()初始化函数,创建应用Applicationcontext对象,还会让Art虚拟机加载应用APK的Dex文件到内存,并加载应用APK的Resource资源,然后创建应用的Application对象,还有执行Application.onCreate()Application初始化后,会调用ActivityStackSupervisor.realStartActivityLocked()创建Activitycontext对象,通过反射创建Activity对象,并执行Activity.attach()创建应用窗口的PhoneWindow对象和设置WindowManage。在Activity.onCreate()setContentView()会创建窗口的DecorView对象,在onResume方法会执行WindowManager.addView()开启视图绘制逻辑,创建ActivityViewRootImpl对象,调用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中。

参照:mp.weixin.qq.com/s/DXg5-Y7Fj...

相关推荐
2501_916008891 小时前
Web 前端开发常用工具推荐与团队实践分享
android·前端·ios·小程序·uni-app·iphone·webview
我科绝伦(Huanhuan Zhou)2 小时前
MySQL一键升级脚本(5.7-8.0)
android·mysql·adb
怪兽20143 小时前
Android View, SurfaceView, GLSurfaceView 的区别
android·面试
龚礼鹏3 小时前
android 图像显示框架二——流程分析
android
消失的旧时光-19433 小时前
kmp需要技能
android·设计模式·kotlin
帅得不敢出门4 小时前
Linux服务器编译android报no space left on device导致失败的定位解决
android·linux·服务器
雨白5 小时前
协程间的通信管道 —— Kotlin Channel 详解
android·kotlin
TimeFine7 小时前
kotlin协程 容易被忽视的CompletableDeferred
android
czhc11400756638 小时前
Linux1023 mysql 修改密码等
android·mysql·adb
GOATLong9 小时前
MySQL内置函数
android·数据库·c++·vscode·mysql