- 博客(44)
- 收藏
- 关注
原创 Flutter UI构建渲染(4)
之前我们介绍了FlutterUI的核心元素,包括Widget,Element,RenderObject,Layer。而这一节我们就来介绍一下Flutter是怎么构建这些元素,并且调用组件定义的布局绘制方法,最终渲染合成上屏的。
2024-11-06 21:57:07
1092
1
原创 Flutter UI架构(3)
Flutter使用dart语言来构建维护UI数据,然后通过Impeller渲染引擎来进行UI渲染,在学习源码之前,我们先来了解一下Flutter的UI框架的大体架构,这样后面再学习源码可以事半功倍。
2024-11-04 21:55:27
1008
原创 Flutter启动流程(2)
我们还是从Flutter在Android上启动流程来学习Flutter,只要学习了启动流程,就会对Flutter的实现有一些理解,否则像Flutter,RN这些对于原生应用开发者就像是一个黑盒子。Flutter 在Android上必然还是要依赖于Activity的,Activity启动之后应该会启动dart虚拟机,执行dart上UI节点的构建,后续UI节点构建后应该会通过绘制引擎(skia,vulkan之类的)来渲染UI,本节主要来看第一个Activity启动dart虚拟机这个流程。
2024-11-02 11:33:21
1041
原创 Flutter 简述(1)
Flutter是Google开源的应用框架,只要一套代码兼顾Android、iOS、Web、Windows、macOS和Linux六个平台,它的设计思路可以说更加先进,不像ReactNative每个组件都需要有对应的原生组件实现,而是通过skia或者其他的渲染引擎来直接渲染画面,Flutter使用dart虚拟机来实现跨平台管理UI。
2024-11-02 11:32:21
803
原创 ReactNative Fabric渲染器和组件(5)
Fabric是ReactNative中新架构最核心的模块,本章我们会来了解一下自定义一个Fabric组件,然后在JS文件中声明之后如何,是怎么映射到原生构建一个View的。关于Fabric架构理念官网已经有说明了,我们就不细说了,从实现来说,就是在JS层会有一套DOM树,这个是基于React实现的,然后在C++层会构建出一个ShadowTree,由一个个ShadowNode组成的树,最终会映射到原生的View。
2024-10-30 22:07:33
1414
原创 ReactNative JSI(4)
React Native使用JavaScript来实现UI,新架构使用的jsi来实现C/C++和JavaScript之间的互相调用,而jsi是使用JS引擎提供的api能力来实现的,如果看过前面TurboModule的介绍,应该对JSI有一些概念了,这一节我们会更加进一步去介绍JSI的实现,其实JSI的逻辑是很简单的,只不过因为有非常多的数据类型,所以有许多的业务逻辑。
2024-10-27 23:16:06
650
原创 ReactNative TurboModule(3)
本节我们介绍了TurboModule的加载流程,而且也介绍了Module中方法的绑定流程,讲述了如果从JS层调用方法最终调用到Java层,这个套逻辑是ReactNative最核心的逻辑,Fabric渲染器的核心也是通过JSI通信,只不过框架和接口的逻辑不太一样,且Fabric涉及更多的内容,Props,State等。关于TurboModule的使用ReactNative官网上有详细的流程,我们就不过多介绍了,主要来介绍一下TurboModule的组件做了什么,怎么样实现JS和Java通信的。
2024-10-27 21:32:33
1379
原创 ReactNative 启动应用(2)
本节我们来看一下ReactNative在Android上启动Activity的流程,ReactNative在Android上也是一个Apk,它的实现全部都在应用层,所以它肯定也是符合我们Android应用的启动流程的,UI页面的载体也是一个Activity,然后启动JS引擎来加载index.js,执行javascript的代码,然后javascript通过Fabric渲染器和TurboModule执行到java代码,调用到最终的Native实现,本节我们就来看一下启动的这个过程。
2024-10-27 21:30:16
1027
原创 ReactNative 简述(1)
现在比较主流的跨端开发框架就是ReactNative和Flutter,这两个框架的底层技术和思路完全不同,我们在学习完ReactNative的核心原理之后,也会去学习一下Flutter。ReactNative的跨端思路还是通过原生的组件来实现UI效果,只不过在上层使用JS来描述构建View树,这个比较明显的好处就是使用JS来编写,对于前端的研发学习成本很低,而且JS作为一个解释语言,想要实现热更新逻辑非常简单。
2024-10-27 21:29:07
864
原创 Android音视频 H264编解码原理(5)
视频编码非常的复杂,所以我们不会深究它的细节,只是了解一下它的核心原理,如果不是专门做编解码器的也没有必要去了解细节,因为对于我们上层使用它的角度来说,其实编解码这个流程能优化的并不多。编解码的核心原理并不算太复杂,它复杂的点在于它的很多处理都是需要权衡的,压缩率,算力,图像质量往往都是冲突的,所以我们可能需要针对不同的情况特性来做不同抉择,所以编码的参数非常多。
2024-10-20 16:15:27
1309
原创 Android音视频 MediaCodec框架-启动编码(4)
上一节我们介绍了MediaCodec框架创建编码器流程,编解码的流程其实基本是一样的,只是底层的最终的实现组件不同,所以我们只看启动编码流程。
2024-10-20 16:11:16
1245
原创 Android音视频 MediaCodec框架-创建流程(3)
之前我们介绍并且演示了MediaCodec的接口使用方法,我们这一节来看一下MediaCodec进行编解码的创建流程。
2024-10-20 15:44:55
1307
原创 Android视频编解码 MediaCodec使用(2)
但是编码的Input数据和解码的output数据都可以使用Surface来输入/接收,这里这个Surface虽然在java层和窗口那一章节说到的Surface一样,但是在C++层是有所区别的,这里的Surface并不是通过BLASTBufferQueue产生的,而是通过编解码器hal层生成的,但是本质来说这个Surface也就是一个BufferQueue的生产者/消费者。由于Camera的接口不是我们的重点,这里我们就随便写一下可以用就行了,很多地方写的并不标准。
2024-10-20 15:43:53
1570
原创 Android视频编解码 简述(1)
随着现在大屏幕的风潮来袭,出现了许多设备互联的需求,其中最重要的功能之一就是投屏功能,其次现在的app都离不开视频播放,这些功能的背后都少不了音视频编解码,我们这个章节就来了解一下编解码的一些知识。首先我们先来说一下为什么需要编解码,其实主要目的就是为了减少视频的大小,试想如果我们有一个10242048分辨率的视频(手机屏幕的大小差不多这个量级),我们使用RGBA来编码,一个像素4个字节,那么一个图像就是2MB。
2024-10-20 15:42:53
552
原创 OpenGL ES MVP/变换投影矩阵(8)
通过前面几节的学习,目前我们已经可以渲染自己想要的图像,也可以通过纹理加载图片进行渲染。接下来我们来学习一下MVP,这里的MVP不是Android应用开发里的框架MVP,而是Model,View,Projection。
2024-10-02 21:41:11
1630
原创 OpenGL ES 纹理(7)
glGenTextures 申请分配纹理第一个参数为需要分配纹理个数,第二个申请的纹理句柄(是一个出参),第三个是偏移glTexParameteri 配置纹理参数第一个参数是目标,一般使用GL_TEXTURE_2D,第二和第三个参数分别是需要配置的参数的名称和值。下面我们列举几个常用的参数:GL_TEXTURE_MAG_FILTER 当显示区域大于原来纹理时,如何放大图像GL_NEAREST 会使用靠近的像素作为扩增的像素(计算量小但是效果差)
2024-10-01 22:37:56
1371
原创 OpenGL ES 之EGL(6)
EGL是OpenGL ES的封装,目的是跨设备跨平台,隔离不同平台对窗口不同的实现。上一节我们基本没有使用到EGL,因为GLSurfaceView帮助我们处理了相关的逻辑,我们这一节来看一下EGL的一些概念以及接口的使用。同时我们会介绍GLSurfaceView做了什么,是怎么配置EGL等。
2024-10-01 22:34:52
825
原创 OpenGL ES 着色器(5)
着色器是在GPU上运行的程序,它会对每一个点都执行一次程序,并且计算出每个像素需要渲染的颜色,我们主要关注着色器的怎么传递数据,在OpenGL ES中,着色器传递数据分几种场景,一种是Cpu传递数据给GPU,一种是顶点缓冲区的数据传递到着色器,还有一种是顶点着色器数据传递给片段着色器。
2024-09-30 21:57:44
1653
原创 OpenGL ES 索引缓冲区(4)
本节会介绍索引缓冲区,索引缓冲区和顶点缓冲区类似,也是显存上的一段内存,只不过上面的数据用处不同,索引缓冲区故名思义里面的数据是用于索引,主要作用是用于复用顶点缓冲区里的数据。我们之前说过OpenGL渲染都是渲染三角形,如果我们想渲染一个正方形,就要通过渲染两个三角形,拼接成一个正方形,那么这两个三角形有两个顶点是重合的,如果没有索引缓冲区,两个三角形则需要六个顶点,而实际上一个正方形只有四个顶点,这里有两个顶点时数据冗余。仅仅一个正方形就有这么多冗余,那么一个复杂的游戏场景就会浪费非常多的内存。
2024-09-30 21:55:22
1290
原创 OpenGL ES 顶点缓冲区和布局(3)
顶点缓冲区的本质就是一段GPU上的显存,我们通过绑定顶点缓冲区的方式来将数据从CPU传到GPU。我们之前在绘制三角形的例子中,我们往顶点缓冲区只传入了坐标,但是其实顶点是可以包含很多数据的,比如纹理索引,颜色等,因为它的本质其实就是一个Buffer,所以我们可以使用它做非常多的事情。我们前面说了,顶点缓冲区只是一个一段内存,但是GPU并不知道这段内存里的这些数是什么意思,每个数据的含义是什么。所以我们需要告诉GPU顶点缓冲区布局,定义每个数据是什么意思。
2024-09-29 23:51:34
1486
原创 OpenGL ES 绘制一个三角形(2)
GLSurfaceView通过setRenderer暴露一个Renderer,Renderer有三个接口onSurfaceCreated/onSurfaceChanged/onDrawFrame。GLSurfaceView处理了EGL环境相关的逻辑,onDrawFrame则会控制VSync,在需要渲染的时候调用。
2024-09-28 22:11:37
1567
原创 OpenGL ES简述(1)
这个章节我们会来介绍一下OpenGL ES,学习OpenGL ES主要是为了了解GPU为我们提供了怎样的能力,Android系统中使用的是OpenGL ES,但是核心是一样的,了解OpenGL ES后我们可以对Android渲染有更深的理解。Android上我们知道我们是通过Canvas来描述一个View需要渲染成什么效果的,其实Canvas的指令最终都是由Vulkan实现的,而现在新版本中的Android,Vulkan也会将渲染指令转化成OpenGL ES的指令,以便使用GPU渲染得到硬件加速。
2024-09-28 22:07:51
738
原创 ActivityManagerService bindService(7)
Android中Service是一个非常常用的组件,尤其是系统应用开发时,Service使用甚至会比Activity的频率更高。先说一下为什么需要Service吧,在刚刚接触Android开发的时候我非常不理解Service是什么,会把他和线程搞混,认为Service的作用和一个线程差不多,当时还在想为什么需要Service,直接启动一个线程来做需要做的工作不就行了吗?
2024-09-22 16:14:48
1198
原创 ActivityManagerService 分发广播(6)
上一节我们看了发送广播流程,主要是将广播信息封装至BroadcastRecord,然后通过BroadcastQueueImpl/BroadcastQueueModernImpl的enqueueBroadcastLocked来发送广播。这一节我们来看一下AMS是怎么分发广播的流程,BroadcastQueueImpl/BroadcastQueueModernImpl是两套策略,只是分发的模式不同,我们主要关心流程,策略细节就不去关注了,我们这里就挑BroadcastQueueImpl来看一下分发的流程。
2024-09-20 23:19:24
1395
原创 ActivityManagerService 发送广播(5)
AMS主要管理的四大组件,Activity,Service,Broadcast,ContentProvider。其中Activity和Service有一定类似,ContentProvider使用的场景比较少,广播的使用场景还是比较多的,常常用于跨进程通信,在系统中系统应用和系统通信使用的更多。广播的使用非常方便,比直接使用aidl binder更加容易,所以一般如果通信频率不是非常高,都会通过广播来做进程间通信,我们这一节就来看一下app发送广播SystemServer做了什么。
2024-09-19 22:22:07
761
原创 ActivityManagerService app状态流转(4)
等生命周期,前面在介绍Activity启动流程时,我们提到过SystemServer会通过ClientTransaction来通知app更新生命周期状态变化,以前SystemServer和app会来回通信,onCreate、onResume都会通过binder回调app侧,而新版本的Android在这里做了一定的优化,SystemServer只会通过一次binder通知app要达到的最终状态,app侧会自己控制状态流转到目标状态,这样就减少了binder通信的次数。
2024-09-18 21:41:54
1013
原创 ActivityManagerService 启动进程(3)
上一节我们介绍了Activity的启动流程,这一节会在上一节的基础上介绍当要启动的Activity所在的进程之前没有启动,这个情况下是怎么样启动一个新的进程,并且继续启动Activity。我们知道Android是基于linux系统开发的,而linux系统启动一个应用进程都是通过原来的进程fork出来的,Android里面的app都是通过Zygote进程fork启动的。
2024-09-17 19:46:15
1533
原创 ActivityManagerService Activity的启动流程(2)
提到ActivityManagerService,最重要的流程之一就是启动Activity了。
2024-09-16 15:36:02
2345
原创 ActivityManagerService 简述(1)
Activity启动流程是一个非常重要的流程,它对我们理解app生命周期会有非常大的帮助,Activity启动会分两个场景,一个是进程之前并未启动的情况,需要启动进程,另一个是进程之前已经启动了,我们之需要启动Activity即可。我们会分别来看这两个情况,其中我们还可以了解到app进程是如何启动的,了解这个流程会让应用开发者对Android app进程和平时接触的四大组件有更好的理解。除此之外我们还会了解一下广播和服务是如何实现的,这两个流程相对于Activity而言会简单一些。
2024-09-16 15:33:50
538
原创 WindowManagerService 窗口动画(7)
WMS中有会有操作窗口动画的过程,这个动画的原理本质和app是一样的,就是每一个VSync不断更新窗口的属性(位置,大小,透明度等等)。我们基于窗口显示的动画,来研究一下这个流程,主要分两个流程,一个是窗口设置以及触发的点,另一个是动画的实现原理。
2024-08-05 22:41:18
1139
原创 WindowManagerService 核心函数relayout(6)
WMS中最重要的一个方法就是这个relayout,当窗口的树结构、大小等发生变化,就会通过这个方法重新计算所有窗口的位置,大小等属性。其中还包括对Insets的计算等等。这个方法触发的路径很多,app UI变化binder调用触发,窗口动画触发,WMS窗口的一些属性变化,Insets变化等等都会调用这个方法来重新对所有的窗口进行计算。
2024-08-05 22:39:10
1651
原创 WindowManagerService Inset(5)
窗口中有一个Inset的概念,比较常见的主要是状态栏,导航栏,输入法。我们先来说说Inset的作用,前面我们已经了解了WMS树是怎么管理窗口信息的,我们平时在使用app时,点击输入框后弹出输入法,输入法窗口可以把我们app窗口往上抬,前面我们知道输入法窗口所在的节点是13,14层,而app窗口所在节点是第2层,并不是父子关系或者直接的兄弟节点。这种关联如果仅仅靠之前树的结构不太好实现,Inset就是用来实现处理这种场景的。
2024-08-05 22:35:48
1399
原创 WindowManagerService添加窗口流程(4)
添加窗口流程是WMS很重要的一个功能,如果你是一个app开发,基本上接触WMS最多的场景也就是这个流程,在添加悬浮窗的时候使用的addView就是这个流程,其实activity也是通过类似的流程去添加显示的窗口的,我们会通过介绍addView这个流程了解添加窗口这个过程。和之前介绍SurfaceFlinger一样,在继续了解WMS之前,我们先来介绍一下app和WMS的binder通信架构,以便我们后面更好的了解WMS的其他流程。
2024-08-05 22:31:10
1294
原创 WindowManagerService 初始化构建(3)
之前我们看了WMS和一些数据结构,WMS就是通过WindowContainer的一些子类构建一个树结构,来管理所有的窗口的,其中比较重要的ActivityRecord对应app创建的Activity,WindowState则表示最终的窗口。这篇文章我们来看一下WMS初始化过程,了解一下WMS是怎么构造这个树结构的。
2024-08-05 22:27:59
792
原创 WindowManagerService 核心数据结构(2)
在开始看代码之前,我们先来了解一下WMS的核心数据结构,后续WMS很多的操作都是基于这些数据结构的,了解完这些类之后可以更加便于我们看具体流程代码。WMS用一个树结构来记录所有的窗口,其中里面有许多不同类型的节点,用来代表不同的业务。
2024-08-05 22:24:16
808
原创 WindowManagerService简述(1)
Android的系统服务都是运行在SystemServer里的,和GUI直接相关的主要是ActivityManagerService(后面就简称AMS)和WindowManagerService(后面就简称WMS),我们先来研究WMS,了解WMS后对学习AMS会有比较大的帮助,而且我们之前才看完SurfaceFlinger,WMS和SurfaceFlinger的关系比较紧密。 看完之前SurfaceFlinger章节后我们知道,SurfaceFlinger就是对一些layer上的内容进行合成,形成最终上
2024-08-05 22:22:03
364
原创 SurfaceFlinger 合成(8)
本节会来介绍SurfaceFlinger的核心函数:合成,这个也是SurfaceFLinger最重要的功能之一。前面我们介绍过应用的窗口怎么把图元Buffer,窗口属性传递给SurfaceFlinger,而SurfaceFlinger就是要讲这些信息整合在一起,然后讲各个应用的窗口全部都合成一个,最后送到drm驱动中去显示。这个过程有大量计算机图像绘制使用的变量,还有一些gles的使用,有的我们会简单提一下,不关心的可以跳过这些,看一下总体的流程。
2024-06-24 23:16:04
1587
1
原创 SurfaceFlinger Transcation介绍(7)
本章介绍了Transcation构造,api调用更新记录窗口属性的变化,以及最后调用apply通知SurfaceFlinger,让SurfaceFlinger请求下一个VSync信号,做下一次的合成。同时还介绍了这里的核心数据对象layer_state_t,后面我们就要开始介绍SurfaceFlinger最核心的流程,layer合成了。
2024-06-24 23:10:06
1197
3
原创 SurfaceFlinger GraphicBuffer介绍(6)
我们介绍了GraphicBuffer构造流程,它是如何通过binder到分配服务,然后调用drm的接口进行buffern分配。关于drm,如果后面有机会我们再去深入学习(估计是遥远的以后了,因为我们会先学习framework的一些核心服务,还是以android的内容为主)dma-buffer我们目前也没去深入了解,目前就是大致知道他的作用是通过物理内存buffer关联fd,然后以fd为媒介在不同驱动中流转,使得不同驱动可以共享buffer。(同样是遥远的以后可能会深入的学习他)
2024-06-24 23:09:02
2296
原创 SurfaceFlinger VSync信号(5)
app请求VSync信号并且获得回调的流程SurfaceFlinger获取VSync信号,并且获得回调的流程软件模拟的VSync是怎么校准的,如果请求硬件VSync并且得到回调。相信看完这篇文章大家对VSync有了比较深刻的了解,后面我们就要开始介绍SurfaceFlinger合成相关的逻辑了。
2024-06-24 23:07:17
2600
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人