- 博客(237)
- 资源 (3)
- 问答 (1)
- 收藏
- 关注
转载 安卓14/aosp14相比安卓13录屏多了MirrorRoot深入剖析解密-千里马android framework实战开发
到这里,就把学员提出的录屏时候Mirror问题前后版本出现与不出现的原因搞清楚了,整体其实探索出来了结果后并不是很复杂,但是如果要自己去探索还是有一定的难度的。虽然有难度,马哥还是希望大家平时遇到相关的技术疑问时候不要轻易放弃或者完全不管,应该努力用自己学习知识应用起来,结合起来,去分析实际开发中遇到一些问题。只有这样不断探索,技术才会不断成长,成长到有一天你发现你对这个模块理解深入程度基本上也不输给任何人的时候,你就是这方面的顶级专家。本文章更多详细代码和资料需要购买课程获取。
2024-03-12 14:55:16 25
转载 ActivityRecordInputSink深入剖析全网独家分析
可以看到Activity的窗口显示大小就是touchableRegion=[0,0][1080,2160]即和屏幕大小一样,而ActivityRecordInputSink大小是touchableRegion=[-10799,-21599][10800,21600]明显比手机屏幕大很多,这种Activity大小和手机手机屏幕一样,触摸事件正常都不可能到这里。上图展示的Activity大小和手机屏幕大小一样,所以手机触摸事件根本到达不了ActivityRecordInputSink这个地方。
2024-03-12 14:53:17 28 1
转载 c++基础知识之父类地址和基类地址一定相同?
是不是可以认为这里RefBase在incStrong of后面打印的this肯定和上面的LayerHandle打印的this一样?这种层级较多,不过层级多不影响分析,我们用java思维当然可以认为RefBase里面的this和LayerHandle类中使用的this是同一个。明显可以看到StrongClass的this地址 0x728c48faa700但是RefBase的地址是0x728c48faa708。为啥上面的LayerHandle的this就是和Refbase的this不一样呢?
2024-03-12 14:51:03 16
转载 MirrorLayer可以正常触摸屏幕原理分析
在多屏互动时候有一个屏幕的画面是一个MirrorLayer,另一个屏幕画面是真实的,即2个屏幕上有一个是MirrorLayer,这个时候疑问就来了,经过在aosp13上体验发现,两个屏幕画面都可以正常接受触摸事件进行正常的事件响应。到这里就可以理解为啥两个屏幕各自的mirrorlayer和正常layer都可以正常接受触摸事件的原因,因为在input派发选择窗口,遍历window时候,都对应是同一个windowinfo。这里的inputInfo就是最为关键的信息,也就是最后传递给input端的关键点。
2024-03-04 12:03:30 32
转载 c++基础语法之future,promise,async详细讲解-SurfaceFlinger学习必备c++知识
std::promise用来包装一个值将数据和future绑定起来,为获取线程函数中的某个值提供便利,取值是间接通过promise内部提供的future来获取的,也就是说promise的层次比future高。这个问题回答其实可以考虑一下future的获取,future都是需要几个固定的异步线程调用方式,比如async这种,但是很多时候不喜欢用这种异步方式,那么自然也就没办法获取future,所以为了future的获取更加灵活方便,就需要有这个promise对象。
2024-03-04 12:01:43 58
转载 Ubuntu上VScode编译c++基础学习指南-SurfaceFlinger实战必备基础知识
1、使用vi、gedit等代码编辑工具进行编辑,然后使用命令gcc或者Makefile等进行编译,即编写代码和编译是分开的,一般编写代码也没啥代码错误提示等,只有命令编译时候才可以发现错误,这种方式相对来说适合少量修改代码,不适合大量写代码的情况。aosp相关native模块,比如input,SurfaceFlinger等,经常阅读会遇到一些陌生库函数或者类,可能这个时候想要查询这个库函数相关的详情进行学习,类似课程讲解linux库函数有个man手册一样东西。选着第一个GDB既可以,选着后又弹出如下。
2024-02-26 14:39:41 46
转载 c++之function和bind详解-SurfaceFlinger学习必备语法基础
function是一个通用的函数对象容器,可以存储任意可调用对象(函数、函数指针、成员函数、成员变量、lambda表达式,任何function对象,比如一个类,定义了operator()),并提供了一致的接口来调用这些对象。通过function,可以将一个函数或函数对象作为参数传递给其他函数或存储在容器中,大大提高了灵活性。参数解释:Ret:代表调用function的返回结果的类型Args:代表是参数的类型。demo展示:1、function存储函数指针方式return a*2;
2024-02-26 14:37:22 53
转载 hal/SurfaceFlinger/perfetto实战需求问题探讨作业-千里马framework开发
截图分享可以选定某个特定窗口进行,这个和上面的录屏其实基本上类似一个场景,就是截图时候有会存在只需要截图固定窗口window的,不需要其他window的情况,同样游戏主播进行直播这个情况,截图时候希望只有游戏画面就可以,游戏画面上面的其他app的窗口不希望在截图中。经常分析一些显示问题时候,会想要dumpsys各个图层,但是dumpsys SurfaceFlinger命令一般来说只是有相关的图层信息,是文本类的信息,所以有时候黑屏或者显示 异常情况就比较难看出来是不是自己图层本身上帧有问题。
2024-02-22 15:39:50 23
转载 深入理解input命令只支持单指,是否可以修改实现多指?-千里马android framework实战开发
执行完成后手机画面一般就会响应一个click事件,这里发现一般都是一个手指,一直寻找看看input命令是否可以支持多个手指通过命令同时按下操作的情况,发现并没有这种多指的触摸的命令。pointId1 x y --pointId0代表具体手指索引,可以区分不一样手指,一般0开始,x,y代表是触摸事件的坐标位置。input tap命令只是进行传递了x,y坐标值,并没有传递多指相关的任何id,所以是不支持的多指的。考虑设置一个可以多指点击命令项,暂时命名叫做multiple-tap。看看这里sendTap。
2024-02-22 15:37:43 25
转载 BLAST深入源码剖析
进行queue动作完成后,紧接着就是runInSync执行,这个方法参数非常关键,代表是一个同步事务等待同步后进行回调执行的部分,而且这个时候会有一个Transaction的参数,里面就包含了相关WindowContainer的绘制相关事务。注意对于prepareSync属于WindowContainer的基类方法,Task没有实现那就是默认WindowContainer实现的,所以一直会调用到有自己实现的WindowState的。
2024-02-21 16:13:27 32
转载 Ubuntu上安装VMware+win11系统手册
Linux 版下载地址:https://www.vmware.com/go/getworkstation-linux。再出现下面界面其实也没问题,等一会就行,然后会出现如下界面。私聊作者+v(androidframework007)剩下其他步骤一步步点击既可以,最后上传成功的图片。出现如下界面其实没有关系,等一会。按一下enter其实就可以继续。
2024-02-21 16:11:48 26
转载 SurfaceFlinger的commit/handleTransaction分析
hi,粉丝朋友们:大家好!本节我们来讲解一下SurfaceFlinger主要合成工作的第一个阶段任务commit一般SurfaceFlinger端的合成工作主要有两个1.commit主要就是处理app端发起的一系列transaction的事务请求,需要对这些请求进行识别是否当前帧处理,处理过程就是把事务中的属性取出,然后更新到Layer中,偶buffer更新的还需要进行相关的latchbuffer操作。
2024-02-21 16:10:19 65
转载 OutputLayer的析构方法解读
看到了finalizePendingOutputLayers明显好像没啥啊,没看到有调用destroyLayer啊,但是Trace中确实有展示对应destroyLayer,这个是为啥?赋值时候就会导致mCurrentOutputLayersOrderedByZ析构,从而一系列的析构方法回调。执行collectVisibleLayers时候具体还会触发destroyLayer操作,还是个跨进程的。私聊作者+v(androidframework007)堆栈打印出来就很明显啦,那就是在。
2024-02-21 16:06:59 24
转载 HAL/SurfaceFlinger专题之HWC和GPU合成部分更新通知
hal/surfaceflinger/perfetto专题,马哥经过若干天的努力,终于把sf最重要合成部分搞定,上传平台审核完成。私聊作者+v(androidframework007)1、surfaceflinger相关的实战小项目。2、补充一些selinux部分的基础。目前已经到课74节课时。
2024-02-21 16:04:59 7
转载 skia实现动态差异录屏截图logo添加-千里马SurfaceFlinger专题实战项目背景介绍
总体思路就是上图所说的,需要对针对skia,或者opengl渲染时候进行hook,然后添加上自己的logo既可以,当然实现这个需求,必须要求你对surfaceflinger代码和framework的wms的代码非常熟悉才可以搞定,具体实现代码和详细方案可以看我视频哈。综上:不修改sf框架等基本上是不可能可以实现该需求的,针对很多新手小白同学不知道framework具体做啥,是不是上面这个需求就要求你一定要深入了解系统,修改系统才可以实现。2、需要在投屏,录屏时候有品牌logo。这种方案基本上明显不可行。
2024-02-21 16:02:29 27
转载 binder线程安全即读取线程池部分剖析
即只需要简单看看多个client 请求时候服务端onTransact的调用情况,如果说多个client请求onTransact方法还是按顺序一个个请求执行,那么就代表是线程安全的,如果onTransact方法出现多个同时执行,那么就代表非线程安全,这里需要针对onTransact的方法做一点特殊处理,即要在onTransact中故意加一个耗时延时,让onTransact执行时间久一点,那样方便验证,不然可能存在onTransact执行太快无法确认的情况。
2024-02-18 14:48:50 28
转载 多屏模式输入法可以正确切换屏幕展示原理剖析
整个多屏输入法的流程涉及到了3个进程---->焦点app发起startInputAsyncOnWindowFocusGain------>systemserver stop老的service,start新service-------->输入法进程创建新的service onCreate执行------->输入法创建带有display的context-------->创建对于输入法窗口带有新的display更多framework干货获取相关可以 私聊+v(androidframework007)
2024-02-18 14:47:34 48
转载 android framework实战之VNDK深入剖析
官方:解释:即给vendor分区的native程序提供的开发套件,包含了被vendor的native需要使用的一系列的库。
2024-02-18 14:45:20 66
转载 hal深入剖析之aidl实战-android framework车机车载手机系统开发
创建最重要的aidl接口文件,需要在第一步创建的目录下`-- mytest编写aidl内容:String key;int value;还是就是parcelable都是需要进行结构化,成员属性写清楚到aidl。
2024-02-18 14:44:18 66
转载 android hal aidl升级部分-android framework车载手机系统开发
第一版本的aidl没有指定版本,只有一个aidl_api下面current文件夹即默认就是版本v1,那么如果后面有相关的接口修改呢?大概就是修改时候一定要考虑老版本的兼容问题,一般不删除原来接口和修改。可以看到这里的版本多了版本1,而且还带有hash号文件。Android.bp需要把原来V1版本的库变成V2。执行后相关的aidl_api目录多个一个版本目录。MyTestImpl.cpp增加相关方法实现。可以看到out临时文件目录多了V2相关的库。MyTestImpl.h增加相关方法引入。
2024-02-18 14:43:30 21
转载 StatusBar、NavigationBar窗口显示在Activity下面之aosp14窗口类bug线索征集
近来的国际学员又有个窗口类bug求助马哥。这次的bug现象就不是说什么黑屏啥的,是一个窗口有覆盖的情况。这个需要有代码详细打出相关的堆栈进行准确定位寻找根本原因,所以这里就需要各位有条件学员兄弟帮忙啦。不过比较遗憾是现在我们还没有aosp14的有源码的真机,因为这个bug还必须要真机。所以我这边暂时没有复现这个bug的条件,所以这里需要广大粉丝朋友们公司有aosp真机代码的兄弟可以帮忙提供线索。,都可以滴滴我哈,或者发群里,很多学员们就喜欢这种有难度和技术含量的bug来锻炼自己能力。国际学员提供复现视频。
2024-02-18 14:42:30 18
转载 perfetto/systrace基础知识讲解-千里马android framework实战开发
一般perfetto看trace时候都会针对某一个进程进行查看其运行,因为perfetto/systrace都是以进程为单位进行划分的,每个进程又分为若干个线程,接下来又是主要看一个个的线程情况。这个部分和线程没啥关系,即不是说有单独一个线程在专门计数这个,可以理解为一个程序里面全局的一个变量值展示,比如在surfaceflinger的vsync时候就用到了。在一些分析trace过程中涉及多个行需要联合分析,多个行的距离太远,没办法方便的对比查看,这个时候可以把关心的几个行都进行置顶查看。
2024-02-18 14:41:28 96
转载 SurfaceControl及SurfaceFlinger中的Layer创建过程深入剖析
其实Client本质是一个Binder对象的BpBinder即跨进程的代理,远端的BnBinder在SurfaceFlinger的Client.cpp。看下SurfaceComposerClient构造时候会与sf进行跨进程createConnection创建链接,返回的对象就是Client对象。SurfaceComposerClient对象是在哪里创建的呢?这里的SurfaceSession是在哪里创建的呢?sf端就是简单创建了一个Client对象,这里来看看。这里的mClient是谁呢?
2024-02-18 14:40:38 19
转载 手机大厂的自由窗口freeform功能基于aosp14/安卓14适配完成-千里马android framework实战开发
近期有个马哥学员刚好求助马哥一个关于以前马哥课程里面自由窗口项目,这个项目在android 13上做的,但是他们公司是aosp14,希望我能帮忙尽快升级到14。今年2023年已经块过去了,各个手机厂商已经开始适配aosp14,甚至有的是已经适配完成,明年市场就大部分手机出厂就都是android 14了。马哥课程中自由窗口效果可以看出来基本和国内手机各个大厂自由窗口效果是不是大体相同,课程实现是带大家手把手进行实现的。1、把原来的自由窗口自己的顶部栏显示等,独立成了一个窗口,移植到了如下目录。
2024-02-18 14:39:36 29
转载 SurfaceControl之Transaction事物深入剖析-android framework实战开发
layer_state_t结构体用来代表Layer图层的的相关信息,SurfaceControl与sf的Layer共用这个layer_state_t结构体,layer_state_t包括layer所有属性主要成员如下:可以看到常见的主要属性:坐标,长宽,变换矩阵,变化值what,flags,mask等,一般是一个图层就有一个layer_state_t结构体。
2024-02-18 14:38:42 56
转载 Hal深入实战/perfetto-systrace实战/SurfaceFlinger合集-安卓framework开发实战开发
比如surfaceflingre模块深入分析需要用到hal相关的模块,比如mapper,hwc等,所以说去分析surfaceflinger就必须要有一定hal基础比较好,还有就是perfetto,大家可能会以为他只是个性能优化工具。核心思路就是讲解清楚perfetto相关的基础知识,学会怎么看perfetto的trace,及怎么自己加和打印tag和trace等,有了这些知识后再会结合相关的业务来练习怎么看perfetto,比如surfaceflinger就是一个学习实战看perfetto的很好案例。
2024-02-18 14:37:49 29
转载 BLASTBufferQueue源码深入理解
updateActiveBuffer方法会对mPreviousReleaseCallbackId这个变量进行赋值,大家注意这里的为啥叫做前一帧的CallbackId,因为下面这个updateActiveBuffer就是赋值是先进行的mPreviousReleaseCallbackId赋值,然后才进行的新buffer的赋值,所以这个mPreviousReleaseCallbackId其实上一个的buffer的Id,不是当前这次的。这里的mPreviousReleaseCallbackId是哪里来的呢?
2024-02-18 14:36:50 51
转载 千里马2023年终总结-android framework实战
2023年开始全职做课程后,有了更多时间投入到framework的课程研发,可以把在公司里面的很多丰富经验都放到课程中来分享给大家。大专题课程都是经过非常严格的调研,主要调研因素有以下几个:1、这个专题课程马哥自己是不是有这方面比较深入的经验分享,比如马哥经常在公司里面处理wms闪黑等疑难问题,这类经验属于不太可能从网络学得到的,也基本上很少程序员知道也不可能外传的有用“绝招”,这种在我课程里会毫无保留地分享给大家。
2024-02-18 14:35:32 35
转载 App/Sf的Vsync部分源码流程结合perfetto/systrace分析
hi,粉丝朋友们:本节将使用perfetto的trace来巩固Vsync的源码分析的部分的流程。具体抓取trace方法及相关操作建议:a.抓取trace期间需要主要不能让画面一直刷新,因为这样一直刷新不方便看vsync的结束和开始b.建议选着桌面,滑动桌面一下后停止1左右,再继续滑动,尽量让抓取的trace可以有如下图的间隔效果c.需要在surfaceflinger中额外补充自己加的一些ATRACE代码方便追踪流程。
2024-02-18 14:33:28 43
转载 SurfaceFlinger的硬件Vsync深入分析-千里马android framework车机手机系统开发
故才会在surfaceflinger的systrace出现如下校准波形图,这个可以看到硬件vsync开启后才有hw的vsync的脉冲产生,这个刚好可以看到成对的一上一下脉冲刚好6个,也就是经常看到的6个周期的,经过这个6个硬件vsync的校准后,软件vsync就可以调整正常。,这个都不是事分分钟可以看的懂这个逻辑,核心的就是观察相关的vsync的fd,有数据变化了,读取,属于vsync了就触发相关的,vsync回调,这个就是hal的vsync回调。但是问题又来了,请问是谁触发了这个fd有数据的啊?
2024-02-18 14:33:05 30
转载 android 10车载桌面ActivityView触摸事件源码详解分析
所以这里的就会存在在CarLauncher上面显示两个Activity,一个是桌面自己,一个是地图绿色的Activity,但是大家注意哈,这里的绿色区域的地图Activity明显属于另一个display,这里我们是知道的触摸都是每个display独立的,即多屏display显示都是有各自display的触摸节点。看这里触摸事件时候大家是不是发现明明这个displayId居然还是0,明显不太和逻辑是吧,,,正常触摸事件是不是应该为displayId = 1(假设虚拟屏幕是displayId = 1)
2024-02-17 16:36:57 26
转载 hidl hwbinder和binder混合使用相关的joinThreadPool问题解答
所以很多时候并不需要在自己的业务代码中显式调用的相关的joinRpcThreadpool和startThreadPool相关方法,因为在hidl相关生成的代码中会调用相关读取hwbinder线程池启动。所以大家在看代码时候发现自己业务代码中没有hwbinder相关的线程池启动,但实际有相关hwbinder线程则可以考虑去相关的hidl生成代码中查找。
2024-02-17 16:35:50 18
转载 hwbinder与binder返回值差异之IPCThreadState原理剖析
中的Error error, Display display,PixelFormat format一共3个参数,正常return的话一般都是一个参数,要返回3个那得自己包装对于的对象,或者是吧返回值放到参数中,指针方式填入。上面都是Bp端对多参数返回的一些处理分析,但在分析Bn源码时候,也发现Bn端也有这个多参数返回值相关的回调参数传递,上面不是说了不是远端的回调吗?如果generates返回参数只有一个,而且这个参数类型还是基础数据类型,那么就不会通过回调方式返回,而是直接以返回值方式返回。
2024-02-17 16:34:34 16
转载 深入分析TaskView源码之触摸相关
明显发现触摸派发window层级方面还是以桌面为顶部window,地图为底下window,这样其实也可以理解,我们上面的说的情况一样,其实整个画面都是CarLauncher的,地图Activity也只是CarLauncher的一个View而已。这里就说明了CarLauncher虽然在顶部,但是他的touchRegion根本没有包含地图Activity的区域,所以派发事件时候根本不会抢地图Activity的,即地图区域的事件不会派发到桌面。2、TaskView的Activity是怎么可以接收事件的呢?
2024-02-17 16:33:49 25
转载 自学成为android framework工程师需要准备哪些装备-千里马车载车机系统开发学习
目前高版本的aosp版本编译都是耗费内存巨大的,所以这里的建议内存最少要有16G,内存不足,那么导致的结果那就是,经常编译源码时候无故退出,停止,oom等,这个时候最简单方式加内存条,不加那就只能减少make的线程,比如make -j 1,单线程编译让编译过那块的耗内存任务。具体需要什么配置呢?建议intel cpu(amd cpu也可以),一般都可以满足,越多核越好,这个是影响你编译速度关键,差异也巨大,比如学员里面编译8.1的老代码为例,有的编译源码10小时,有的16分钟。不然你就只能保留一套代码。
2024-02-17 16:32:54 22
转载 HIDL实战开发-千里马android framework车载车技手机系统开发
上面default默认生成的bp是so,这里要把他变成可执行的服务,需要增加一个service.cpp作为main方法载体。需要在自己设备目录找到自己的manifest.xml然后加入自己的hidl。只需要在hardware/interfaces执行如下命令既可以。只需要在hardware/interfaces执行如下命令既可以。"1.0/test"就是新加入的,不加入编译会报错始终找不到目标。主要目的是把test目录的Android.bp可以加入编译。执行后生成如下Test.cpp,Test.h文件了。
2024-02-17 16:32:11 13
转载 Android 经典hal开发实战-千里马android framework车载车机手机系统开发
上面的load方法就是我们说的hardware动态性的关键,它是在运行时候才真正依赖具体硬件抽象so,编译期间只需要依赖公共的hardware相关公共类既可以,不需要so,所以这里就给硬件抽象提供商带来很大灵活性,哪怕硬件厂商不提供也一般会有一个default的so保证不会产生什么严重的崩溃和强依赖问题,大大减低了aosp的代码对于硬件抽象的各个厂商的耦合性。在结构体 hw_module_methods_t 中只有一个成员,它是一个函数指针,名字是open,它主要作用就是用来打开硬件抽象层中给的硬件设备。
2024-02-17 16:31:19 17
转载 android framework分屏“官方”黑屏bug问题发现,你会分析吗?-千里马实战作业挑战
上面就是一个非常真实的企业实战的bug,而且也很经典,很符合很多人修改framework的需求的情况,毕竟大家都很喜欢看到快速修改效果,这期间很可能你会去百度啥的copy人家代码,跑起来了就一顿开心,可是往往没有深入理解透彻,可能就是你挖出天坑第一步,后面测试一测相关引入的bug,就是对你前面偷懒的惩罚哈哈哈,总之告诉你,想彻底掌握那么就必须要全面理解。我就改了个配置而已,为啥会引入个黑屏的bug,这下完蛋了,压根不知道为啥引入的啊,修改就那么简单两句代码而已。一切都完美,准备公司得表扬了。
2024-02-17 16:30:32 22
转载 systrace/perfetto抓取方式分享
近来有一些同学反馈性能分析,现在大部分都是其实已经开始使用perfetto了,连sdk上都已经找不到哦systrace相关工具,让马哥可以分享一些这个相关内容,其实以前企业里面那时候大部分都是使用老版本systrace的,相比新版本的perfetto确实功能上要差一些,今天就带大家来探索一下相关的perfetto抓取方法。这里没有采用chrome浏览器直接抓取方式,而是使用了的源码的中自带的record_android_trace工具。以上抓取后直接自己会打开相关的chrome的浏览器。
2024-02-17 16:28:57 37
android framework高级实战视频课程相关课件
2022-05-21
Android Framework最好的学习视频
2021-05-21
TA创建的收藏夹 TA关注的收藏夹
TA关注的人