当前位置: 首页 > news >正文

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

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

相关文章:

  • B01、JVM与Java体系结构-01
  • 深入学习《大学计算机》系列之第1章 1.2节——问题描述与抽象
  • SearchWP WordPress高级网站内容搜索插件(包含所有专业扩展)
  • 2023年全球运维大会(GOPS深圳站)-核心PPT资料下载
  • flutter学习-day13-功能型组件和状态共享
  • ImageNet 数据集介绍
  • LLM Agent发展演进历史(观看metagpt视频笔记)
  • python读取excel数据 附实战代码
  • 剑指offer 背包问题求具体方案
  • python接口自动化测试(单元测试方法)
  • 【UE5.1 MetaHuman】使用mixamo_converter把Mixamo的动画重定向给MetaHuman使用
  • Android多进程和跨进程通讯方式
  • 频谱论文:面向频谱地图构建的频谱态势生成技术研究
  • oracle aq java jms使用(数据类型为XMLTYPE)
  • 使用AppleScript自动滚动预览
  • 时间复杂度分析经典问题——最大子序列和
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 0x05 Python数据分析,Anaconda八斩刀
  • CSS 提示工具(Tooltip)
  • HTTP那些事
  • Java 内存分配及垃圾回收机制初探
  • Java多线程(4):使用线程池执行定时任务
  • linux学习笔记
  • Lsb图片隐写
  • PhantomJS 安装
  • python 学习笔记 - Queue Pipes,进程间通讯
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 缓存与缓冲
  • 前端面试题总结
  • 设计模式 开闭原则
  • 试着探索高并发下的系统架构面貌
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 协程
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​如何在iOS手机上查看应用日志
  • ​什么是bug?bug的源头在哪里?
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #pragma data_seg 共享数据区(转)
  • #QT(QCharts绘制曲线)
  • (02)vite环境变量配置
  • (C++17) std算法之执行策略 execution
  • (Java企业 / 公司项目)点赞业务系统设计-批量查询点赞状态(二)
  • (纯JS)图片裁剪
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (接口自动化)Python3操作MySQL数据库
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十八)三元表达式和列表解析
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)Docker基本介绍
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法