android framework分屏“官方”黑屏bug问题发现,你会分析吗?-千里马实战作业挑战

App冷启动白屏/黑屏问题分析及解决方案 一、问题背景最近在做产品首次启动页优化功能时,发现在点击启动launch图标与切换到子进程页面时会白屏或黑屏一段时间,时间长短根据不同机型性能不一。原来看过相关文章,借此机会总结一下app启动的闪屏页面是怎么产生的,该如何优化?二、问题分析既然我们想要优化app启动速度,那我们肯定要了解app启动的几种模式:冷启动(Cold start),热启动(Warm start),温启动(Lukewarm s 阅读详情

背景

hi,粉丝朋友们:

大家都知道马哥课程以实战为特色,这里的实战就是最贴近公司里面开发的实战项目。这些实战主要来自哪呢?
1、以前在公司的工作积累,自己在公司做过什么,这部分比较好毕竟都是搞过的
2、根据市场的上各个公司发布手机产品的调研,把相关特色功能搞过来给大家作为实战项目案例,这个部分实战是最多最难的,你想想各个公司产品功能那得有多少,我得做出来教给大家
3、以上2个是我大部分的课程实战的来源,还有一个重要的,那就是学员的都在各个公司从事framework,会遇到很多的经典难题bug等搞不定时候,也会经常请教马哥,马哥会挑出一些和课程贴近的,aosp上面可以复现的就会帮忙来搞定

大家想想马哥的课程都是基于以上的背景做出的实战课程,是不是比公司里面学的东西,获取的实战经验要丰富多了。

比如今天来探讨一个**马哥国际学员全程英文答疑、、、**的一个bug,这个兄弟学员在aosp上面尝试修改,发现了个bug无法修复,然后一直请教马哥这边,大概问题现象如下:
在这里插入图片描述

上面截图大家明显发现分屏左边有一半黑屏的异常,这类黑屏等问题说实话哪怕对于很多framework开发的老司机都很难分析。

你一看如果完全不知道怎么入手的话,,,说实话那也是正常。。,如果你一看已经有了自己分析思路,那么恭喜你可以继续往下看看这个bug是怎么出现的复现步骤,但是离修复还是有很大距离哈。

问题复现步骤路径

声明环境

这边为了和国际学员保持一致是aosp14,这里我感觉其实aosp 13一样有问题。
即你如果没有14代码你就在13上试试,实在不行就用aosp14

问题修改背景

原生aosp的分屏一般divide分割线拖拉只有3个档位,大概%25,%50,%75
在这里插入图片描述

但是对于横屏情况下的分屏却只有%50一个档位的分割线
在这里插入图片描述

所以为了实现这个需求,肯定就需要做相关的修改具体的如下:

要把config修改,让横屏也和竖屏一样

diff --git a/core/res/res/values-land/config.xml b/core/res/res/values-land/config.xml
index 7308dc5882c1..948d542a0cf7 100644
--- a/core/res/res/values-land/config.xml
+++ b/core/res/res/values-land/config.xml
@@ -15,5 +15,5 @@
   ~ limitations under the License
   -->
 <resources>
-    <integer name="config_dockedStackDividerSnapMode">2</integer>
-</resources>
\ No newline at end of file
+    <integer name="config_dockedStackDividerSnapMode">0</integer>
+</resources>

DividerSnapAlgorithm.java的修改

diff --git a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java
index a065e2b78d80..881757dd8342 100644
--- a/core/java/com/android/internal/policy/DividerSnapAlgorithm.java
+++ b/core/java/com/android/internal/policy/DividerSnapAlgorithm.java
@@ -350,9 +350,9 @@ public class DividerSnapAlgorithm {
      * meets the minimal size requirement.
      */
     private void maybeAddTarget(int position, int smallerSize) {
-        if (smallerSize >= mMinimalSizeResizableTask) {
+        //if (smallerSize >= mMinimalSizeResizableTask) {
             mTargets.add(new SnapTarget(position, position, SnapTarget.FLAG_NONE));
-        }
+        //}
     }

修改后效果如下:
在这里插入图片描述

是不是感觉效果还是很好的。。。一切都完美,准备公司得表扬了。。。可是万万你没有想到,居然提测时候发现开头那个黑屏问题

在这里插入图片描述

你是不是心里想,。。。。我就改了个配置而已,为啥会引入个黑屏的bug,这下完蛋了,压根不知道为啥引入的啊,修改就那么简单两句代码而已。。。。

怎么复现呢?

1、横屏进入分屏,拖divider到最左边%25位置
2、旋转手机变成竖屏停留1s,再回到横屏
3、拖动divider到%50情况下就出现上面横屏分屏黑屏情况

留给大家的作业:

上面就是一个非常真实的企业实战的bug,而且也很经典,很符合很多人修改framework的需求的情况,毕竟大家都很喜欢看到快速修改效果,这期间很可能你会去百度啥的copy人家代码,跑起来了就一顿开心,可是往往没有深入理解透彻,可能就是你挖出天坑第一步,后面测试一测相关引入的bug,就是对你前面偷懒的惩罚哈哈哈,总之告诉你,想彻底掌握那么就必须要全面理解。

那么上面的黑屏问题马哥就留给课程学员的作业,这个作业是给大家一个非常好巩固自己学习知识的案例。

更多framework干货获取相关可以 私聊+v(androidframework007)
点击这里 https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频:https://www.bilibili.com/video/BV1ah411d7Y3
在这里插入图片描述

Android开机黑屏问题分类 开机黑屏问题分类 首先要看一下是否是快速开关机导致,即在setting–>辅助功能–>不勾选“fast boot“,关闭快速开关机选项,如果不黑屏,说明是因为ipo这个过程中的问题,那么问题需要看看这个动画,可以找一下ipo动画的owner。 黑屏的三个阶段分析开机过程黑屏,首先需要定位黑屏问题发生的时间段,开机过程中涉及到显示logo 或者是播放动画的主要有如下三个阶段: 显示 lk log 阅读详情

相关推荐

Android 多窗口框架全解析

本文基于AOSP Android-7.1.1-R9代码进行分析。 Android N的的多窗口框架中,总共包含了三种模式。 Split-Screen Mode: 分屏模式。 Freeform Mode 自由模式:类似于Windows的窗口模式。 Picture In Picture Mode:画中画模式(PIP) 经过一段时间的研究,总结一句话:多窗口框架的核心思想是分栈和设置栈边界。本文会从系

潇洒一刀的博客 1万+

android 分屏相关知识点

分屏比例最小值修改 android/frameworks/base/core/res/res/values/dimens.xml的值default_minimal_size_resizable_task 注意:这个值只能比220大,因为如果小的话CTS无法通过,因为CTS里面把这个值写死了220(ActivityAndWindowManagersState.java的DEFAULT_RESIZ...

冰之火的专栏 3619

Unity VR开发实战:Google VR SDK环境配置与避坑指南

虚拟现实(VR)应用开发的核心在于将3D内容与用户头部运动、交互设备实时同步,创造沉浸式体验。其技术原理依赖于图形渲染管线、传感器数据融合与低延迟输入处理。在移动VR领域,稳定的帧率与精准的头部追踪是保障用户体验的技术基石,直接影响到应用的流畅度与沉浸感。Google VR SDK for Unity作为连接Unity引擎与Cardboard/Daydream等移动VR平台的关键桥梁,为开发者封装了底层传感器接口、分屏渲染与交互逻辑。在工程实践中,正确的环境配置是项目成功的首要前提,涉及Unity版本兼容性

快马扬鞭须努力! 451

Android7.0多窗口实现原理(二)

本文基于AOSP Android-7.1.1-R9代码进行分析。 Android N的的多窗口框架中,总共包含了三种模式。 Split-Screen Mode: 分屏模式。 Freeform Mode 自由模式:类似于Windows的窗口模式。 Picture In Picture Mode:画中画模式(PIP) 经过一段时间的研究,总结一句话:多窗口框架的核心思想是分栈和设置栈边界。本文会从系统源码角度分析分栈以及设置栈边界的步骤和原理,从而解析多窗口三种模式的实现方式。 栈 既然提到了分栈,

Jason_Lee155的博客 6232

WPF、WinUI 3、MAUI 桌面开发选型实战指南(2024实测)

.NET桌面开发框架选型本质是技术生命周期与工程交付能力的权衡。WPF依托DirectComposition硬件加速与成熟MVVM生态,提供高稳定性和深度Windows集成;WinUI 3基于WinAppSDK突破沙盒限制,支持原生API调用与Windows 11新特性;MAUI则以跨平台共享业务逻辑为核心价值,但桌面端仍需WinUI 3底层支撑并面临DPI适配、WebView2兼容等现实挑战。三者差异不在语法表象,而在于渲染架构、部署模型与调试工具链——WPF适合企业内部系统快速交付,WinUI 3适配S

weixin_34025151的博客 514

Windows PSR:轻量级操作行为结构化记录工具

操作行为记录是IT支持、软件测试与流程审计的基础能力,其核心在于将用户交互转化为可解析、可验证、可复现的结构化数据。不同于依赖视频帧率与编解码的录屏工具,PSR以事件驱动方式捕获点击、切换、输入等原子操作,并同步生成带坐标标注的PNG截图与XML日志,实现操作语义化建模。这种设计带来极低资源占用、零网络依赖、强跨版本兼容性及天然审计友好性,特别适用于老旧设备、离线环境、高安全要求场景。在中小企业IT支持、MES系统培训、金融后台留痕等实践中,PSR已成为替代第三方录屏的稳定选择——它不渲染画面,却精准定义‘

天下无双 561

安卓14-16车机手机仿小米su7三分屏实战项目专题

从简单的产品背景,产品设计开始学习,实战带大家简单开始改造原生二分屏,循序渐进做出最初版本三分屏,逐步完善DividerView,落点设计,核心的Task部分拖拽放大等逻辑。去年在小米su7上市后,很多学员朋友就一直对它的车机三分屏非常感兴趣,学员朋友们都很想知道人家是怎么实现三分屏的,其实最希望的是马哥可以手把手教一下如何从0做出一个类似小米su7的三分屏功能。千里马手把手带你从0开始做一个车机的三分屏功能,最后做出来一个和市场上主流的小米su7 三分屏体验相当的三分屏成果。

learnframework的博客 1365

matlab kwave模拟超声换能器学习笔记

kwave模拟超声换能器的学习笔记,从零开始造车轮

SolvingMaster的博客 3197

车载AAOS系统实现三分屏SplitScreen功能专题

这个三分屏功能效果一上线后基本上很多网友都感觉到很惊艳,特别是做车机相关开发的同学都说自己想做这个几年了,老板也一直想要做,奈何自身实力不够一直拖到马哥的课程出来后,才敢有勇气和老板说可以做车机三分屏功能了。不过有的同学在后台也提出马哥这个三分屏都是在phone平台进行实现的,但是自己公司用的都是AAOS系统,这块是否有啥差异,是否可以帮忙看看AAOS上如何运行马哥的三分屏给你。千里马手把手带你从0开始做一个车机的三分屏功能,最后做出来一个和市场上主流的小米su7 三分屏体验相当的三分屏成果。

learnframework的博客 1122

NVIDIA Tao Toolkit环境配置踩坑

请搭配食用该文章为 Tao 安装中可能出现的问题进行解答,如果存在本文章中没出现的问题,欢迎提问,由我复现后更新文章。由于大部分云服务器厂商不能支持 docker,因此我使用的环境为2023年5月27日在平台租的 3080 旧版环境进行实验。

qq_36630208的博客 771

Ubuntu环境下rknn-toolkit2的安装与兼容性解析

本文详细解析了在Ubuntu系统上安装瑞芯微rknn-toolkit2工具链的完整流程与关键注意事项。文章重点剖析了rknn-toolkit2与旧版rknn-toolkit的核心兼容性问题,强调两者在API、模型格式及运行时库上互不兼容,并推荐使用Conda虚拟环境进行隔离管理,为RK3566、RK3588等开发板的AI模型部署提供清晰的实践指南。

weixin_29041767的博客 375

安卓framework单屏幕Display秒双/多屏互动相关需求改进-fw窗口多屏sf实战开发

一些vip学员朋友也纷纷求助马哥的实现patch代码,想用于公司的实战项目实现。但是在公司需求实现要求和马哥这边的实现还是会有一些需求上的变更和设备环境差异,所以使用过程中学员朋友们也提出了一些额外的问题。这个问题其实在马哥自己设备上从来没有发现过,但是有的vip学员朋友和我反馈有这种黑屏不显示情况,针对这个问题第一时间进行了分析,主要通过提供的dumpsys SurfaceFlinger来查看。2、因为上下结构已经实现,如果左右结构,针对触摸部分,如果左右结构需要更改触摸区域的宽度变宽。

learnframework的博客 1589

RK3588零拷贝视频流水线实战:用GStreamer+Mpp实现8K硬解与DRM显示

本文深入探讨了在RK3588平台上构建零拷贝视频流水线的工程实践。通过结合GStreamer与MPP,实现了从8K视频硬解到DRM显示的全流程硬件加速,有效解决了高分辨率视频处理中的DDR带宽瓶颈问题。文章详细解析了dma-buf数据流机制、管道构建与性能优化策略,为多路视频并发处理提供了高效的系统架构解决方案。

github5actions的博客 1169

app开发转framework系统工程师窗口显示方向面试真题

2、framework的承担开发要求精,因为framework毕竟属于系统层面东西,一修改影响整个系统的功能和稳定,分析代码理解代码精通代码才可能可以修改掉系统一些问题,及最小波及的实现系统的一下新功能,不是网络百度复制粘贴一下即可以,所以这里要求是对简历上写出的精通或熟悉模块,面试官会挖的比较深入,会对模块很多重要部分进行提问考察,这个部分就是对你真正是否熟悉这个模块的考察,也是区别你是真懂的实战派还是说看了看blog和记忆性的背书党关键。13、你接过input相关的外设吗,或者说一下input的流程?

learnframework的博客 513

强化学习——day16 动态规划算法

动态规划(dynamic programming)是程序设计算法中非常重要的内容,能够高效解决一些经典问题,例如背包问题和最短路径规划。动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。动态规划会保存已解决的子问题的答案,在求解目标问题的过程中,需要这些子问题答案时就可以直接利用,避免重复计算。本章介绍如何用动态规划的思想来求解在马尔可夫决策过程中的最优策略

想太多的学习日志 1550

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1594

RK3588双通道MIPI-CPHY屏调试实战:从黑屏到稳定显示

MIPI-CPHY是一种面向高带宽显示的串行物理层协议,其三线符号编码机制与传统DPHY存在根本差异,导致信号链调试不能依赖常规日志判断。理解CPHY的LP/HS模式切换、lane相位对齐、时序参数(如lp-to-hs-time、lane-skew)等核心原理,是解决背光亮但黑屏、花屏、冷启动失败等典型问题的技术基础。其技术价值在于支撑4K+高刷显示,广泛应用于车载中控、工业HMI及高端平板设备。本文聚焦RK3588平台在Android12环境下双通道CPHY屏的工程落地,覆盖硬件时序匹配、DTS隐性参数调

weixin_34326558的博客 333

CST新手必看:共面波导色散曲线绘制全流程(附参数设置避坑指南)

本文详细介绍了CST Microwave Studio中绘制共面波导色散曲线的全流程操作,特别针对新手常见的边界条件设置错误、参数扫描失效等问题提供解决方案。通过模型建立、边界条件设置、本征模求解器配置等步骤,帮助工程师快速掌握CPW色散特性分析方法,并附有参数设置避坑指南,提升高频电路设计效率。

tomato的博客 987

VS Code调用Android Studio模拟器实战指南

Android模拟器是Android SDK提供的核心仿真工具,其本质是独立于IDE的命令行程序,依赖SDK路径、动态库及AVD配置文件。理解其与Android Studio的封装关系(非隶属)和与VS Code的环境隔离原理,是实现跨编辑器调用的基础。通过正确配置ANDROID_HOME与PATH、确保emulator及platform-tools可见,可使Flutter、Kotlin等项目在VS Code中无缝启动AVD、部署APK并接入ADB调试。该方案显著提升多端开发效率,尤其适用于Flutter开

weixin_29182481的博客 246

为什么devc++编译项目会失败?提示gcc无法正常启动...

根据你的描述,编译能正常进行时,只打开源文件并没有问题,问题主要出现在创建项目后编译失败,这通常与 Makefile 配置、环境变量、编译器路径设置等因素有关。你可以检查 Makefile 配置,验证 DevC++ 的编译器环境设置,或者尝试清理并重新配置项目。如果问题仍然存在,可以尝试重装 DevC++ 或重新配置工具链。希望如上措施及解决方案能够帮到有需要的你。

**My Coding Family** 1376

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TV浏览器全屏适配七层原理与Firefox实战方案

电视端Web浏览器并非PC浏览器的简单移植,其核心差异在于输入方式(遥控器/语音)、显示特性(4K大屏、系统UI遮挡)和运行环境(Android TV/定制Linux)。理解TV浏览器的本质,需从Web标准兼容性、全屏API实现机制、CSS视口单位容错、GPU渲染后端适配等底层原理切入。技术价值体现在保障Web应用在大屏设备上的可用性、稳定性与交互一致性,典型应用场景包括智能电视信息看板、IPTV Web插件、OTT终端H5运营页及WebRTC视频终端。本文聚焦tv bro电视浏览器与firefox way

weixin_34357887的博客 225

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Linux 运行 Windows 应用实战:Wine + FEX-Emu + DXMT 兼容层方案

在异构计算环境中,跨平台运行 Windows 应用的核心挑战在于指令集翻译、系统调用转发与图形 API 转换。用户态模拟技术通过将 x86-64 指令实时翻译为 ARM64 指令,并借助兼容层实现 Windows API 到 POSIX 调用的映射,显著降低了全系统虚拟化的性能开销。这一方案的技术价值在于,它使 ARM 设备与 Linux 发行版能够无缝运行遗留 Windows 程序,广泛应用于国产系统办公、嵌入式工业控制及移动端远程应用等场景。针对 wine 乱码、麒麟 wine 助手配置及 FEX-Em

weixin_34005090的博客 255

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: Android 经典hal开发实战-千里马android framework车载车机手机系统开发
下一篇: Hidl直通式Passthrough分析案例-Mapper模块
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值