android卡顿流程分析总结

一先说下基础流程:

app端控制显示的常用方式是xml里面配置view布局,然后通过activity生命周期解析view到view对象里面,然后通过window的生命周期将这些对象传输到native层进行数据处理成图片,然后将这些图像数据传出到屏幕里面中去。

也就是说整个流程仅有一小部分是app所在进程去做的,大部分都是由系统服务去做的,就像activity生命周期 onresume,oncreate是被ams调用的一样,window生命周期,ondraw,onmearure,onlayout 也是放到wms里去实现生命周期的一个调用的。

而且它是周期性的,通过编舞者来进行注册,调用,真正发起生命周期调用的是在surfaceflingger里面。

surfaceflingger会根据屏幕的刷新率来决定每隔多少毫秒调用一次,常规android系统是固定的16.6ms一次,即对于的屏幕刷新率60hz,但一般厂商都会根据自己的屏幕刷新率来进行适配(比如一些高刷屏),对于的编舞者这边也会相应的加快。

由此可以看出,我们android的app其实和系统的联系是非常紧密的,无论从一开始的创建(依来zogote来提前加载进来一些必要的系统资源,来保证app能够直接使用到一些比如各种系统控件,congtext资源等)还是启动(系统服务里面的ams和pms等协作完成app进程的生命周期的回调),还是现在我要总结的绘制,都是和系统有着密切的联系。

这一点是和普通linux app 不同的地方。有了这些服务,可以让我们轻松获得绘制的能力,轻松获得系统重要服务的api,轻松搞定一些复杂的工作,总之就是制作一个app轻松了很多

但如果想要了解其背后的原理,就要去关注这些系统服务彼此之间,以及服务和当前app之间是如何协作的。因为一些深层的问题,比如卡顿优化,就不得不去这里了解,甚至通过hook的方式进行改进

我写下我的流程跟踪的代码步骤

view.ondraw()->viewrootimpl.scheduletraversals()->Choreographer.handler.sendMessageAtTime()->注册,--surfaceflinger的回调->doFrame()

-->回调view的ondraw,onlayout,onmearure+事件+动画 --> surfaceflinger --> 屏幕。

这里 Choreographer依赖surfaceflinger的回调,surfaceflinger主要是和屏幕那边协调,通过固定填充刷新数据的频率来防止屏幕刷新时候,没有填充数据,或填充数据不全导致的屏幕撕裂的问题

但屏幕卡顿的问题需要以来编舞者来保证在surfaceflinger给定的周期中完成所有一帧数据的准备工作,如果无法完成,则会出现跳帧,即屏幕卡顿的现象,这里也是我们优化的地方

二,常用的优化手段

优化工具sytrace,protetol,android profile自带的火焰图等等,

我们可以总体看下cpu,内存的占用,找出那些线程出的问题,也可以具体到每个线程里面某个时间段的方法,

以及具体到内存分布中那些对象占用的内存情况,

首先还是要排除 内存泄漏,anr等常见的问题错误

然后优化呢

1 可以细化到具体的java知识,比如数据结构的使用,各种集合的选择

2 可以从java虚拟机(大量对象的创建会导致频繁回收等)到java文件的编译过程(内部类占用更多的字节,枚举消耗更多的内存,甚至到private,public 关键字的占用比较)方面来考虑如何优化

3 也可以从具体场景,启动优化(最大化占用cpu和内存),后台(则是相反减少占用内存,减少被回收的可能性)等时间换空间,还是空间换时间的考虑

卡顿源于绘制,但优化工作感觉和啥都能扯到, 这个暂时列下不同的方面,以后根据具体的情况来单独进行总结吧

三 相关问题处理

中间如何将view 绘制给surfaceflinger 这里的绘制流程是省略的,详细可以看下我贴的博客链接:我写下我遇到过的一个问题。

导航app作为桌面随系统启动后就直接黑屏了,系统认为是app自己的问题,app surfaceview没控制好,让app端先查。

log中发现导航app生命周期都是正常的,已经走到了onresume,而且log中发现mDrawState 的状态是commit_draw_pending,即是app绘制完成,即将要绘制到surfaceflinger

这个以及可以判断不是app的问题了,需要wms端看下接下来哪一步出问题了,所以直接转给了系统,没再继续跟下去,相关问题也是查找的网上的资料:

黑屏分析~_draw_pending的相关状态-CSDN博客

Android T WMS窗口相关流程_displaycontent mtokenmap-CSDN博客

我对这块只是满足app端需求即可,不熟,没有定制化开发能力,我主要对audio比较了解,这里就不再继续分析了。

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo1 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077001 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼1 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui