【车载项目】 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的动作,可以这样做,但是手机或者平板不能这样修改。)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS 渐变效果详解——线性渐变与径向渐变

在现代前端开发中,CSS 渐变被广泛应用于网页背景、按钮、图形等元素的渲染。相较于使用图片,实现渐变可以减少资源请求,同时也更灵活。今天我们主要介绍两种常用的渐变类型:线性渐变(Linear Gradient)与径向…

【愚公系列】《Python网络爬虫从入门到精通》001-初识网络爬虫

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主&…

如何借鉴GitHub开源项目进行LabVIEW开发

在设备开发过程中,许多开发者选择借鉴GitHub等平台上的开源项目,特别是当目标程序没有LabVIEW版本时。比如,在本例中,我们看到一个开源的Micro-Manager项目,它主要使用Java、C、Python等编程语言。对于LabVIEW开发者来…

大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡

大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡 背景 前端开发接口请求,调试,联调,接入数据,前端必不可少工具,postman是一个非常好…

CSS3+动画

浏览器内核以及其前缀 css标准中各个属性都要经历从草案到推荐的过程,css3中的属性进展都不一样,浏览器厂商在标准尚未明确的情况下提前支持会有风险,浏览器厂商对新属性的支持情况也不同,所有会加厂商前缀加以区分。如果某个属性…

Docker Compose介绍及安装使用MongoDB数据库详解

在现代容器化应用部署中,Docker Compose是一种非常实用的工具,它允许我们通过一个docker-compose.yml文件来定义和运行多容器应用程序。然而,除了Docker之外,Podman也提供了类似的工具——Podman Compose,它允许我们在…

防火墙是什么?详解网络安全的关键守护者

当今信息化时代,企业和个人在享受数字生活带来的便利时,也不可避免地面对各种潜在的风险。防火墙作为网络安全体系中的核心组件,就像一道牢不可破的防线,保护着我们的数据和隐私不受外界威胁的侵害。那么防火墙是什么?…

畅游Diffusion数字人(16):由音乐驱动跳舞视频生成

畅游Diffusion数字人(0):专栏文章导航 前言:从Pose到跳舞视频生成的工作非常多,但是还没有直接从音乐驱动生成的工作。最近字节跳动提出了MuseDance,无需复杂的动作引导输入(如姿势或深度序列),从而使不同专业水平的用户都能轻松进行灵活且富有创意的视频生成。 目录 贡…

机器学习常用包matplotlib篇(一)简单图像绘制

前言 Matplotlib 是支持 Python 语言的开源绘图库,简单且完善。 一、环境配置 1.环境设置 在 Notebook 环境绘图时,需先运行 %matplotlib inline 命令,将绘制图形嵌入当前页面。在桌面环境绘图,无需上述命令,而是在…

深入理解指针初阶:从概念到实践

一、引言 在 C 语言的学习旅程中,指针无疑是一座必须翻越的高峰。它强大而灵活,掌握指针,能让我们更高效地操作内存,编写出更优化的代码。但指针也常常让初学者望而生畏,觉得它复杂难懂。别担心,本文将用通…

如何利用DeepSeek开源模型打造OA系统专属AI助手

利用DeepSeek开源模型打造OA系统专属AI助手,可以显著提升办公效率,增强信息检索和管理能力。 注册与登录DeepSeek平台 访问DeepSeek官网 访问DeepSeek的官方网站DeepSeek。使用电子邮件或手机号码注册账号并登录。 获取API Key 登录DeepSeek平台&am…

jupyter notebook中3种读图片的方法_与_图片翻转(上下翻转,左右翻转,上下左右翻转)

已有图片cat.jpg 相对于代码的位置,可以用./cat.jpg进行读取。 下面是3种读图片的方法。 1.python读图片-pillow 图片文件不适合用open去读取 用open读图片,易引发UnicodeDecodeError: gbk codec cant decode byte 0xff in position 0: illegal multib…

软考高级《系统架构设计师》知识点(一)

计算机硬件 校验码 码距:就单个编码A:00而言,其码距为1,因为其只需要改变一位就变成另一个编码。在两个编码中,从A码到B码转换所需要改变的位数称为码距,如A:00要转换为B:11,码距为2。一般来说,…

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

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

从零到一:我的元宵灯谜小程序诞生记

缘起:一碗汤圆引发的灵感 去年元宵节,我正捧着热腾腾的汤圆刷朋友圈,满屏都是"转发锦鲤求灯谜答案"的动态。看着大家对着手机手忙脚乱地切换浏览器查答案,我突然拍案而起:为什么不做一个能即时猜灯谜的微信…

RAG 在智能答疑中的探索

一、背景 得物开放平台是一个把得物能力进行开放,同时提供给开发者提供 公告、应用控制台、权限包申请、业务文档等功能的平台。 面向商家:通过接入商家自研系统。可以实现自动化库存、订单、对账等管理。 面向ISV :接入得物开放平台&#…

Flutter编译问题记录

问题: 运行出现以下报错 Launching lib/main.dart on macOS in debug mode... Warning: CocoaPods not installed. Skipping pod install. CocoaPods is a package manager for iOS or macOS platform code. Without CocoaPods, plugins will not work on iOS or …

长安汽车发布“北斗天枢2.0”计划,深蓝汽车普及全民智驾

2月9日,长安汽车智能化战略“北斗天枢2.0”计划暨深蓝汽车全场景智能驾驶解决方案发布会在重庆盛大召开。此次发布会标志着长安汽车正式迈入智能化战略的新纪元,携手众多“中国智驾合伙人”,共同开启全民智驾元年。 发布会上,长安…

Java--集合(理论)

目录 一、collection collection常用方法 1.List(可以存在重复元素) 迭代器 迭代器的概念 注意事项 例子 1.ArrayList 特点 2.LinkedLIst 特点 3.Vector 特点 2.Set(无重复元素) 1.HashSet 特点 2.Linkedhashset&…

三相绕线型异步电动机转子串电阻器起动的建模仿真

1.引言 2.起动方法与原理 3. 起动器的分级电阻计算 4. 起动时间计算 5.三相异步电动机瞬态数学模型 6. 三相绕线型异步电动机转子串电阻器系统仿真模型 7.实例仿真分析 8.总结 1.引言 三相绕线型异步电动机转子串电阻器起动的研究文章有很多很多,但大多数都不…