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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/771467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

传输层介绍

目录 端到端与点到点 协议 与 规则 TCP协议 UDP协议 UDP和TCP的比较 TCP协议 报文段 TCP中数据的拆分和组装 怎么理解TCP面向字节流 流量控制与阻塞控制 三次握手和四次挥手 TCP中的重传 多路复用和分用 UDP协议 UDP协议中数据的拆分和组装 怎么理解UDP面向数据…

2024-2028年中国丙二醇乙醚(PE)市场行情监测及未来发展前景研究报告

丙二醇乙醚(PE)又称1-乙氧基-2-丙醇,化学式为C5H12O2,是一种有机化合物。丙二醇乙醚外观呈无色透明液体,微含醚气味,能与水和多数有机溶剂混溶,微溶于乙酸乙酯和氯仿。丙二醇乙醚具有吸湿性、挥…

蓝桥杯刷题(十四)

1.小平方 代码 n int(input()) count0 def f(x)->bool: # 判断条件return True if x**2%n<n/2 else False for i in range(1,n): # 遍历[1,n-1]&#xff0c;符合题意计数加一if f(i):count1 print(count)2.3的倍数 代码 a int(input()) b int(input()) c int(input…

QT环境搭建

学习QT 一、QT环境搭建二、QT的SDK下载三、认识QT SDK 中自带的一些程序 一、QT环境搭建 QT开发环境&#xff0c;需要安装三个部分。 c编译器&#xff08;gcc、cl.exe……不是visual studio&#xff09;QT SDK&#xff08;QT SDK里面已经内置了C编译器&#xff1b;SDK就是软件…

C++ 先序建立树, 递归先中后三种遍历。

先序遍历&#xff1a;1 2 3 4 6 5 中序遍历&#xff1a;2 1 6 4 3 5 后序遍历&#xff1a;2 6 4 5 3 1 #include <stdio.h> #include <stdlib.h>//定义二叉树结构体 typedef struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right; } TreeNod…

C++算法知识总结

算法知识总结 1 算法竞赛常用函数及算法2 前缀和以及差分模板3 区间更新前缀和差分实战4 双指针模板4 二分答案5 高精度6 快速幂及链式前向星7 区间最大值/最小值8 异或运算9 回溯、取模、日期计算10 DFS基础11 DFS剪枝12 DFS遍历连通图13 位运算14 记忆化搜索15 动态规划及前…

2024 年广西职业院校技能大赛高职组《云计算应用》赛项赛题第 4 套

#需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; #需要资源或有问题的&#xff0c;可私博主&#xff01;&#xff01;&#xff01; 某企业根据自身业务需求&…

Rust 实战练习 - 5. 多线程,多进程,协程

目标&#xff1a; 多进程多线程Rust的协程 多进程 use std::process::{Command, Stdio};fn main() {println!("call new exe in process:");// netstat -ntlp // 耗时很短&#xff0c;所以看不出效果// netstat -p // 耗时很长&#xff0c;如果可以异步输出&…

Android源码阅读WorkMangaer - 4

前言 由于笔者目前水平限制&#xff0c;表达能力有限&#xff0c;尽请见谅。 WorkManager 是 Android Jetpack 库的一部分&#xff0c;提供了一种向后兼容的方式来安排可延迟的异步任务&#xff0c;这些任务即使在应用退出或设备重启后也应该继续执行&#xff0c;它是 Androi…

Java中 List 集合,通过 Stream 流进行排序总结

一、数据准备 public class OrderTest {private String channelCode;private BigDecimal rate;// 省略 getter、setter、toString()、constructor }List<OrderTest> orderTestList new ArrayList<>();OrderTest z09 new OrderTest("Z09", new BigDeci…

C++细节

背景知识&#xff1a; 面向对象的编程中&#xff0c;类&#xff08;Class&#xff09;是创建对象的蓝图或模板&#xff0c;它包含了数据&#xff08;通常称为属性或变量&#xff09;和行为&#xff08;通常称为方法或函数&#xff09;。将数据封装为私有&#xff08;private&am…

VUE之首次加载项目缓慢

最近公司有个大型的项目&#xff0c;使用vue2开发的&#xff0c;但是最终开发完成之后&#xff0c;项目发布到线上&#xff0c;首次加载项目特别缓慢&#xff0c;有时候至少三十秒才能加载完成&#xff0c;加载太慢了&#xff0c;太影响用户体验了&#xff0c;最近研究了一下优…

tcp和udp分别是什么?udp和tcp的区别

TCP和UDP是计算机网络中常见的两种传输层协议&#xff0c;它们在实际应用中具有不同的特点和用途。本文将对TCP和UDP进行介绍&#xff0c;并分析它们之间的区别。 TCP和UDP分别是什么&#xff1f; TCP&#xff08;Transmission Control Protocol&#xff09; TCP是一种面向连…

架构整洁之道-读书总结

1 概述 1.1 关于本书 《架构整洁之道》&#xff08;Clean Architecture: A Craftsman’s Guide to Software Structure and Design&#xff09;是由著名的软件工程师Robert C. Martin&#xff08;又称为Uncle Bob&#xff09;所著。这本书提供了软件开发和架构设计的指导原则…

Spring Boot中实现对特定URL的权限验证:拦截器、切面和安全框架的比较

引言&#xff1a; 在开发Web应用程序时&#xff0c;对特定URL进行权限验证是一项常见的需求。在Spring Boot中&#xff0c;我们有多种选择来实现这一目标&#xff0c;其中包括使用拦截器、切面和专门的安全框架&#xff08;如Spring Security&#xff09;。本文将比较这三种方式…

SQL中常用的函数

explode 将一行转换成多行 collect_list 将多行转化成一行数据。 coalesce&#xff08;a1,a2&#xff09;指的取得是两者中不为空的那一列。 to_json 将数据集合转化成json格式

vue3 使用crypto-js 加密以及解密

安装 npm install crypto-js 在utils内创建cryptojs import CryptoJS from crypto-js/crypto-js; const key CryptoJS.enc.Utf8.parse(123123); // 密钥 后端提供 const iv CryptoJS.enc.Utf8.parse(); // 偏移量 /*** AES加密 &#xff1a;字符串 key iv 返回base64*/ ex…

绘图技巧 | 双变量映射地图可视化绘制方法

本期推文我们绘制不常见的双变量主题地图&#xff0c;该类地图可以很好的在地图上用颜色展示两个变量的信息&#xff0c;相较于单一变量映射地图&#xff0c;此类地图表达的信息更加丰富和全面。本期推文主要涉及的内容如下&#xff1a; 双变量映射地图(Bivariate Choropleth M…

深入C语言库:字符与字符串函数模拟实现

前言 C语言的库函数&#xff0c;是我们经常在编写程序所用到的函数&#xff0c;我们可以借用库函数去实现各种各样的功能&#xff0c;在本篇文章&#xff0c;我们介绍的是C语言中字符串和字符的相关库函数&#xff0c;以及他们的模拟实现&#xff0c;通过模拟实现我们可以深入…

以C++为核心语言的高频交易系统是如何做到低延迟的?

一、语言特性与性能优势 1. 高效执行效率&#xff1a; C是一种静态类型、编译型语言&#xff0c;其代码经过编译后直接生成机器码&#xff0c;无需像解释型或虚拟机语言那样在运行时进行额外的解析或字节码翻译&#xff0c;从而保证了极高的执行效率。C还提供了丰富的低级内存…