Ahao's Technical Blog Ahao's Technical Blog
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

阿豪讲Framework

不积跬步无以至千里
首页
  • 001.基础篇
  • 002.玩转AOSP篇
  • 003.学穿Binder篇
  • 004.基础组件篇
  • 005.系统启动过程分析
  • 006.Hal开发入门与实践
  • 007.显示系统
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 基础篇

  • 玩转AOSP篇

  • 学穿Binder篇

  • 基础组件篇

  • 系统启动过程分析

  • Hal开发入门与实践

    • 001.Android HAL 层概览
      • 引子
      • Android 8 以前的 HAL,传统 HAL
      • Android 8 到 Android 10 的 HIDL HAL
      • Android 11 以后的 AIDL HAL
      • 总结
      • 参考资料
    • 002.传统 Hal 开发指南1 —— 开发环境准备
    • 003.传统 Hal 开发指南2 —— 传统 HAL 整体架构
    • 004.传统 Hal 开发指南3 —— 驱动开发
    • 005.传统 Hal 开发指南4 —— 实现一个简单的 Hal 模块
    • 006.传统 Hal 开发指南5 —— 添加硬件访问服务
    • 007.传统 Hal 开发指南6 —— 开发一个 App 访问硬件服务
    • 008.HIDL HAL 开发指南1 —— 开发环境准备
    • 009.HIDL Hal 开发指南2 —— Android 8 HAL 变迁
    • 010.HIDL Hal 开发指南3 —— HIDL HAL 实例程序
    • 011.HIDL Hal 开发指南4 —— Binderized HALs 实例分析
    • 012.HIDL Hal 开发指南5 —— Passthrough HALs 实例分析
    • 013.HIDL Hal 开发指南6 —— Same-Process HALs 实例分析
    • 014.HIDL Hal 开发指南7 —— 驱动开发
    • 015.HIDL Hal 开发指南8 —— 简单 HIDL HAL 实现
    • 016.HIDL Hal 开发指南9 —— 添加硬件访问服务
    • 017.HIDL Hal 开发指南10 —— 开发一个 App 访问硬件服务
    • 018.AIDL Hal 开发指南1—— 开发环境准备
    • 019.AIDL Hal 开发指南2 —— AIDL HAL 整体架构
    • 020.AIDL Hal 开发指南 3 ———— AIDL HAL 实例分析1
    • 021.AIDL Hal 开发指南 4 ———— AIDL HAL 实例分析2
    • 022.AIDL Hal 开发指南5 —— stable-c HAL 实例分析
    • 023.AIDL Hal 开发指南6 —— 驱动开发
    • 024.AIDL Hal 开发指南7 —— 实现一个简单的 AIDL HAL
    • 025.AIDL Hal 开发指南8 —— 添加硬件访问服务
    • 026.AIDL Hal 开发指南10 —— AIDL HAL 的升级
  • 显示系统

  • Framework
  • Hal开发入门与实践
阿豪
2024-03-19
目录

001.Android HAL 层概览

# 引子

按照既定的计划,在讲解了 Activity 启动过程以后,接下来我们就要讲 Activity 的显示过程了。但是 Activity 显示过程会涉及到两个 Hal 模块 Gralloc 和 Hardware Composer,不懂话,去看代码就会很懵逼。

所以我们就先把 Hal 学了吧。

Android HAL(Hardware Abstract Layer)硬件抽象层,从字面意思可以看出是对硬件设备的抽象和封装,为 Android 在不同硬件设备提供统一的访问接口。HAL 处于 Android framework 和 Linux kernel driver 之间,HAL 存在的意义有以下 2 个方面:

  • HAL 屏蔽了不同硬件设备的差异,为 Android 提供了统一的访问硬件设备的接口。不同的硬件厂商遵循 HAL 标准来实现自己的硬件控制逻辑,Framework 开发者不必关心不同硬件设备的差异,只需要按照 HAL 提供的标准接口访问硬件就可以了。
  • HAL 层帮助硬件厂商隐藏了设备相关模块的核心细节。硬件厂商处于利益考虑,不希望公开硬件设备相关的实现细节;有了HAL层之后,他们可以把一些核心的算法之类的东西的实现放在 HAL 层,而 HAL 层位于用户空间,不属于 linux 内核,和 android 源码一样遵循的是 Apache license 协议,这个是可以不开源的。

Android 经过多年的迭代,HAL 层也经历了三个阶段:

  • Android 8 以前的 HAL,我们称之为传统 HAL
  • Android 8 到 Android 10 的 HAL,为了更好的解耦 google 和硬件厂商之间的代码,Android 8 在 HAL 中引入了 HIDL,这个阶段的 HAL,我们称之为 HIDL HAL
  • Android 11 开始,又引入了 AIDL 来简化 HDIL HAL,我们称之为 AIDL HAL

googler 你们天天刷 KPI,不考虑下游的打工仔吗?

20240313103229

# Android 8 以前的 HAL,传统 HAL

20240313103414

在这个阶段,HAL 层以 so 库的形式存在,Framework 层通过 JNI 加载到这些 so 库,然后 Framework 层通过 Binder 服务的形式向 App 提供操作硬件的接口。

# Android 8 到 Android 10 的 HIDL HAL

20240419093020

在这个阶段,HAL 层以进程加 Binder 服务的形式存在,Framework 层通过 HIDL 调用到 HAL 层的 Binder 服务,然后 Framework 层通过 Binder 服务的形式向 App 提供操作硬件的接口。

# Android 11 以后的 AIDL HAL

20240408140150

在这个阶段,HAL 层以进程加 Binder 服务的形式存在,App 除了可以通过原来的方式访问硬件,还可以直接通过 AIDL 访问到 HAL 层的 Binder 服务来操作硬件。

# 总结

google 迭代了 3 类 HAL,实际改变的就是:

  • Hal 层的存在方式
  • 层级之间的通信方式。

# 参考资料

  • Android硬件抽象层HAL总结 (opens new window)
  • AIDL for HALs实战 (opens new window)
017.Android 进程杀手 lmkd 源码分析一
002.传统 Hal 开发指南1 —— 开发环境准备

← 017.Android 进程杀手 lmkd 源码分析一 002.传统 Hal 开发指南1 —— 开发环境准备→

最近更新
01
如何调试 SurfaceFlinger
10-05
02
SurfaceFlinger 概述
10-05
03
HWC 接口分析
10-05
更多文章>
Theme by Vdoing | Copyright © 2020-2025 AHao Framework | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式