【问题分析】SetupWizard退出动画卡住【Android15】

在这里插入图片描述

1 问题描述

从SetupWizard退出进入Launcher的过程中,SetupWizard的相关界面在退出的动画过程中短暂卡在了某个阶段,如下图所示:

在这里插入图片描述

2 问题分析

2.1 log分析

透过现象看本质,看log此过程中没有冻屏之类的操作,那么出现长时间卡在某个动画阶段,可能是在动画期间,相关SurfaceControl设置setPosition不够流畅导致。

在Transaction.setPosition方法中加log后,先看下正常的情况:

在这里插入图片描述

预期的情况是,setPosition的操作应该尽量在每一帧中都能进行,最终是界面的位置随着时间平滑的变化。

但是出现问题的时候的log为:

在这里插入图片描述

就没有几次设置setPosition的操作,y轴的变化也非常突兀,前几帧还算勉强在每一次Vsync的时候调用Transaction.setPosition为相关SurfaceControl设置了y轴位置,后面则出现了严重的丢帧,导致相关SurfaceControl的y轴位置一直没有得到更新。

再看具体的某一次设置position的堆栈信息:

在这里插入图片描述

能看到:

1)、进程号2023对应的是SystemUI,也就是说这个动画是Transition动画,并且由位于SystemUI的WMShell负责执行。

2)、动画的每一帧位置通过ValueAnimator在每一个Vsync到来的时候计算的得到,至于这个Vsync自然是由Choreographer来接收。

2.2 perfetto分析

再看perfetto的信息:

在这里插入图片描述

执行动画的线程2110收到了几次Vsync后,出现了一段很长的空白期,之后才继续收到了几次Vsync,完成了动画,这一点符合我们观察到的现象以及log的情况。

至于为什么动画线程很长的一段时间都没有收到Vsync,看SystemUI主线程,则是长时间在处理configChanged相关的事务,这阻塞了Choreographer接收到下一个Vsync的时候动画的执行,动画从而出现了卡顿。

所以原因出在SetupWizard的动画还在执行的时候, “com.google.android.setupwizard”和“com.ts.setupwizard.overlay”等一些App执行了一些disable App的操作,触发了全局Configuration的更新,导致SystemUI主线程去处理了configChanged相关的事务导致了阻塞。

2.3 全局Configuration的更新

最后看下为什么全局Configuration发生了更新,对比AndroidU的项目,在退出SetupWizard进入Launcher的时候,是没有发生全局Configuration的更新的。

全局Configuration更新的log为:

在这里插入图片描述

更新的原因为CONFIG_ASSETS_PATHS这一位发生了变化,看下这个差异是如何产生的。

这里直接放结论,起点在OverlayManagerService.mService.setEnabledExclusiveInCategory:

在这里插入图片描述

这里传入的packageName为“com.android.internal.systemui.navbar.gestural”,这个值定义在WindowManagerPolicyConstants中:

在这里插入图片描述

应该是给App用的,看起来是和导航模式中的手势相关的。

后续的调用堆栈为:

OverlayManagerService.mService.setEnabledExclusiveInCategory

-> OverlaytManagerService.updateTargetPackagesLocked

-> OverlaytManagerService.updateActivityManager-> ActivityManager.scheduleApplicationInfoChanged-> ActivityManagerService.scheduleApplicationInfoChanged-> ActivityManagerService.updateApplicationInfoLOSP-> ProcessList.updateApplicationInfoLOSP-> ActivityTaskManagerService.updateAssetConfiguration

最终是在ActivityTaskManagerService.updateAssetConfiguration中:

在这里插入图片描述

首先调用ActivityTaskManagerService.increaseAssetConfigurationSeq中对Configuration.assetSeq进行了自增:

在这里插入图片描述

然后再调用ActivityTaskManagerService.updateConfiguration对全局Configuration进行了更新。

2.4 根本原因

经过第3步的分析,看到是那次OverlayManagerService.mService.setEnabledExclusiveInCategory的调用造成了全局Configuration的更新,然后我本地屏蔽了这次调用,果然不会有“config changes”相关的log打印了, 并且看手机的现象也正常,没有卡顿的现象发生了,但是本来进入Launcher的时候是手势导航模式的,因为我屏蔽了那次调用后也变成了3按钮导航的模式,所以OverlayManagerService.mService.setEnabledExclusiveInCategory的调用是SystemUI那边为了将导航模式从3按钮模式切换为手势模式。

所以这个问题发生的根本原因是,在SetupWizard退出进入Launcher的时候:

1)、首先是SetupWizard要执行退出动画,这个动画由位于SystemUI的WMShell执行,具体为在SystemUI的主线程中当Choreographer接收到Vsync信号后在animation阶段执行动画。

2)、SystemUI将导航模式从3按钮切换为了手势,这导致了全局Configuration的更新,SystemUI主线程中需要针对这个变化进行一些耗时操作,这影响到第一步的动画的顺利执行。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

BIO、NIO编程与直接内存、零拷贝详解

目录 一、网络通信编程基本常识 什么是 Socket? 短连接 长连接 什么时候用长连接,短连接? 网络编程里通用常识 二、Java 原生网络编程-BIO 原生 JDK 网络编程 BIO 原生 JDK 网络编程 NIO 什么是 NIO? 和BIO 的主要区别 NI…

代码随想录算法训练营_day29

题目信息 134. 加油站 题目链接: https://leetcode.cn/problems/gas-station/题目描述: 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你…

什么是网络准入控制系统?四款网络准入控制系统推荐 干货满满!

在当今的企业网络环境中,随着设备类型的多样化和远程办公的普及,网络安全面临的挑战愈加复杂。网络准入控制系统(Network Access Control, NAC)应运而生,成为企业保障网络安全的重要工具。本文就带你详细了解这一系统&…

C++ 学习 2024.9.3

封装栈与队列 栈: #include <iostream>using namespace std;class Stack { private:int *a; //动态数组存储元素int size; //栈容量int top; //栈顶元素索引 public://有参构造Stack(int size):size(size),top(-1){anew int[size];}//析构~Stack(){delete[]a…

在SpringBoot项目中使用多线程(配合线程池)加快从MySQL导入数据到ElasticSearch的速度

文章目录 1. 准备工作1.1 索引库1.2 建表1.3 实体类1.3.1 item.java1.3.2 itemDocument.java 1.4 编写配置文件1.5 编写 Mapper 类和 Service 类 2. 没有使用多线程的情况2.1 编码2.2 测试结果 3. 使用多线程&#xff08;配合线程池&#xff09;的情况3.1 自定义类&#xff0c;…

python与pytroch相关

1.pytroch模型类 PyTorch 是一个易学且清晰明了的深度学习库。本节讲解如何查看一个模型的结构。 首先&#xff0c;最简单创建模型的方式如下&#xff1a; #导入必要的库 import torch.nn as nn myNetnn.Sequential(nn.Linear(2,10),#第一层&#xff08;全连接层&#xff09;&…

【苍穹外卖】Day 5 Redis、店铺营业状态接口

1 基本介绍 Redis是一个基于 内存 的 key-value 结构数据库 基于内存存储&#xff0c;读写性能高适合存储热点数据(热点商品、资讯、新闻)企业应用广泛 运行 在cmd下 redis-server.exe redis.windows.conf 启动状态下&#xff0c;再 redis-cli.exe 测试&#xff1a; 也可以…

继承 继承 继承 屁

1.栈 #include <iostream>using namespace std; class Stack {int *ptr;int size; public://无参构造Stack():size(-1){ptrnew int[8];cout<<"无参构造"<<endl;}//有参构造Stack(int a):size(0){ptrnew int[8];ptr[0]a;cout<<"有参构造…

Phalcon 增删改查的搭建过程

一 结果展示 先展示效果: 1 查询: 2 删除 3 插入 插入之前,数据库里面表的数据如下: 插入之后:

性能优化:自动化处理系统设计

性能优化&#xff1a;自动化处理系统设计 前言需求分析系统设计1. 调度中心2. 任务执行器3. 错误处理机制4. 通知系统5. 报表生成器6. 日志记录器 技术实现结语 前言 在当今这个信息爆炸、技术日新月异的时代&#xff0c;企业面临着前所未有的挑战和机遇。随着业务量的不断增长…

第十九篇——行军篇:侦察兵的32条行军法则

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 微观层面也有很多值得去注意&#xff0c;刻意练习的地方&#xff1b;看似…

深度探索Unity与C#:编织游戏世界的奇幻篇章

在数字编织的梦幻之境中&#xff0c;Unity游戏引擎与C#编程语言如同双生子&#xff0c;共同编织着游戏世界的奇幻篇章。《Unity游戏开发实战&#xff1a;从零到C#高手》这本书&#xff0c;不仅仅是技术的堆砌&#xff0c;它更像是一位智慧导师&#xff0c;引领着我们深入探索这…

html+css+js网页设计 专业知识 珠宝历史10个页面

htmlcssjs网页设计 专业知识 珠宝历史10个页面 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 …

【算法】贪心算法解析:基本概念、策略证明与代码例题演示

文章目录 1. 什么是贪心算法&#xff1f;2. 贪心算法的特点3. 例题&#xff08;贪心策略&#xff09;① 找零问题② 最小路径和③ 背包问题 4. 贪心策略证明 1. 什么是贪心算法&#xff1f; 在学习贪心算法之前&#xff0c;一定要理解的是贪心策略&#xff1a; 贪心策略是一种…

美畅物联丨科技赋能校车安全:智慧监控管理系统的创新应用

1、背景 1.1应用需求 孩子&#xff0c;作为国家未来的希望之星和民族发展的潜力所在&#xff0c;其安全与健康向来都是社会瞩目的核心要点。校车&#xff0c;作为孩子们日常出行的关键交通载体&#xff0c;其安全性更是时刻牵动着每一个家庭的敏感神经。然而&#xff0c;不可…

JavaSwing项目ATM自动提款机(mysql数据库)+详细报告

目 录 第一章 引言... 1 1.1 设计目的... 1 1.2 相关开发工具介绍... 1 第二章 数据库需求分析... 2 2.1 系统功能分析... 2 2.2 功能模块设计... 2 第三章 数据库概念结构设计... 3 3.1 概念模型... 3 3.2 E-R图... 3 第四章 数据库逻辑结构设计... 4 4.1 关系模型设计... 4 …

Allure报告下载不同格式的文件

支持类型&#xff1a; class AttachmentType(Enum):def __init__(self, mime_type, extension):self.mime_type mime_typeself.extension extensionTEXT ("text/plain", "txt")CSV ("text/csv", "csv")TSV ("text/tab-sep…

【Datawhale X 李宏毅苹果书 AI夏令营】《深度学习详解》Task3 打卡

文章目录 前言学习目标一、优化策略二、模型偏差三、优化问题三、过拟合增加训练集给模型一些限制 四、交叉验证五、不匹配总结 前言 本文是【Datawhale X 李宏毅苹果书 AI夏令营】的Task3学习笔记打卡。 学习目标 李宏毅老师对应视频课程&#xff1a;https://www.bilibili.…

深度强化学习算法(六)(附带MATLAB程序)

深度强化学习&#xff08;Deep Reinforcement Learning, DRL&#xff09;结合了深度学习和强化学习的优点&#xff0c;能够处理具有高维状态和动作空间的复杂任务。它的核心思想是利用深度神经网络来逼近强化学习中的策略函数和价值函数&#xff0c;从而提高学习能力和决策效率…

js控制滚轮横向滚动

获取元素&#xff0c;使用一下方法 let box document.getElementById("table_box");box.addEventListener("wheel", function (e) {//这里使用的是 chrom浏览器测试的,有一些Api不太准确 ,请大家注意!!!!let left -e.wheelDelta || e.deltaY / 2;box.sc…