【车载项目】 systemui下拉负一屏界面,通过语音输入:“中文模式/英文模式“,会闪现一下负一屏下层的画面

1、背景

【操作步骤】负一屏界面,语音输入:“中文模式/英文模式”
【预期结果】显示正常
【实际结果】
会闪现一下负一屏下层的文字
【发生概率】必现

systemui下拉负一屏界面,通过语音输入:“中文模式/英文模式”,会闪现一下负一屏下层的画面。

2、分析过程
通过逐帧播放视频,我们猜测,bug中的闪屏是指负一屏以下的layer的渐变的动画。
接下来通过动画的调试手段来分析定位问题。

2.1 知识积累:
开发者选项中有三个动画因子
“Window animation scale” :窗口动画缩放
“Transition animation scale” :过渡动画缩放
“Animator duration scale” :动画程序时长缩放

调整动画时长:
adb shell settings get global window_animation_scale
adb shell settings get global transition_animation_scale
adb shell settings get global animator_duration_scale

adb shell settings put global window_animation_scale 10
adb shell settings put global transition_animation_scale 10
adb shell settings put global animator_duration_scale 10

修改白天、黑夜模式:
白天模式 adb shell “su 0 cmd uimode night no”
黑夜模式 adb shell “su 0 cmd uimode night yes”

通过分别设置,发现问题中的现象步骤一,能够清晰的看出来是有一个渐变的动画;
步骤二,现象消失。这能够充分说明,这个问题与android动画有关,需要通过debug animation来定位问题。
adb shell settings put global transition_animation_scale 20
adb shell settings put global transition_animation_scale 0

2.2 如何模拟语言切换中英文:
写一个demo apk,通过广播控制语言切换,切换语言的部分代码如下:

        try {Log.d(TAG, "setLanguage: " + languageCode);Locale locale = new Locale(languageCode);Log.d(TAG, "setAppLanguage() start " + locale.toString());IActivityManager am = ActivityManagerNative.getDefault();Configuration config = am.getConfiguration();//config.locale = locale;config.setLocales(new LocaleList(locale));config.userSetLocale = true;am.updatePersistentConfiguration(config);} catch (android.os.RemoteException e) {e.printStackTrace();}

adb shell am broadcast -a android.intent.action.CHANG_LANGUAGE --es code “zh”
adb shell am broadcast -a android.intent.action.CHANG_LANGUAGE --es code “en”

2.3 Android Framework 调试Animation动画的方法

(1)8155(android 11)定位animation问题,如何开启log:
WindowManagerDebugConfig
static final boolean DEBUG_ANIM = false; 设置为true
(2) 如何找到具体是受哪个Animation的影响,导致的问题:
SurfaceAnimator

void startAnimation(Transaction t, AnimationAdapter anim, boolean hidden,@AnimationType int type,@Nullable OnAnimationFinishedCallback animationFinishedCallback,@Nullable SurfaceFreezer freezer) {Slog.w(TAG, "startAnimation, anim = " + anim + ", hidden = " + hidden + ", t = " + t  + ", freezer" + freezer + ", mAnimatable = " + mAnimatable+ ", sc = " + mAnimatable.getSurfaceControl());cancelAnimation(t, true /* restarting */, true /* forwardCancel */);mAnimation = anim;mAnimationType = type;mAnimationFinishedCallback = animationFinishedCallback;final SurfaceControl surface = mAnimatable.getSurfaceControl();if (surface == null) {Slog.w(TAG, "Unable to start animation, surface is null or no children.");cancelAnimation();return;}if (mAnimatable != null && (mAnimatable.toString().contains("SimpleSurfaceAnimatable")&& surface.toString().contains("RotationLayer"))) {Slog.w(TAG, "----startAnimation exit-----------", new Throwable("xxxx"));//Slog.w(TAG, "----startAnimation exit-----------");//cancelAnimation();// return;}mLeash = freezer != null ? freezer.takeLeashForAnimation() : null;if (mLeash == null) {mLeash = createAnimationLeash(mAnimatable, surface, t, type,mAnimatable.getSurfaceWidth(), mAnimatable.getSurfaceHeight(), 0 /* x */,0 /* y */, hidden, mService.mTransactionFactory);mAnimatable.onAnimationLeashCreated(t, mLeash);}mAnimatable.onLeashAnimationStarting(t, mLeash);if (mAnimationStartDelayed) {if (DEBUG_ANIM) Slog.i(TAG, "Animation start delayed");return;}mAnimation.startAnimation(mLeash, t, type, mInnerAnimationFinishedCallback);}

在这里插入图片描述

78189: 12-31 11:13:59.970  1223  4645 W WindowManager: startAnimation, anim = com.android.server.wm.InsetsSourceProvider$ControlAdapter@896c73d, hidden = true, t = android.view.SurfaceControl$Transaction@e68b403, freezercom.android.server.wm.SurfaceFreezer@ffd88a7, mAnimatable = Window{2bfa2a8 u0 InputMethod}, sc = Surface(name=2bfa2a8 InputMethod)/@0x6c0415478771: 12-31 11:14:00.247  1223  1513 W WindowManager: startAnimation, anim = com.android.server.wm.InsetsSourceProvider$ControlAdapter@917a8b1, hidden = false, t = android.view.SurfaceControl$Transaction@e68b403, freezercom.android.server.wm.SurfaceFreezer@6b73875, mAnimatable = Window{c17a926 u0 BottomCarSystemBar}, sc = Surface(name=c17a926 BottomCarSystemBar)/@0xeb4e00a78795: 12-31 11:14:00.258  1223  1513 W WindowManager: startAnimation, anim = com.android.server.wm.InsetsSourceProvider$ControlAdapter@a2a9d7f, hidden = false, t = android.view.SurfaceControl$Transaction@e68b403, freezercom.android.server.wm.SurfaceFreezer@6bfbf80, mAnimatable = Window{8ddd15a u0 TopCarSystemBar}, sc = Surface(name=8ddd15a TopCarSystemBar)/@0x8fdb9b979249: 12-31 11:14:00.769  1223  1513 W WindowManager: startAnimation, anim = com.android.server.wm.LocalAnimationAdapter@c3d4ea4, hidden = false, t = android.view.SurfaceControl$Transaction@e68b403, freezernull, mAnimatable = com.android.server.wm.SimpleSurfaceAnimatable@45c3937, sc = Surface(name=mWindowContainers)/@0x24aa02879254: 12-31 11:14:00.769  1223  1513 W WindowManager: startAnimation, anim = com.android.server.wm.LocalAnimationAdapter@a3131d3, hidden = false, t = android.view.SurfaceControl$Transaction@e68b403, freezernull, mAnimatable = com.android.server.wm.SimpleSurfaceAnimatable@617ffc2, sc = Surface(name=RotationLayer)/@0x52b110

一次语言切换,会触发5次动画,一步一步定位是哪个动画导致的问题。

12-31 11:14:00.770  1223  1513 W WindowManager: ----startAnimation exit-----------
12-31 11:14:00.770  1223  1513 W WindowManager: java.lang.Throwable: xxxx
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:153)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:177)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.SurfaceAnimator.startAnimation(SurfaceAnimator.java:182)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.ScreenRotationAnimation$SurfaceRotationAnimationController.startAnimation(ScreenRotationAnimation.java:720)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.ScreenRotationAnimation$SurfaceRotationAnimationController.startScreenshotRotationAnimation(ScreenRotationAnimation.java:634)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.ScreenRotationAnimation$SurfaceRotationAnimationController.startScreenRotationAnimation(ScreenRotationAnimation.java:585)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.ScreenRotationAnimation.startAnimation(ScreenRotationAnimation.java:438)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.ScreenRotationAnimation.dismiss(ScreenRotationAnimation.java:456)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.WindowManagerService.stopFreezingDisplayLocked(WindowManagerService.java:5969)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.RootWindowContainer.performSurfacePlacementNoTrace(RootWindowContainer.java:922)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.RootWindowContainer.performSurfacePlacement(RootWindowContainer.java:819)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacementLoop(WindowSurfacePlacer.java:178)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:127)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.WindowSurfacePlacer.performSurfacePlacement(WindowSurfacePlacer.java:116)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.wm.WindowSurfacePlacer$Traverser.run(WindowSurfacePlacer.java:58)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at android.os.Handler.handleCallback(Handler.java:938)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at android.os.Handler.dispatchMessage(Handler.java:99)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at android.os.Looper.loop(Looper.java:223)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at android.os.HandlerThread.run(HandlerThread.java:67)
12-31 11:14:00.770  1223  1513 W WindowManager: 	at com.android.server.ServiceThread.run(ServiceThread.java:44)

3、解决方案
关闭动画解决该问题:(车载项目没有rotation的动作,可以这样做,但是手机或者平板不能这样修改。)

在这里插入图片描述

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

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

相关文章

从零到一:基于Rook构建云原生Ceph存储的全面指南(上)

文章目录 一.Rook简介二.Rook与Ceph架构2.1 Rook结构体系2.2 Rook包含组件1)Rook Operator2)Rook Discover3)Rook Agent 2.3 Rook与kubernetes结合的架构图如下2.4 ceph特点2.5 ceph架构2.6 ceph组件 三.Rook部署Ceph集群3.1 部署条件3.3 获取…

vue3 怎么自动全局注册某个目录下的所有 vue 和 tsx 组件

在开发 vue3 项目时,我们会有这样的诉求,怎么自动全局注册某个目录下的所有 vue 和 tsx 组件? 虽然已经有非常强大的 unplugin-vue-components 支持,但是在某些动态场景下,unplugin-vue-components 也选择了不支持。 …

机器学习数学基础:21.特征值与特征向量

一、引言 在现代科学与工程的众多领域中,线性代数扮演着举足轻重的角色。其中,特征值、特征向量以及相似对角化的概念和方法,不仅是线性代数理论体系的核心部分,更是解决实际问题的有力工具。无论是在物理学中描述系统的振动模式…

算法02-各种排序算法

各种常见排序算法总结 一. 冒泡排序 (Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地遍历要排序的列表,比较相邻的元素,并交换它们的位置,直到整个列表排序完成。 A、说明: 特点: 通过不断交换相邻元素&am…

大模型数据集全面整理:444个数据集下载地址

本文针对Datasets for Large Language Models: A Comprehensive Survey 中的 444 个数据集(涵盖8种语言类别和32个领域)进行完整下载地址整理收集。 2024-02-28,由杨刘、曹家欢、刘崇宇、丁凯、金连文等作者编写,深入探讨了大型语…

2025届优秀大数据毕业设计

【2025计算机毕业设计】计算机毕业设计100个高通过率选题推荐,毕业生毕设必看选题指导,计算机毕业设计选题讲解,毕业设计选题详细指导_哔哩哔哩_bilibili 985华南理工大学学长 大厂全栈,大数据开发工程师 专注定制化开发

DeepSeek 15天指导手册--从入门到精通

第一部分:基础认知与快速上手(Day 1-3) Day 1:认知革命与DeepSeek生态定位 大模型技术演进:从GPT到DeepSeek的技术突破 DeepSeek核心优势解读:算力效率、中文理解、知识密度 应用场景全景图:…

Django中select_related 的作用

Django中这句代码Dynamic.objects.select_related(song)是什么意思? 在 Django 中,这句代码: Dynamic.objects.select_related(song) 的作用是 在查询 Dynamic 模型的同时,预加载 song 关联的外键对象,从而减少数据…

免费在腾讯云Cloud Studio部署DeepSeek-R1大模型

2024年2月2日,腾讯云宣布DeepSeek-R1大模型正式支持一键部署至腾讯云HAI(高性能应用服务)。开发者仅需3分钟即可完成部署并调用模型,大幅简化了传统部署流程中买卡、装驱动、配网络、配存储、装环境、装框架、下载模型等繁琐步骤。…

【C++高并发服务器WebServer】-17:阻塞/非阻塞和同步/异步、五种IO模型、Web服务器

本文目录 一、阻塞/非阻塞、同步/异步1.1 辨析1.2 异步io接口 二、五种IO模型2.1 阻塞 blocking 模型2.2 非阻塞 NIO 模型2.3 IO多路复用2.4 信号驱动Signal-driven2.5 异步 三、Web Sever 网页服务器3.1 HTTP的请求响应步骤3.2 HTTP请求与响应报文格式3.3 HTTP请求方法3.4 HTT…

力扣LeetCode: 5 最长回文子串

题目: 给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2: 输入:s &qu…

【MySQL例题】我在广州学Mysql 系列——有关数据备份与还原的示例

ℹ️大家好,我是练小杰,今天周二,明天就是元宵节了呀!!😆 俗话说“众里寻他千百度。蓦然回首,那人却在,灯火阑珊处。” 本文主要对数据库备份与还原的知识点例题学习~~ 前情回顾&…

自动化xpath定位元素(附几款浏览器xpath插件)

在 Web 自动化测试、数据采集、前端调试中,XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大,但面对复杂 DOM 结构时,XPath 仍然更具灵活性。因此,掌握 XPath,不仅能提高自动化测试的稳定性,还能在爬…

【并发控制、更新、版本控制】.NET开源ORM框架 SqlSugar 系列

系列文章目录 🎀🎀🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀🎀🎀 文章目录 系列文章目录一、并发累计(累加)1.1 单条批量累计1.2 批量更新并且字段11.3 批量更新并且字段list中对应的…

结合实际讲NR系列2—— SIB1

这是在基站抓取的sib1的一条信令 L3MessageContent BCCH-DL-SCH-Messagemessagec1systemInformationBlockType1cellSelectionInfoq-RxLevMin: -64q-QualMin: -19cellAccessRelatedInfoplmn-IdentityListPLMN-IdentityInfoplmn-IdentityListPLMN-IdentitymccMCC-MNC-Digit: 4MC…

数据存储和操作:数据管理的基石

在数据管理的庞大体系中,数据存储和操作是确保数据可用性和完整性的关键环节。它不仅涉及数据的物理存储,还包括数据的管理、维护和优化。今天,让我们深入《DAMA数据管理知识体系指南(第二版)》的第六章,一…

Redis 数据类型 Hash 哈希

在 Redis 中,哈希类型是指值本⾝⼜是⼀个键值对结构,形如 key "key",value { { field1, value1 }, ..., {fieldN, valueN } },Redis String 和 Hash 类型⼆者的关系可以⽤下图来表⽰。 Hash 数据类型的特点 键值对集合…

LLaMA-Factory 安装linux部署conda笔记

第一行代码是我导入https://github.com/hiyouga/LLaMA-Factory.git到我的项目那里的,试过网上随便搜索过相同,估计没更新,安装了几次都运行失败,克隆了最新的就安装成功了。 方法1没虚拟环境:不知道成不成功&#xff…

【干活分享】2025年可以免费问答的一些GPT网站-deepseek等免费gpt

2025年已经到来,大家也都陆续回归到忙碌的工作中。在新的一年里,如何更高效地完成工作任务,提升工作效率,是很多人关心的问题。今天,就为大家分享一些实用性很强的GPT网站,帮助大家在工作中事半功倍。 Dee…

Repo命令使用

repo 命令与 git 类似&#xff0c;但它主要用于管理多个 Git 仓库的操作。以下是等效的 repo 命令&#xff1a; 1. 获取新仓库代码 克隆仓库 repo init -u <manifest_url> -b <branch_name> repo sync repo init&#xff1a;初始化 repo&#xff0c;指定远程清单…