- 博客(331)
- 资源 (1)
- 收藏
- 关注
原创 Android相机-架构3
1)捕获的异步请求来自于框架。2)HAL 设备必须按顺序处理请求。对于每个请求,均生成输出结果元数据以及一个或多个输出图像缓冲区。3)请求和结果以及后续请求引用的信息流遵守先进先出规则。4)指定请求的所有输出的时间戳必须完全相同,以便框架可以根据需要将它们匹配在一起。5)所有捕获配置和状态(不包括 3A 例程)都包含在请求和结果中。图5. 相机HAL图中的 1-9 代表这从request到result的顺序,最先的请求1,得到了结果也是排在最前面的。
2023-09-09 03:42:04
2032
1
原创 Android图形-Hardware Composer HAL
HWC HAL是用于合成从Surfaceflinger接收到的图层,而分担GLES和GPU执行合成的压力,提升整体性能和效率HWC可以抽象出 overlays 和 2D blitter 对象来合成Surface,或者与特定窗口硬件通信来合成窗口。使用HWC来合成该窗口而不是用surfaceflinger通过GPU来合成原因?1)大部分GPU没有为合成优化2)当使用Surfaceflinger通过GPU来合成layers 时,应用是无法用GPU来做渲染的工作的。
2023-09-06 21:02:30
8493
1
原创 Android图形-组件-比较与理解
受硬件保护的路径必须显示在硬件混合渲染器叠加层上(也就是说,如果硬件混合渲染器切换到 OpenGL ES 合成,受保护的视频将从屏幕中消失)。与 Surface 配合使用的一些客户端需要 SurfaceHolder,因为用于获取和设置 Surface 参数的 API 是通过 SurfaceHolder 实现的。在需要渲染到单独的 Surface(例如,使用 Camera API 或 OpenGL ES 上下文进行渲染)时,使用 SurfaceView 进行渲染很有帮助。
2023-09-05 19:51:54
1073
原创 Android图形-架构2
BufferQueue 和 Gralloc:1)Bufferqueue 连接 图像流的生产者和消费者2)通过HAL层接口实现gralloc内存分配器用于执行缓冲区分配任务1)SurfaceFlinger接受来自多个源的数据缓冲区,然后将它们进行合成2)HWC 使用硬件合成缓冲区3)虚拟显示屏使合成输出可在系统内部使用(录屏或者通过网络发送屏幕)1)Surface可生成一个缓冲区队列,通常是给Surfaceflinger使用的。可以渲染到Surface上,最终传给消费者缓冲区。
2023-09-05 01:01:13
726
原创 Android图形-架构1
因此,在 SurfaceFlinger 将一个或两个缓冲区合成到第三个缓冲区中的过程中,它会使用 OpenGL ES。第三,有些图层是可以直接提交给HWC进行合成的,有些是通过SurfaceFlinger进行合成,然后再提交到HWC进行最终合成的;2)图像流消耗:图像流的消耗方是Surfaceflinger,该系统服务会消耗当前可见的 Surface,并使用窗口管理器中提供的信息将它们合成到屏幕。第二,从图2看出是通过GPU进行渲染,并且通过BufferQueue进行生产方和消费方的流转管理。
2023-09-05 00:14:06
533
原创 Multimedia-播放器-架构2
有了缓冲区,对于各个线程而言,直接使用的数据还是缓冲区的数据,所以只要缓冲区有数据,线程就可以开工正常处理自己的工作。单个线程处理的时候,会有网络延迟,处理延迟等因素,必然让CPU在延迟的时候无任务可做,只能待机等待任务,这样就会导致CPU的使用效率大大降低。对于解码线程和渲染线程而言,直接使用的数据就是缓冲区的数据,当有网络抖动等,读文件线程没有数据源数据时,还可以依靠缓冲区的数据正常运行,待异常恢复后又可以继续进行数据缓冲。然而,多个线程的工作结果怎么实现需要的串行化的处理的效果呢?
2023-08-31 22:07:32
1023
原创 Android系统-线程-synchronized和volatile的区别
synchronized 和 volatile 都是线程同步涉及到的概念。理解和掌握好他们的区别有助于我们对代码逻辑的理解。
2023-08-30 10:46:51
239
原创 Android系统-性能-优化概述
刚才说的卡顿是用户直观感知的,从显示的角度看卡顿问题的话就是丢帧掉帧引起的。由于性能影响因素多,比如本文分类的APP,内存,网络,卡顿都是互相影响的。避免内存泄露:长生命周期的对象引用了短生命周期的对象。线程问题:将AsyncTask和Runnable设为静态内部类或独立出来,在线程内部采用弱引用保存Context引用。静态变量问题:将内部类设为静态内部类或独立出来使用context.applicationContext()使用proGuard代码混淆工具,包括压缩,优化,混淆等功能。
2023-08-26 01:23:47
569
原创 Android相机-架构2
大概流程:open,创建session,发送request,得到captureresultCameraManager,获取系统服务CameraService,打开相机:1)openCamera:打开相机获取相机信息:ICameraService.getCameraInfo实例化一个CameraDeviceImpl通过ICameraService的connectDevice方法,参数包括CameraDevice.StateCallback,传入CameraService。
2023-08-24 16:12:03
934
1
原创 Android相机-HAL-Rockchip-hal3
对于Android相机的 HAL层而言对上实现一套Framework的API接口,对下通过V4L2框架实现与kernel的交互。不同的平台会有不同的实现方案。主要是对Android HAL3的接口的实现。看看rockchip是怎么支持hal3的?
2023-08-24 01:20:50
2031
原创 Android相机-HAL子系统
pipeline是虚拟的,整个相机数据的处理流程跟管道是一样的。支持多种不同的算法和运算顺序,不会影响质量,效率和跨设备的兼容性。ISP又包含有:热像素校准,去马赛克,降噪,阴影校准,几何校准,色差校准,边缘增强,色调曲线调整,CameraSensor,ISP,统计信息,3A算法,Bayer处理,Jpeg处理,YUV处理。第1种、完成拍照或者摄像后,重新设置,重新下发请求,则会重新进行配流重新获取数据。指定请求的所有输出的时间戳必须完全相同,以便框架可以根据需要将它们匹配在一起。
2023-08-23 00:58:40
1407
原创 Android相机-架构
实现适用于CameraProvider,CameraDevice,CameraDeviceSession。提供相当于 CameraDevice 和 CameraCaptureSession 类的原生类。主要是针对CameraAPI v2 + HAL3的架构对Android相机系统进行梳理。HAL层是位于相机驱动和Android Frameworks之间。提供CameraService调用的相机硬件运行标准接口的实现。HAL定义了必须实现的接口,以便应用可以正确地操作相机硬件。App和FrameWork。
2023-08-23 00:53:42
1000
原创 docker搭建opengrok环境2
docker container ls -all:查看docker中目前在运行的container。虚拟机关闭后重新开启,理论上是需要重新启动一下docker的,以重新启动其中的服务。docker images:查看docker中现有的镜像。
2023-08-21 19:37:12
604
原创 Android系统-进程-AIDL
Android系统的进程间通信,主要是Binder,AIDL就是一种Android接口定义语言,主要就是为了能更简单方便地实现跨进程通信。
2023-08-17 23:34:48
204
原创 833-字符串中查找与替换
你会得到一个字符串s(索引从 0 开始),你必须对它执行k个替换操作。替换操作以三个长度均为kindicessourcestargets。要完成第isources[i]sindices[i]targets[i]例如,如果s = "abcd",那么替换的结果将是" eee cd"。所有替换操作必须发生,这意味着替换操作不应该影响彼此的索引。测试用例保证元素间。s = "abc""ab""bc"在对s执行所有替换操作后返回。是字符串中连续的字符序列。"eeebffff"
2023-08-16 00:30:24
236
原创 1. 两数之和
3、结果条件:i下标的对应的数值 + j下标的对应的数值 = 给定的目标值target。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。2、暴力查找:其中i从0开始,j从i+1开始,条件都是:不大于数组长度。整数,并返回它们的数组下标。1、定义两个下标参数:i,j。你可以按任意顺序返回答案。,请你在该数组中找出。
2023-08-14 12:58:20
305
原创 617-合并二叉树
给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,null 的节点将直接作为新二叉树的节点。返回合并后的二叉树。合并过程必须从两个树的根节点开始。
2023-08-14 12:29:30
128
原创 docker搭建opengrok环境
用习惯了opengrok的方式看AOSP的源码,其他的在线查看源码的网站用起来都不是很理想。所以考虑搭建一个环境。首先网上看了下opengrok的环境搭建的方式,最终还是采用docker的方式来搭建,这样可以避免跟现有的环境冲突。用起来的感受还是相当的nice的。因为现在属于局域网的方式,速度那叫一个快!一路上没有遇到什么问题。强烈推荐大家用这种方式了。
2023-08-14 01:13:20
537
原创 Android系统-进程-Binder2-Java层
对于Android系统,一般是从java层到native层,再到kernel驱动层,形成一个完整的软件架构。Android系统中的Binder IPC通信机制的整体架构,从java层到底层驱动层是怎么样的一个架构和原理的呢?
2023-08-12 18:44:18
247
原创 Android系统-ServiceManager2
1)ProcessState::self():用于获取ProcessState对象(也是单例模式),每个进程有且只有一个ProcessState对象,存在则直接返回,不存在则创建;如果对象存在则直接返回,对象不存在就创建该对象。2)getContextObject(): 用于获取BpBinder对象,对于handle=0的BpBinder对象,存在则直接返回,不存在才创建;defaultServiceManager 等价于 new BpServiceManager(new BpBinder(0));
2023-08-12 18:09:05
283
原创 Android系统-ServiceManager1
1、没有采用libbinder中的多线程模型来与Binder驱动通信,而是通过自信编写的binder.c直接和Binder驱动通信,并且只有一个循环binder_loop来读取和处理事务,这样才能保持简单高效。6)死亡通知:当binder所在的进程死亡后,会调用binder_release然后调用binder_node_release。2)注册成上下文管理者:binder_become_context_manager。5)注册服务:根据服务名称注册,如果服务已注册,重新注册前会先移除之前的注册信息。
2023-08-12 14:20:01
273
原创 Android系统-进程-Binder1-概述
Android的binder是从openbinder发展过来的。包括了binder驱动,Native层,Java层。用经典问题作为对binder的理解之旅的起点。为什么选择binder?binder性能好,便捷,安全。性能好,就是别人多次拷贝,binder只需要一次拷贝。
2023-08-12 12:31:11
647
原创 Android图形-Vsync机制
当Vsync信号来的时候,就会唤醒EventThread线程,执行所有注册到EventThread的connection的分发出去,就是通过BitTube的mSendFd分发出去,分发出去后mReceivedFd就能接收到数据。那么如果刷新率>帧率,那么就是说,出图的速度低于屏幕刷新的速度,这是就会造成刷新的时候经常出现读取到的图像数据是同一幅图像的数据,但刷新率
2023-08-11 20:27:45
509
原创 Android图形-合成与显示-SurfaceTestDemo
通过一个最简单的测试程序直观Android系统的native层Surface的渲染显示过程。
2023-08-11 12:46:14
822
原创 Android系统-线程-线程同步
1、使用锁对象:通过使用ReentrantLock,synchronized关键字锁对象,实现线程同步。2、volatile关键字:声明一个volatile变量可以保证其对所有线程的可见性,每次写入操作都会强制刷新缓存。这种方法只适用于只有一个线程进行写操作,其他线程进行读操作的情况3、使用wait/notify机制:wait/notify机制是一种高级的,灵活的线程同步方法。
2023-08-11 09:47:29
714
原创 Android图形-合成与显示-概论
Activity是Android的主要UI相关组件,通过View的相关类和接口实现,在WMS的管理下,进行窗口和控件的测量,布局和绘制,形成的图层交给SurfaceFlinger进行合成渲染,然后提供给屏幕进行显示。
2023-08-11 01:08:06
1142
原创 Android图形-刷新与显示
在Android系统中,绘制是由应用app来做的,对应CPU的操作,合成与渲染是由SurfaceFlinger完成,对应的是GPU。我们从视图描述看,第2帧的性能优化的不错,远远小于16ms,但是这一帧之所以会没能在16ms内完成绘制渲染提供缓存出来,是因为这一帧绘制的比较晚,导致这一帧还没有绘制完成就到了16ms了,这就是掉帧。如果只有一个缓存,那么屏幕在还没有读完缓存数据的时候,系统服务又在写缓存数据,那么屏幕读取的这一帧数据其实就包含了两帧的数据,显示出来的可能一半是第一帧,一半是第二帧数据了。
2023-08-05 13:36:02
791
原创 Off-CPU分析
采用通常作为每个CPU计时器中断,然后检查当前正在运行的中断进程,生成On-CPU profile,一个Off-CPU采样器需要不同的方式工作:在每个应用程序线程中设置计时器以唤醒他们并捕获堆栈,或者让内核按一定间隔遍历所有线程并捕获其堆栈。Off-CPU的分析是一种性能分析的方法,用于测量和研究Off-CPU的时间以及堆栈跟踪等上下文。在这里,我们的目标是阻塞和Off-CPU的时间段。在本节中,主要介绍Off-CPU时间作为指标,并总结Off-CPU的分析的技术,作为Off-CPU的示例实例。
2023-04-26 23:19:25
1044
原创 eBPF技术介绍
eBPF程序是事件驱动的,当内核或应用程序通过某个挂接点时 运行。预定义的挂钩包括:系统调用函数进入/退出内核跟踪点网络事件和其他一些。如果不存在用于特定需求的预定义挂钩,则可以创建内核探针(kprobe)或用户探针(uprobe),以将eBPF程序连接到内核或用户应用程序中的几乎任何位置。
2023-04-25 17:03:31
1527
原创 BPF技术整理笔记
21年因为项目需求而要开发一个工具,可以满足:故障排查,问题分析,统计数据等需要。开始实现的比较简单,就是针对抓取的log数据进行各个维测数据的解析和处理。具有如下几种缺陷:1、log内容主要还是借助于简单的printf和printk的内容,这类打印信息量不足。主要是release的版本不可能有太多此类的信息,否则会严重影响系统的性能。2、信息量少也意味着无法有效支撑问题问题的相关信息追溯,无法进行有效的数据统计。因此很多监控和买点方案就无法有效实现。3、无法将工具有效整合到整个软件开发工程中去。
2023-04-24 23:29:48
725
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人