Android hwcomposer服务启动流程

news2024/12/23 0:51:37

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()流程

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时序预测 | Python实现GRU电力需求预测

时序预测 | Python实现GRU电力需求预测 目录 时序预测 | Python实现GRU电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前最先进的行业预测进行比较。使用该…

【如何提取React项目中的公共模块,多个项目共用】

文章目录 目录 前言 一、创建公共模块 二、初始化公共模块 三、给公共模块添加内容 四、添加对公共模块的依赖 五、使用公共模块里的资源 后记 前言 在工作中经常会遇到这样的需求,有个React项目,代码分为客户端,管理端两份&#xff…

04 python函数

4.1 函数的快速开发体验 """ 演示,快速体验函数的开发和使用 """#需求,统计字符串的长度,不使用内置函数len()str1 itheima str2 itcast str3 python#定义一个计数的变量 count 0 for i in str1:count 1…

【高级网络程序设计】Block1总结

这一个Block分为四个部分,第一部分是Introduction to Threads and Concurrency ,第二部分是Interruptting and Terminating a Thread,第三部分是Keep Threads safety:the volatile variable and locks,第四部分是Beyon…

RabbitMQ不公平分发问题分析及问题解决

1.不公平分发 1.1 不公平分发策略是什么? 在 RabbitMQ 中,不公平分发(Unfair Dispatch)是指当多个消费者(Consumers)同时订阅同一个队列(Queue)时,消息的分发机制是不公…

把文化注入品牌,五粮液荣获“全国企业文化优秀成果特等奖”

执笔 | 萧 萧 编辑 | 扬 灵 12月15日,以“塑造优秀企业文化,凝聚企业发展力量”为主题的全国企业文化年会(2023)首次在长江首城、中国酒都、中国动力电池之都宜宾盛大举行。 凭借“弘扬和美文化,谱写高质量发展新篇章”成果…

2018年AMC8数学竞赛真题的典型考点和详细解析

从战争中学习战争最有效。前几天,六分成长分析了2023年、2022年、2020、2019年的AMC8的典型考题、考点和详细答案解析。今天继续为大家分享2018年的AMC8的五道典型考题。 欢迎您查看历史文章了解之前各年的真题解析,本系列会持续更新,直到大家…

Linux:进程地址空间

目录 1.程序地址空间 2.进程地址空间 1.程序地址空间 我们在讲C/C语言的时候,32位平台下,我们见过这样的空间布局图 我们来验证一下这张图的正确性: int un_gval;int init_gval100;int main(int argc, char* argv[],char* env[]){//代码…

Nat. Mach. Intell. | 通过深度神经网络联合建模多个切片来构建一个三维全生物体空间图谱

今天为大家介绍的是来自Angela Ruohao Wu 和Can Yang团队的一篇论文。空间转录组学(ST)技术正在革新探索组织空间结构的方式。目前,ST数据分析通常局限于单个二维(2D)组织切片,这限制了我们理解在三维&…

【ArkTS】入门

代码结构分析 struct Index{ } 「自定义组件:可复用的UI单元」 xxx 「装饰器:用来装饰类结构、方法、变量」 Entry 标记当前组件是入口组件(该组件可被独立访问,通俗来讲:它自己就是一个页面)Component 用…

【后端学前端】第四天 css动画 垂直轮播效果(css变量、位移缩放动画、动画延迟)

1、学习信息 视频地址&#xff1a;css动画 垂直轮播效果&#xff08;css变量、位移缩放动画、动画延迟&#xff09;_哔哩哔哩_bilibili 2、源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title…

QT for Android安卓编译环境搭建+首次编译3个大坑

1、安装 编译环境能否搭建成功&#xff0c;主要是看各个依赖软件的版本是否匹配。依赖的软件有3个&#xff1a;JDK、安卓SDK、安卓NDK。 我的qt版本是5.14.1&#xff0c;我亲测以下版本可以成功让编译安卓&#xff1a; QT5.14 JDK1.8.0 安卓SDK26.1 安卓NDK20.1 在QT-&g…

爬虫 scrapy ——scrapy shell调试及下载当当网数据(十一)

目录 一、scrapy shell 1.什么是scrapy shell&#xff1f; 2.安装 ipython 3.使用scrapy shell 二、当当网案例 1.在items.py中定义数据结构 2.在dang.py中解析数据 3.使用pipeline保存 4.多条管道的使用 5.多页下载 参考 一、scrapy shell 1.什么是scrapy shell&am…

VBA即用型代码手册之工作薄的创建及保存

我给VBA下的定义&#xff1a;VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率&#xff0c;而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想&#xff0c;积木编程最重要的是积木如何搭建…

python封装执行cmd命令的方法

一、前置说明 在自动化时&#xff0c;经常需要使用命令行工具与系统进行交互&#xff0c;因此可以使用python封装一个执行cmd命令的方法。 二、代码实现 import subprocess import timefrom common.exception import RunCMDError from common.logger import loggerclass Cmd…

Nat Med | 白血病患儿持续存在CD19 CAR-T细胞的转录特征

今天给同学们分享一篇实验文章“Transcriptional signatures associated with persisting CD19 CAR-T cells in children with leukemia ”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; 研究队列和实验概述 作者研究了15例高…

网络编程day2作业

1.tcp实现通信 服务器&#xff1a; //tcp服务端#include <head.h>#define SERPORT 8888 #define IP "192.168.125.6"int main(int argc, const char *argv[]) { //1.创建套接字int sfdsocket(AF_INET,SOCK_STREAM,0);//2.绑定struct sockaddr_in ser;ser.sin…

java --- 集合进阶

目录 一、单列集合顶层接口 Collection 1.1 基本方法 1.2 Collection 的遍历方式 二、list集合 1.2 ArrayList Vector 底层结构 1.3 LinkedList ArrayList 和 LinkedList 比较 三、set接口 3.1、Set 接口和常用方法 3.2 HashSet HashSet 底层机制&#xff08;HashMap…

虚拟机Linux(Centos7)安装Docker

如果没有安装虚拟机的&#xff0c;可以参考这篇VMware虚拟机安装Linux操作系统&#xff08;CentOS7&#xff09; 文章目录 0.安装Docker1.CentOS安装Docker1.1.卸载&#xff08;可选&#xff09;如何看自己的虚拟机上是否安装过docker&#xff1f; 1.2.安装docker1.3.启动docke…

pytest之allure测试报告02:allure具体使用方法

一、allure包含的方法 二、allure使用教程 &#xff08;1&#xff09;用例中写入allure方法 allure.epic("数据进制项目epic") allure.feature("手机号模块feature") class TestMobile:allure.story("杭州的手机号story")allure.title("测…