- 博客(34)
- 收藏
- 关注
原创 Android实战经验篇-内存踩踏(2)-分析方法
本章节讲述的内存踩坏的调试方法,底层思想和上述工具都是一致的,了解后可以加深对这些工具的理解。根据前面时间轴看踩内存,最终是要找出P点,但抓到的现场是在C点,那么我们就必须想方设法让P点和C点重合,也就是踩内存时就崩溃,这样就容易找问题点了。常见的方法是多申请内存,然后在前后加pattern(特殊的内容),在释放时判断pattern,检查是否还是申请时写入的值。而根据剖析的结果下对应的策略的目的就是让P点和C点重合。3、如果被踩坏,那么检查踩坏的范围,踩坏后的内容。4、根据上面的分析得出可能的类别。
2025-03-05 10:50:46
251
原创 Android实战经验篇-内存踩踏(1)-分类说明
内存踩踏发生时,程序不一定立即Crash崩溃,如果是立即Crash崩溃,那就可以直接分析Crash调用栈,修复代码解决问题了。找出踩内存代码的具体位置很难,一般踩内存和程序崩溃没有任何关系,这就指数级增加了调试难度,所以解决问题前有必要深入了解踩内存的原理。strcpy()复制了11个字节(包括'\0'),但p只有10个字节的空间,把p后面的1个字节踩坏了。那么,如何从C推导出P是解决踩内存的关键,我们先要研究C当下内存踩坏的情况来判断可能的原因。2.1 根据踩坏的内存和你的内存的关系分类。
2025-03-05 09:59:44
587
原创 Android实战经验篇-AndroidScrcpyClient使用说明
适用于两个网络互通的Android设备上投屏场景,如上使用示意图;Android Y设备的显示内容需要投射到Android X设备上;则ScrcpyAndroidClient_v1.0.apk 安装到Android X设备;scrcpy-server.jar 在Android Y设备上运行;
2025-02-07 18:06:47
792
原创 Android实战经验篇-玩转Selinux(详解版)
但是她又没有学习过以前的课程,所以不能赋予她 w 权限,怕她改错了目录中的内容,所以学员 st 的权限就是 r-x。班级中的每个学员都可以访问和修改这个目录,老师也需要对这个目录拥有访问和修改权限,其他班级的学员当然不能访问这个目录。在使用 ACL 权限给用户 st 陚予权限时,st 既不是 /project 目录的属主,也不是属组,仅仅赋予用户 st 针对此目录的 r-x 权限。如下图,user是test,group是test,去写一个root权限的readme.txt文件,就是没权限的。
2025-01-24 21:14:27
1019
原创 Android实战经验篇-AndroidScrcpyClient投屏一
优秀的开源的scrcpy投屏方案,目前只支持Windows、Linux、MacOS平台,是不支持android平台的。也就是说没有android平台的client端,无法实现从android到android的投屏。本方案是基于scrcpy的app源码,将其移植到com.android.scrcpyclient.apk中,scrcpy的主要代码流程未改动。
2025-01-21 19:01:50
276
原创 Android实战经验篇-增加系统分区
在target_ap/device/qcom/sepolicy_vndr/qva/vendor/lahaina/file_contexts 文件中增加设备的context;修改target_ap/device/qcom/common/generate_extra_images.mk文件,在编译时生成new.img。从该命令行回显的内容中可以看到,新分区 new 挂载在/mnt/vendor。修改fstab,使init在挂载分区时,可以挂载new分区,并挂载到/mnt/vendor/new路径下。
2025-01-08 17:02:57
1599
原创 Android实战经验篇-USB Camera支持
Android13 上默认Kernel也是支持USB免驱Camera的,可以看到/dev/videoX设备节点,而且其base代码中也是有对应hal服务的bin文件的。一般的免驱USB Camera都是V4l2架构的,在Linux Kernel上已完全支持,即可以看到Camera对应的/dev/videoX的设备节点。如上标红的帧率和 帧大小是需要关注的。
2025-01-07 18:18:34
1335
原创 Android实战经验篇-busybox小工具
俗话说“工欲善其事,必先利其器!” 在原生Android系统中,提供的基础调试命令是基于toybox的。支持的命令不够全面,而BusyBox 提供了更全面的命令工具,尤其在文件操作、权限管理、网络调试、压缩解压和系统管理方面比 Toybox 功能更强大。
2024-12-17 18:09:48
480
原创 Android 车载虚拟化底层技术-Kernel 5.15 -Android13(multi-cards)技术实现
对于Linux和Android来说,只要是多屏(>=2)显示的场景都可以显示虚拟化。只是大部分场景对显示稳定性没有要求,系统异常了就都不显示了。但对于容器相关方案,或要求显示隔离的场景,是需要进行显示虚拟化的。
2024-12-12 17:51:18
1431
原创 Android 车载虚拟化底层技术-Kernel 5.10 -Android12(multi-cards)技术实现
对于Linux和Android来说,只要是多屏(>=2)显示的场景都可以显示虚拟化。只是大部分场景对显示稳定性没有要求,系统异常了就都不显示了。但对于容器相关方案,或要求显示隔离的场景,是需要进行显示虚拟化的。
2024-12-11 19:26:36
1360
原创 Android 车载虚拟化底层技术-Kernel 5.4 -Android12(双card)技术实现
对于Linux和Android来说,只要是多屏(>=2)显示的场景都可以显示虚拟化。只是大部分场景对显示稳定性没有要求,系统异常了就都不显示了。但对于容器相关方案,或要求显示隔离的场景,是需要进行显示虚拟化的。
2024-12-03 14:53:15
985
原创 Android 车载虚拟化底层技术-Kernel4.19-Android10(双card)技术实现
例如DP的显示业务比较单一,就可以只分配"plane-2"和"plane-5"。在Kernel 4.19版本上,kernel/msm-4.19/drivers/gpu/drm/路径下msm-lease文件夹已经不存在了。将上个平台的msm-lease文件放到kernel/msm-4.19/drivers/gpu/drm/路径下,并在内核中增加默认配置。移植multi-card的前置条件是,DSI屏和DP屏的驱动已经调试正常,单card(android默认)下是显示相同内容的。
2024-12-02 19:48:05
945
原创 Android 车载虚拟化底层技术-qcm6125_Android10(双card)总览
在6125Android10上,一般使用的是4.14的内核,其中是包含了msm-lease的代码的。Register成了 msm_lease_drm的module,提供在mode_probe时解析resource中配置的plane放入card中。=================方案实现详情及修改patch见公众号或下方链接=====================Card 的lease流程,通过debug 发现涉及到的内核比较多,流程较为复杂。对于一些显示屏,可能未支持modetest的方式。
2024-11-29 17:36:29
826
原创 Android 车载虚拟化底层技术-显示虚拟化(双card)总览
但实际芯片的屏接口数量有限。但对于容器相关方案,或要求显示隔离的场景,是需要进行显示虚拟化的。一般的Android系统或Linux系统自带的SDK包是不支持虚拟化的,需要跟芯片厂商共同调试,实现kernel层的/dev/dri/card的虚拟化。上面的每个虚拟屏,配置成功后,其实使用的还是同一个/dev/dri/card0. 默认情况下Android系统会镜像primary屏的显示。=================方案实现详情及修改patch见公众号或下方链接=====================
2024-10-02 17:10:44
1659
原创 Android Display性能问题教战手册5-SF/HWC内存使用问题
在Android中Buffer需要在多个进程间传递使用的Module有很多, 但用量比较明显,无法回避的主要都在MM相关module中, 其中显示Graphic图形使用的Buffer是最为频繁的, Buffer会在。在meminfo中的 EGL mtrack 部分就是代表 dma buf的用量, 如果这部分用量异常则需要厘清dma buf的使用情况。dma-buf是一个多进程间的buffer共享的机制, 本节主要介绍针对display部分相关的dma-buf如何做初步的分析。
2024-09-23 16:23:42
1328
原创 Android Display性能问题教战手册4-典型案例分析
3,按照理解,在新的一帧Buffer没有Ready,还没有Config到driver之前,3,此题根据我们的梳理,问题出现在Launcher,比较明显的是如下图中。,所以这帧SF无法使用这个Buffer,见第一张图的。,表示这一帧的Launcher的Buffer。2,应用的进入和退出参与的图层主要就是应用的。,那么首先就要明确发生问题的trace段,触发的,说明是前一个用#1 Buffer的。),表示这个Layer没有被更新,所以。的位置,#1才被present出去(这一帧的处理见图中标示,应该是到。
2024-09-23 14:52:08
1076
原创 Android Display性能问题教战手册3
在code中位置如下:shift的值一般为sf_duration/period,具体可以直接查看trace中的打印值。以此trace为例,sfWorkDuration为15.1,period是90hz,最终结果:shift=1。本文主要讲解duration与system显示行为分析相关的调试技巧,通过图文详解各个关键分析点。,这里的shift值表示从当前帧开始往前check的帧数。那一帧的合成状况,则应该就是已经完成的。帧,当前的N+1是会延迟送HWC的。的也并非刚才画完的N+1帧,而。
2024-09-20 19:54:28
1046
原创 Android Display性能问题教战手册2
● waiting for GPU completion和waiting for HWC release后面的数字是Fence计数的idx, 但互相之间。BufferQueue的核心逻辑就是Buffer的轮转使用,分析问题必须要学会通过Trace看BufferQueue轮转的状况。● 它monitor的是某一个Surface所用Buffer的Fence,也就是。2,按照我们对A点意义的认知,到下一帧被显示出来的。1,如下图就是典型的体现轮转的Trace,如果是由于GPU绘制慢影响到整体的,那么应当是。
2024-09-13 14:30:27
1352
原创 Android Display性能问题分析指导手册I
BufferTx ----- 看合成重要辅助Tag,DrawFrame里queueBuffer以后BufferTx会增加,SF起来响应拿走Buffer合成时会减少。Surfaceflinger ----- 直接响应VSYNC-sf,合成的发起者,system_server的service之一。Choregrapher ----- 直接响应VSYNC-app,与VSYNC-app应该对齐。● VSYNC-app 是控制绘制过程帧率的,VSYNC-sf 是控制合成过程的帧率的。
2024-09-12 18:23:45
1082
原创 Android显示异常-合成类型问题详解
如果没有特别指定,则SF会默认先设定所有Layer为DEVICE合成,然后通过HWC来query平台的能力,平台根据自身能力来决定接受哪些Layer为DEVICE合成,其他的视为超过平台能力,就会标记变成CLIENT合成。HRT是最后一道关卡,如果Layer在以上过程都未被标记CLIENT,HRT是最后一道关卡,一些与平台真正的硬件能力强相关的查询,或需要实时查询系统能力的部分会在这里做最后的判定。5、app/UI ------ 其他app/UI直接指定的强推。
2024-08-31 17:13:31
1129
原创 Android显示异常问题处理指导手册4-Debugging Tools
如果是camera或者video场景,会有.yv12或者其他格式的surfacetexture,这时候需要用特殊的工具解析,可使用7yuv.exe查看。BQ dump 脚本通常分两个,脚本all_bqdump_P.bat只抓一帧,适合问题必现的场景,all_cont_bqdump_P.bat可以连续抓10帧,适合一闪而过的issue。注意:在抓取的过程中,画面会停住不动,抓完后恢复。》》》》》》》》》 文章详情,请关注公众号 》》》》》》》》》》
2024-08-31 15:17:19
1278
原创 Android显示异常问题处理指导手册3-Debugging Guide
● 其中的 Window animation/Transition animation/Animator duration scale 选项,可以让一些过场动画变慢,对于在过场中出现一帧异常的情况,adb shell screenrecord --bugreport /sdcard/test.mp4 //这个录像左上角会有timestamp。可以看能否通过改变以上选项让异常帧出现停留的时间变长,方便进一步debug。1、 Google开发者选项。
2024-08-31 15:13:24
600
原创 Android显示异常问题处理指导手册I-(Multimedia数据流)
除了做BQ Dump,也可以dump decode output 直接看给surfacefliger或者GPU的surfacetexture是否正常。如video场景一样,如果不抓BQ dump,可抓camera output 看camera送出来的数据是否正常。如果关掉硬件加速,会推给CPU skia 绘制,遇到这种问题,根据上一篇文章知道流程,即可知道哪个模块有问题。由于app写法不一,这里介绍的是最常见的,如遇复杂场景,可以通过抓取systrace了解其flow。1、普通UI的数据流。
2024-08-31 15:08:51
359
原创 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
901
原创 Android Display Graphics #实践小例子
listener 是生产者的监听器,api 是使用的 API 类型,producerControlledByApp 指示生产者是否由应用控制,output 包含连接后的返回信息。slot 是缓冲区的插槽编号,input 包含缓冲区的信息,output 包含提交后的返回信息。创建一个缓冲区队列,并使用上面创建的Surface作为初始化参数,实现了Surface和BBQ的绑定。slot 是缓冲区的插槽编号,buf 是返回的缓冲区对象。使用获取到的宽高,通过createSurface()创建Surface。
2024-07-31 16:47:39
702
原创 Android .rc规则详解与init 启动
C++/java都是面向对象的语言,init语言是面向行的,就是一行就是一个语句。只有两种方式可以保证一个服务运行于另一个服务之前。import关键字不是命令,而是它自己的部分,这意味着它不是作为Action的一部分发生,而是作为正在解析的文件处理导入,并遵循以下逻辑。用于覆盖之前定义的同名服务,一般用于/odm 覆盖 /vendor的,init使用最后一个override定义的服务。导入path路径的rc文件给init解析,如果是一个文件夹,只解析当前路径下的所有rc文件,不会解析包含的子文件夹。
2024-07-31 16:35:47
1920
原创 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
1150
原创 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
340
原创 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
726
原创 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
912
原创 Android Display Graphics #2 整体框架介绍二
前面说了,Surface理解为存储数据的内存块,实际上Surface表示缓冲区队列BufferQueue的生产者角色,而缓冲区队列BufferQueue一般被SurfaceFlinger消费掉,也就是说SurfaceFlinger扮演的是缓冲区队列BufferQueue的消费者。• 代表的是图像数据的消费者。• 计算窗口大小,位置等,并传递相应的参数到SurfaceFlinger,SurfaceFlinger根据这些Window Metadata信息,设置窗口Window的大小、z-order等。
2024-07-31 16:24:26
870
原创 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
951
原创 Android AV World 序
以我个人经验来讲呢,调试技巧是在解决问题中掌握的,知识点在解决问题中理解更深刻,记忆更清晰。由于功能模块属于系统底层支撑,类似于docker,涉及到音视频的处理,及Display Graphics的一些处理,需要调试解决显示花屏、黑屏、掉帧、显示虚拟化等问题。文章主要分为Android Display Graphics系列,Android Audio系列,Android Camera系列,Android Performance系列,Android 实用Skills系列。
2024-07-31 16:12:48
658
scrcpy-android投屏客户端+Android投屏+Android设备间相互投屏
2025-02-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人