Android的硬件接口HAL
我一直觉得,现代计算机不是一门科学,起码快算不上一门理科科学。上上下下全是人造,左左右右全是生意,用管理学,经济学去学计算机,也许更看得懂很多问题。HAL就是一个典型例子。
传统Linux绕开了微软的霸权,但是又面临GPL要开源的尴尬。谷歌为了迎合硬件资本家封闭垄断发财的愿望,所以搞了HAL这个概念。将原来在内核态的驱动,移了大部分核心内容到用户态,这样就可以封闭,可以垄断赚钱。然后因为HAL这玩意只在安卓上有,配合了安卓的硬件公司反过来又被谷歌绑架,这样一环套一环吃钱。一开始用Java,吸引广大的Java生态码农进场。现在又搞Kotlin想把码农套牢。搞这几出,是真的只是科学吗?当然不是,归根结底大部分还是生意。
我对安卓接触不久,有些理解不一定对,大家用批判的眼光看就好。有什么错误还请指正。

一 安卓硬件接口的演化
传统Linux怎么调用硬件?就是ko。。。几个函数搞定。Android复杂了很多,所以整理一下。
在安卓中,除了上面讲的HAL,还有一个就是Framework,这个就是app的framework,要理解安卓驱动层,这两点绕不开。为了适配framework,安卓把硬件是作为服务service来使用。在Android中,这种结构也进化了很多代。

1 首先是传统HAL(Legacy HAL)
在内核8.0以前使用。用户态的so貌似保存在/system/lib64,这个版本是直接读取硬件so,比较原始暴力。
App->Service->AIDL->Server->JNI->HAL so->kernel driver
2 现代HAL(Conventional HAL)
使用Iibhardware来管理so,同时下层的驱动使用一个单独的分区,so全部集成到vender.img,和system解绑。要找寻so通过libhardware这个中间层。编译时要提供一个Android.bp文件。
App->Service->AIDL->Server->JNI->Iibhardware->so(vender.img)
3 HIDL
在安卓8之后,开始使用HIDL,总的来说就是将HAL封装成服务,完全就是rpc的玩法。
HIDL编译后,会生成Android.bp(这个有时间再看看)。最后会有两个so,一个so,放在system分区;一个impl.so,放在vendor分区,以此实现framework和驱动服务的分离。客户端使用前者,服务端使用后者。服务端包含impl.so之后,会生成一个可执行程序,就可以作为一个service单独运行。客户端包含了so可以直接调用服务。
分为直通式和绑定式。有大神说直通式就是虽然使用HAL,但还是在一个进程,绑定式是使用HAL,但是数据通过Binder转发,上面说的应该就是绑定式。直通式和绑定式也都是HAL生成的代码中控制的。比如:
extern "C" IXXX* HIDL_FETCH_IXXX(const char* name);
AIDL和HIDL的中间就是安卓的framework。
App->AIDL->Service->HIDL->HAL Service->so(vender.img)
示例1,大概就是下面这种结构

Power.c往下是通过systemcall,这部分代码是封在so里面的。
PowerManagerService.cpp是封装下层的so,然后对上提供HIDL的接口。
PowerManagerService.java对下调用HIDL的接口,对上提供AIDL的接口。
DisplayPowerState.java调用AIDL的接口。
大概是这样。
示例2,下面这张图更细一点:

4 全AIDL。AIDL for HAL
(andorid11开始)。
App->AIDL->HAL Service->so(vender.img)

二 看一下AIDL和HIDL。
最新的HAL主要涉及到的主要是两个接口,AIDL和HIDL。
首先是AIDL,Android Interface definition language。看资料说是android中两个app交互的IPC方式。首先IPC有很多种,管道,域套接字,message,共享内存,问题是谷歌为什么要搞出来一套新的呢?
从一个AIDL的例子可以看到:
// IMyRemoteService.aidl
interface IMyRemoteService {int getValue();void setValue(int value);
}
一边使用:
private final IMyRemoteService.Stub mBinder = new IMyRemoteService.Stub()
另一边使用:
mRemoteService = IMyRemoteService.Stub.asInterface(iBinder);
在接口中主要定义的还是函数,也就是说比管道这些更上层,更适合Java的调用。就算上层函数调用,其实也很多方式,比如COM,soap,rpc都是干这事的。安卓应该还是用binder进行统一管理了吧,毕竟是一个单独的服务。
HIDL
主要还是提供底层cpp驱动和上层java的通信。hal文件定义如下:
// ILedService.hal
package android.hardware.led;interface ILedService {int getLedState();void setLedState(int state);
};
它的C++语法稍怪:
#include <android/hardware/led/1.0/ILedService.h>
#include <hidl/LegacySupport.h>using android::hardware::led::V1_0::ILedService;
using android::hardware::Return;
using android::hardware::Void;class LedService : public ILedService {
public:LedService() {}Return<int32_t> getLedState() override {return mLedState;}//略
};int main() {return android::hardware::configureRpcThreadpool(1, true) == android::OK &&android::hardware::registerAsService(new LedService()) == android::OK? 0: 1;
}
Java侧的倒是差不多。
在Binder的使用中,Server端继承BnInterface, Client端继承BpInterface。我接触的工程中,一边叫做BP侧,那么应该就是app侧,BN侧那么就是服务端了。
最后,写完的service可以通过rc文件,作为一个系统服务。
参考:
针对 Android 进行开发 | Android 开发者 | Android Developers
https://source.android.com/docs/core/architecture?hl=zh-cn
https://source.android.com/docs/core/architecture/aidl/aidl-hals?hl=zh-cn
AIDL for HALs - Code Inside Out
AIDL for HALs实战_hidl会被aidl代替-CSDN博客
Android HIDL 介绍学习和实战应用-CSDN博客
AIDL for HALs实战_hidl会被aidl代替-CSDN博客
HIDL 原理及使用详解-CSDN博客
Android上层与驱动交互完整篇(三)HIDL服务_android.bp hidl_interface-CSDN博客
Android HIDL学习(2) ---- HelloWorld - 简书
相关文章:
Android的硬件接口HAL
我一直觉得,现代计算机不是一门科学,起码快算不上一门理科科学。上上下下全是人造,左左右右全是生意,用管理学,经济学去学计算机,也许更看得懂很多问题。HAL就是一个典型例子。 传统Linux绕开了微软的霸权…...
【js】数组的常用方法
增加 push,unshift,splice,concat 前面三种修改原数组,concat不会修改原数组push 从后面添加数据,并返回新数组的长度unshift 从前面添加数据,并返回新数组的长度splice 可以接受三个参数,第一个参数开始位置,第二个参数是删除元素的数量,第三个参数是插入的数据concat 合并数…...
08. Nginx进阶-Nginx动静分离
简介 什么是动静分离? 通过中间件将动态请求和静态请求进行分离。分离资源,减少不必要的请求消耗,减少请求延时。 动静分离的好处 动静分离以后,即使动态服务不可用,静态资源仍不受影响。 动静分离示意图 动静分离…...
RPC--一起学习吧之架构
RPC(远程过程调用)是一种网络通信协议,它允许一台计算机(客户端)上的程序调用另一台计算机(服务器)上的程序,就像调用本地程序一样。RPC 可以使得网络中的不同进程能够相互调用&…...
服务器后端是学习java还是php
没有绝对的"最好"语言,每种后端语言都有其适用的场景和特点。以下是几种常用的后端语言: 1. Java:Java是一种通用且强大的语言,广泛用于企业级应用和大型系统。它有很好的性能和可靠性,并且具有优秀的生态系…...
DCFL: for Oriented Tiny Object Detection
文章目录 AbstractIntroductionContributionRelated Work定向目标检测微小目标检测多尺度学习标签分配上下文信息特征增强MethodOverview动态先验Coarse Prior MatchingFiner Dynamic Posterior MatchingAblation StudyAnalysis不平衡问题的调解可视化速度Conclusionhh 源代码 …...
代码学习记录11
随想录日记part11 t i m e : time: time: 2024.03.04 主要内容:今天的主要内容是深入了解栈和队列中比较难的题录类型:滑动窗口最大值与前 K K K 个高频元素,最后对于这三天学习的队列和栈的知识进行总结。…...
【LeetCode】第 387 场周赛
3069. 将元素分配到两个数组中 I 给你一个下标从 1 开始、包含 不同 整数的数组 nums ,数组长度为 n 。 你需要通过 n 次操作,将 nums 中的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操作中,将 nums[1] 追加到 arr1 。在第二次操作…...
基于 Vue3打造前台+中台通用提效解决方案(下)
47、通用组件 - 倒计时组件 特惠部分存在一个倒计时的功能,所以我们需要先处理对应的倒计时模块,并把它处理成一个通用组件。 那么对于倒计时模块我们又应该如何进行处理呢? 所谓倒计时,其实更多的是一个时间的处理,那么对于时间的处理,此时我们就需要使用到一个第三方…...
Topaz Video AI:一键提升视频品质,智能重塑影像魅力 mac/win版
Topaz Video AI是一款革命性的视频智能处理软件,它利用先进的机器学习和人工智能技术,为视频创作者提供了前所未有的视频增强和修复功能。无论您是专业视频编辑师、摄影师,还是热爱视频创作的爱好者,Topaz Video AI都能帮助您轻松…...
高效办公软件中哪个提醒待办事项更有效
在忙碌的办公环境中,每个人都像是一台精密运转的机器,处理着各种任务和待办事项。而在这其中,总有一些人,他们仿佛拥有超能力般,总是能准时、高效地完成每一项工作。他们的秘密武器是什么呢?答案就是——高…...
牛客练习赛122
D:圆 正着求删除的最小代价不好做,采用逆向思维,求选择一些不相交的线段使得构成一个圆的代价尽量大,最后答案就是所有线段权值之和减去最大代价。 那么如何求这个最大代价呢?显然区间DP 老套路:破环成链࿰…...
软考复习调整策略和学习计划!
根据软考办发布的最新通知,在群里引起了热烈讨论的是2024年度计算机技术与软件专业技术资格(水平)考试的安排。其中,信息系统项目管理师(简称高项)的考试次数从每年两次减少到只有5月份进行,而系…...
1小时网络安全事件报告要求,持安零信任如何帮助用户应急响应?
12月8日,国家网信办起草发布了《网络安全事件报告管理办法(征求意见稿)》(以下简称“办法”)。拟规定运营者在发生网络安全事件时应当及时启动应急预案进行处置。 1小时报告 按照《网络安全事件分级指南》,…...
mysql使用连接池
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、mysql连接池?二、使用步骤1.引入库 前言 提示:这里可以添加本文要记录的大概内容: 例如: 提示:…...
06. Nginx进阶-Nginx代理服务
proxy代理功能 正向代理 什么是正向代理? 正向代理(forward proxy),一个位于客户端和原始服务器之间的服务器。 工作原理 为了从原始服务器获取内容,客户端向代理发送一个请求并指定目标(即原始服务器…...
STM32 (1)
1.基本信息 stm32是由ST公司生产的一种32位微控制器(单片机)。 1.1 各种型号 stm32是32位单片机的总称,有多种不同的系列。 32即用32个比特位表示一个地址,寻址范围:0x00000000 --0xffffffff (4GB) 1.2 存储密度 …...
Spring初始(相关基础知识和概述)
Spring初始(相关基础知识和概述) 一、Spring相关基础知识(引入Spring)1.开闭原则OCP2.依赖倒置原则DIP3.控制反转IoC 二、Spring概述1.Spring 8大模块2.Spring特点2.Spring的常用jar文件 一、Spring相关基础知识(引入S…...
【Swift 周报 第四十七期
文章目录 前言新闻和社区苹果财报来袭:营收有望再创新高 巴克莱或将惨遭打脸?Apple 为在全球范围内提供迷你 App 和游戏访问的流媒体游戏服务和 App 发布新选项Swift Student Challenge 将于 2 月 5 日开放申请 提案通过的提案正在审查的提案 Swift论坛推…...
STM32(16)使用串口向电脑发送数据
发送字节 发送数组 发送字符和字符串 字符: 字符串: 字符串在电脑中以字符数组的形式存储...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
组合模式:构建树形结构的艺术
引言:处理复杂对象结构的挑战 在软件开发中,我们常遇到需要处理部分-整体层次结构的场景: 文件系统中的文件与文件夹GUI中的容器与组件组织结构中的部门与员工菜单系统中的子菜单与菜单项组合模式正是为解决这类问题而生的设计模式。它允许我们将对象组合成树形结构来表示&…...
LeetCode 2894.分类求和并作差
目录 题目: 题目描述: 题目链接: 思路: 思路一详解(遍历 判断): 思路二详解(数学规律/公式): 代码: Java思路一(遍历 判断&a…...
