Android hwcomposer服务启动流程

Android hwcomposer服务启动流程

  客户端          binder远程调用      服务端
surfaceflinger     --binder-->     hwcomposer 

在这里插入图片描述

.hal文件编译时生成支持binder进程间远程调用通信的cpp文件
在out/soong/.intermediates/hardware/interfaces/graphics/composer/2.1/
目录下找到对应的.h和.cpp文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

registerAsService()函数就是.hal编译成cpp文件时自动生成的方法,
用于注册成为服务
在out/soong/.intermediates/hardware/interfaces/graphics/composer/2.1
搜索registerAsService()能看到它的实现。

在这里插入图片描述

1)loadModule()流程

hw_get_mudule()找到模块id为hwcomposer的模块

在这里插入图片描述

HAL module 架构逻辑如下:

在这里插入图片描述
/hardware/libhardware/hardware.c
在这里插入图片描述
在这里插入图片描述
加载动态库:hwcomposer.xxx.so

https://xkzzz.com/post/55999.html  Linux动态库教程:深入理解符号表
dlopen函数用于打开指定的共享库文件
dlsym函数的功能就是可以从共享库(动态库)中
获取符号(全局变量与函数符号)地址

dlopen打开hwcomposer.xxx.so动态连接库
dlsym 在hwcomposer.xxx.so动态库中到HMI变量的地址,强制转换为指向hw_module_t的指针变量。

在这里插入图片描述

通过代码看android约定了:hal层数据结构。所以,大家按照这个约定编写代码。
Android方(甲方):通过dlsym找到类型为hw_module_t的HMI变量,
并通过HMI变量启动该模块工作。
设备生产制造方(乙方):在自己实现的hwcompoer动态库上,
实现类型为hw_module_t的HMI变量。
HAL module 架构
Android硬件抽象层有三个核心数据结构,
分别是hw_module_t , hw_module_methods_t, hw_device_t

hw_module_t 和 hw_device_t的区别是什么?
hw_module_t:是给动态库使用。
我的理解是用于代码之间的约定逻辑。
(代码间约定逻辑) (约定逻辑) (模块间session会话逻辑)
凡是用于代码之间的约定逻辑都可以成为module,
例如linux驱动开发中module_init和module_exit

hw_device_t: 该module的要实现具体功能对象。(业务逻辑)

hw_module_methods_t:代码之间的接口 (模块间session会话通信接口)

高通平台:sm8150 hwcomposer动态库的代码,声明HMI变量,且HMI变量的类型必须为hw_module_t类型或hw_module_t类型的子类。
在这里插入图片描述

如果自定义一个module结构体,第一个成员变量类型必须为hw_module_t。
因为,结构体可以强制转为第一个成员变量的类型。
放在第一个位置,相当于继承了hw_module_t。

在这里插入图片描述

2)createHalWithAdapter()流程

通过loadModule()找到hwcompoer动态库的HMI变量,传给createHalWithAdapter()
最后,调用动态库里的HMI->methods->open()打开设备,
获取到hw_device_t类型设备变量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.1)initWithDevice()
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
initDispatch(): 初始化分发器。代码之间业务功能对接函数映射表。
由于在不同模块之间,不同公司实现的代码。所以就引入函数映射表。 (甲方提供接口声明,乙方实现接口功能)
mDispatch是一个struct类型的函数映射表。
Android方(甲方):需要create layer功能,也是声明了createLayer()接口 (代码间约定逻辑)(session会话接口)
设备生产制造方(乙方):按照session会话接口实现create layer功能,把实现create layer功能填充到mDispatch函数映射表中。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
硬件抽象层模块中的自定义一个硬件设备结构体,并且第一个成员变量的类型必须为hw_device_t。
放在第一个位置,相当于继承了hw_device_t。
在这里插入图片描述
HWCSession继承hwc2_device_t,hwc2_device_t继承hw_device_t
也即:HWCSession的父类是hw_device_t
C++:封装,继承,多态
HWCSession子类转化为父类hw_device_t后,调用到的getFunction()函数就是子类 HWCSession::GetFunction()
在这里插入图片描述

3)createComposer()流程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/252188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(三)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 模型构建3. 模型训练及保存1)模型训练2)模型保存 4. 模型生成1)模型导入及调用2)相关代码(1)布局文件(2&#xff…

LCR 120. 寻找文件副本

解题思路&#xff1a; 利用增强for循环遍历documents&#xff0c;将遇见的id加入hmap中&#xff0c;如果id在hamp中存在&#xff0c;则直接返回id class Solution {public int findRepeatDocument(int[] documents) {Set<Integer> hmapnew HashSet<>();for(int d…

插入排序----希尔排序

希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有记录分成个gap组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xff0c;取&#xff0c;重复上述分组和排序…

千亿露酒市场的未来之“露”

执笔 | 尼 奥 编辑 | 扬 灵 12月15日&#xff0c;以“以美为酿&#xff0c;品致未来”为主题的中国露酒产业发展大会暨露酒价值论坛在“中国酒都”宜宾举办。 近年来&#xff0c;露酒产业发展异军突起&#xff0c;市场销售规模超越黄酒、葡萄酒品类&#xff0c;成为中国酒…

【Qt QML 入门】TextEdit

TextEdit可以显示多行可编辑的格式化文。默认是无边框的&#xff0c;可以和父控件完美融合。 import QtQuick import QtQuick.Window import QtQuick.ControlsWindow {id: winwidth: 800height: 600visible: trueTextEdit {id: textEditanchors.centerIn: parenttext: "He…

Sentinel使用详解

组件简介 Sentinel是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景&#xff0c;例如秒杀、消息削峰填谷、集群流量控…

翻译: LLM工具使用和代理Tool use and agents

欢迎来到本周的最后一个视频。在这个视频中&#xff0c;我想与您分享LLM&#xff08;大型语言模型&#xff09;开始能够使用工具的情况&#xff0c;以及讨论一下前沿的“代理”主题&#xff0c;这是让LLM自己决定下一步采取什么行动的领域。让我们来看看。在早期的食物订单接收…

操作系统期末复习-内存管理

一、内存管理 分页存储管理&#xff0c;是将一个进程的逻辑地址空间分成若干个大小相等的片&#xff0c;称为页面或页&#xff0c;并为各页加以编号&#xff0c;从0开始&#xff0c;如第0页、第1页等。相应地&#xff0c;也把内存空间分成与页面相同大小的若干个存储块&#xf…

人工智能文本分类

在本文中&#xff0c;我们全面探讨了文本分类技术的发展历程、基本原理、关键技术、深度学习的应用&#xff0c;以及从RNN到Transformer的技术演进。文章详细介绍了各种模型的原理和实战应用&#xff0c;旨在提供对文本分类技术深入理解的全面视角。 一、引言 文本分类作为人工…

交叉熵在机器学习里做损失的意义

交叉熵是机器学习中常用的损失函数之一&#xff0c;特别适用于分类任务。其背后的核心思想是衡量两个概率分布之间的差异。在分类问题中&#xff0c;通常有一个真实分布&#xff08;ground truth distribution&#xff09;和一个模型预测的分布&#xff08;predicted distribut…

knime 安装Regex Extractor节点

1、在File中&#xff0c;找到install knime extensions 2、接着输入palladian&#xff0c;然后选择select all&#xff0c;最后点击next就可以了&#xff0c;等待安装就可以了 3、然后重启knime就可以看到了Regex Extractor节点

整理了上百个开源中文大语言模型,涵盖模型、应用、数据集、微调、部署、评测

自ChatGPT为代表的大语言模型&#xff08;Large Language Model, LLM&#xff09;出现以后&#xff0c;由于其惊人的类通用人工智能&#xff08;AGI&#xff09;的能力&#xff0c;掀起了新一轮自然语言处理领域的研究和应用的浪潮。 尤其是以ChatGLM、LLaMA等平民玩家都能跑起…

PADS9.5 : 原理图电源网络 和 地网 络添加

原理图电源网络 和 地网 络添加 添加电源网络 1、点击连线 2、2、连线 3、3、连线时&#xff0c;右键 4、4、点击电源&#xff0c;因为该网络已经有3.3v&#xff0c;它会弹出网络确认&#xff0c;确定即可&#xff0c;如果 需要其他电源网络&#xff0c;双击即可修改 5、双击…

Impala4.x源码阅读笔记(一)——HdfsTextScanner解析

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 在文章Impala3.4源码阅读笔记&#xff08;七…

环形链表Ⅱ 双指针 Java版本

文章目录 题目解题思路代码 题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环…

期货股市联动(期股联动助推资本市场上扬)

期股联动——期货股市助推资本市场上扬 随着我国资本市场的不断发展&#xff0c;期货和股票这两个市场也在逐渐紧密地联系起来。期货和股票的相互作用是一种“期股联动”&#xff0c;它能够促进资本市场的上扬。 期货与股票市场 期货市场是一种标准化的场外交易市场&#xf…

【JavaEE】多线程(4) -- 单例模式

目录 什么是设计模式? 1.饿汉模式 2.懒汉模式 线程安全问题 什么是设计模式? 设计模式好⽐象棋中的 "棋谱". 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀ 些固定的套路. 按照套路来⾛局势就不会吃亏. 软件开发中也有很多常⻅的 "问题…

如何使用Lychee结合内网穿透搭建本地私人图床网站并实现远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

架构设计系列之基础设施能力建设

周末聊两句&#xff1a; 今天将的基础设施能力建设部分&#xff0c;一般的架构书籍中都不存在的部分&#xff0c;这是我在实践过程中的经验和能力总结部分&#xff0c;希望和大家有一个很好的交流自从在 WeChat 中开了订阅号的两周半的时间&#xff0c;非常感谢大家的支持&…