【车载项目】 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 也选择了不支持。 …

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

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

2025届优秀大数据毕业设计

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

免费在腾讯云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…

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

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

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

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

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

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

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

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

Redis 数据类型 Hash 哈希

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

支持向量机原理

支持向量机(简称SVM)虽然诞生只有短短的二十多年,但是自一诞生便由于它良好的分类性能席卷了机器学习领域。如果不考虑集成学习的算法,不考虑特定的训练数据集,尤其在分类任务中表现突出。在分类算法中的表现SVM说是排…

zy.21

PHP(续) PHP代码执行漏洞 1.PHP中代码漏洞的概念 代码执行漏洞就是在代码中若存在eval、assert等能将所接收的参数作为代码去执行,并且拼接的内容可被访问者控制,也就是把传入的参数给拼接进去了,造成了额外的代码执行,也就造成了代码执行漏洞。(大概原理&#x…

LSTM 学习笔记 之pytorch调包每个参数的解释

0、 LSTM 原理 整理优秀的文章 LSTM入门例子:根据前9年的数据预测后3年的客流(PyTorch实现) [干货]深入浅出LSTM及其Python代码实现 整理视频 李毅宏手撕LSTM [双语字幕]吴恩达深度学习deeplearning.ai 1 Pytorch 代码 这里直接调用了nn.l…

React - 事件绑定this

在 React 中,this 的绑定是一个常见问题,尤其在类组件中使用事件处理函数时。JavaScript 中的 bind 函数用于设置函数调用时 this 的值。 bind 函数的作用 bind() 方法创建一个新的函数,当被调用时,其 this 关键字被设置为提供的…

Web3 的虚实融合之路:从虚拟交互到元宇宙构建

在这个数字技术日新月异的时代,我们正站在 Web3 的门槛上,见证着互联网的又一次革命。Web3 不仅仅是技术的迭代,它代表了一种全新的交互方式和价值创造模式。本文将探讨 Web3 如何推动虚拟交互的发展,并最终实现元宇宙的构建&…

Kafka简单使用

说明:kafka是一款消息中间件,可实现微服务之间的异步调用。本文介绍kafka的简单使用。windows操作系统下的kafka安装,参考下面这篇文章 Kafka安装 启动 按照上面博客的介绍,使用CMD命令启动,如下: Demo …

【原创精品】基于Springboot3+Vue3的学习计划管理系统

大家好,我是武哥,最近给大家手撸了一个基于SpringBoot3Vue3的学习计划管理系统,可用于毕业设计、课程设计、练手学习,系统全部原创,如有遇到网上抄袭站长的,欢迎联系博主~ 项目演示视频 https://www.bili…

C++引用深度详解

C引用深度详解 前言1. 引用的本质与核心特性1.1 引用概念1.2 核心特性 2. 常引用与权限控制2.1 权限传递规则2.2 常量引用2.3 临时变量保护1. 样例2. 样例3. 测试 三、引用使用场景分析3.1 函数参数传递输出型参数避免多级指针高效传参 3.2 做函数返回值正确使用危险案例 4. 性…

本地部署Deepseek R1

使用Ollama open-webui部署Deepseek R1 一、安装Ollama 官网地址:https://ollama.com/,点击下载按钮选择windows版本。并安装 打开命令提示符输入ollama,出现一下提示命令表示ollama安装完成 二、使用Ollama下载deepseek R1不同模型 打开o…