- 博客(10)
- 收藏
- 关注
原创 Android显示异常问题处理指导手册I基本思路
(3)如果定位到Display Driver异常. 先进行如下Bypass PQ实验,排查是否为PQ问题(适用于黑屏,或闪屏问题.)如果Bypass PQ后,显示变正常,说明问题与PQ有关,提交Eservice时,请Title注明PQ问题. 如bypass PQ后,异常依然存在,也请在Eservice description 中说明Bypass PQ 无效.幸运的是,根据多年的“踩坑”经验,总结了一套简单的排查指南,帮你根据异常现象,对号入座,初步锁定“嫌疑模块”,然后再深入分析。详细flow见末尾图片。
2024-08-26 09:37:40
710
原创 Android Display Graphics #实践小例子
listener 是生产者的监听器,api 是使用的 API 类型,producerControlledByApp 指示生产者是否由应用控制,output 包含连接后的返回信息。slot 是缓冲区的插槽编号,input 包含缓冲区的信息,output 包含提交后的返回信息。创建一个缓冲区队列,并使用上面创建的Surface作为初始化参数,实现了Surface和BBQ的绑定。slot 是缓冲区的插槽编号,buf 是返回的缓冲区对象。使用获取到的宽高,通过createSurface()创建Surface。
2024-07-31 16:47:39
619
原创 Android .rc规则详解与init 启动
C++/java都是面向对象的语言,init语言是面向行的,就是一行就是一个语句。只有两种方式可以保证一个服务运行于另一个服务之前。import关键字不是命令,而是它自己的部分,这意味着它不是作为Action的一部分发生,而是作为正在解析的文件处理导入,并遵循以下逻辑。用于覆盖之前定义的同名服务,一般用于/odm 覆盖 /vendor的,init使用最后一个override定义的服务。导入path路径的rc文件给init解析,如果是一个文件夹,只解析当前路径下的所有rc文件,不会解析包含的子文件夹。
2024-07-31 16:35:47
691
原创 Android Display Graphics #BufferQueue与Gralloc
Surface的构造函数会传入生产者模型 GraphicBufferProducer,这使Surface对象拥有了操作缓冲区的能力。构造函数中Surface也提供了一系列hook为首的函数,连接到ANativeWindow的函数指针,为的是给EGL模块提供对缓冲区操作的入口。BLASTBufferItemConsumer 具有监听Buffer所有状态的能力,BBQ对Buffer特定状态的监听离不开 BLASTBufferItemConsumer ,因此,BBQ 继承了两个抽象类。3、简化 SF 中的模型。
2024-07-31 16:33:40
1019
原创 Android Display Graphics #User APP的绘制与WMS
APP在调用ViewRootImpl#setView()方法时,首次请求VSync信号。当有显示内容时,会调用到ViewRootImpl#doTraversal()方法执行绘制,这个函数包含了View三个绘制Step:measure、layout、draw。添加一个window,就是 WMS 为其分配一块 Surface 的过程。measure()方法计算每一个View的大小,执行完成后,各View的大小也随之确定了。WindowManagerService(WMS)窗口管理服务,管理系统中所有的窗口。
2024-07-31 16:31:18
305
原创 Android Display Graphics #从Activity看surface的创建(2)
Surface创建标志明确了要创建哪种Surface和特定的选项,比如Surface可以被认为是不透明的,是否应该在初始的时候隐藏。一个好的实践是,首先使用HIDDEN标志创建Surface,接着打开一个Transactionn,设置Surface的layer、layer堆栈、透明度、位置,然后再合适的时机调用Transaction.show,最后关闭Transactoin。如果这个Surface没有buffer或者是crop,那么这个Surface就是无边界的,只被它的父Surface的界限尺寸所限制。
2024-07-31 16:29:45
674
原创 Android Display Graphics #从Activity看surface的创建(1)
Activity是Android系统的应用组件,一般情况下,开发者显示的内容是通过Activity展示的。Activity的创建呢,可以理解为3给个对象的创建:Window、DecorView、ViewRootImpl。在Code para#1段 L18-L21行的代码调用了Activity的attach()和onCreate();这里的onCreate就调用到了Activity的onCreate,创建一个出来。// 如果主线程的消息循环意外退出,则抛出异常。// 调用每个进程的主模块初始化。
2024-07-31 16:26:38
870
原创 Android Display Graphics #2 整体框架介绍二
前面说了,Surface理解为存储数据的内存块,实际上Surface表示缓冲区队列BufferQueue的生产者角色,而缓冲区队列BufferQueue一般被SurfaceFlinger消费掉,也就是说SurfaceFlinger扮演的是缓冲区队列BufferQueue的消费者。• 代表的是图像数据的消费者。• 计算窗口大小,位置等,并传递相应的参数到SurfaceFlinger,SurfaceFlinger根据这些Window Metadata信息,设置窗口Window的大小、z-order等。
2024-07-31 16:24:26
711
原创 Android Display Graphics #1 整体框架介绍一
手机屏上显示的内容,2D或3D ,如果是 3D 的,不管是 App 还是游戏,或者简单的图片界面,底层都是通过 GPU、 通过 OpenGL(ES)绘制出来的。是Java层的一个类,提供了一系列API,使用这些API可以实现各种的产品经理要求的效果。显示的不同阶段对这块内存的叫法不同,在上层可以是Window、ANnativeWindow、Surface、SurfaceView、layer、buffer,这些本质上没啥区别,可以广泛意义上理解为用于显示内容的那块内存,只不过各个阶段的操作接口不同。
2024-07-31 16:20:54
800
原创 Android AV World 序
以我个人经验来讲呢,调试技巧是在解决问题中掌握的,知识点在解决问题中理解更深刻,记忆更清晰。由于功能模块属于系统底层支撑,类似于docker,涉及到音视频的处理,及Display Graphics的一些处理,需要调试解决显示花屏、黑屏、掉帧、显示虚拟化等问题。文章主要分为Android Display Graphics系列,Android Audio系列,Android Camera系列,Android Performance系列,Android 实用Skills系列。
2024-07-31 16:12:48
620
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人