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比较了解,这里就不再继续分析了。

相关推荐
丘狸尾2 小时前
[cisco 模拟器] ftp服务器配置
android·运维·服务器
van叶~4 小时前
探索未来编程:仓颉语言的优雅设计与无限可能
android·java·数据库·仓颉
Crossoads8 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
li_liuliu9 小时前
Android4.4 在系统中添加自己的System Service
android
C4rpeDime11 小时前
自建MD5解密平台-续
android
鲤籽鲲13 小时前
C# Random 随机数 全面解析
android·java·c#
m0_5485147717 小时前
2024.12.10——攻防世界Web_php_include
android·前端·php
凤邪摩羯17 小时前
Android-性能优化-03-启动优化-启动耗时
android
凤邪摩羯17 小时前
Android-性能优化-02-内存优化-LeakCanary原理解析
android
喀什酱豆腐18 小时前
Handle
android