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 - 简书

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3速成

文章目录 day 11. 创建vue3工程3. 响应式数据4. 计算属性 day 25. watch 监视6. watchEffect7. 标签的ref属性8. 回顾TS中的接口_泛型_自定义类型 day 1 1. 创建vue3工程 相关代码如下&#xff1a; ## 创建vue工程 npm create vuelastest## 安装node_modules npm install //…

【六袆 - React】Next.js:React 开发框架;Next.js开发框架的特点

Next.js&#xff1a;React 开发框架 Next.js的特点 1.直观的、基于页面的路由系统&#xff08;并支持动态路由&#xff09; Next.js 提供了基于文件系统的路由&#xff0c;意味着你可以通过创建页面文件来定义路由。 伪代码示例&#xff1a; // pages/index.js export defa…

【数据结构】数组

第一章、为什么数组的下标一般从0开始编号 提到数组&#xff0c;读者肯定不陌生&#xff0c;甚至还会很自信地说&#xff0c;数组很简单。编程语言中一般会有数组这种数据类型。不过&#xff0c;它不仅是编程语言中的一种数据类型&#xff0c;还是基础的数据结构。尽管数组看起…

AI新工具(20240301) Ideogram; Image to Music Generator等

1: Ideogram 全新的多模态生图AI工具&#xff0c;以其优秀的文字渲染能力和生图能力受到业界瞩目 Ideogram是一个创新的AI工具&#xff0c;它通过在生成的图片中自然地整合文字&#xff0c;解决了生图AI领域长期存在的一个难题。这个工具特别擅长将文本以极其自然和协调的方式…

Nginx 隐藏版本信息和logo

1.隐藏版本信息 http {### 隐藏版本号 server_tokens off; } 2.隐藏图标 2.1 cd nginx 安装的路径 cd/XXXX/nginx-1.2.0 2.2 编辑文件 vim src/core/nginx.h 修改define nginx_ver 中的内容 vim src/http/ngx_http_special_response.c 修改 u_char ngx_http_error_tail[]…

腾讯云4核8G的云服务器性能水平?使用场景说明

腾讯云4核8G服务器适合做什么&#xff1f;搭建网站博客、企业官网、小程序、小游戏后端服务器、电商应用、云盘和图床等均可以&#xff0c;腾讯云4核8G服务器可以选择轻量应用服务器4核8G12M或云服务器CVM&#xff0c;轻量服务器和标准型CVM服务器性能是差不多的&#xff0c;轻…

【生成式AI】ChatGPT 原理解析(2/3)- 预训练 Pre-train

Hung-yi Lee 课件整理 预训练得到的模型我们叫自监督学习模型&#xff08;Self-supervised Learning&#xff09;&#xff0c;也叫基石模型&#xff08;foundation modle&#xff09;。 文章目录 机器是怎么学习的ChatGPT里面的监督学习GPT-2GPT-3和GPT-3.5GPTChatGPT支持多语言…

element-plus表格合并

要实现这样的表格&#xff0c; 怎么做呢&#xff1f; 甚至是这种三级的呢&#xff1f; 官网的案例也是通过这个方法进行配置的&#xff0c;也就是说表格长什么样&#xff0c;关键在怎么处理的方法上。 这是官网的方法&#xff0c;可参考拓展&#xff1a; const arraySpanMeth…

【airtest】自动化入门教程(三)Poco操作

目录 一、准备工作 1、创建一个pthon脚本 2、光标位置 2、选择Android 3、选择yes 二、定位元素 三、poco基于设备/屏幕 方式 1、poco.click( (x,y))基于屏幕点击相对坐标为x&#xff0c;y的位置 2、poco.get_screen_size() 3、poco.swipe(v1,v2)基于屏幕从v1位置滑到…

Python爬虫实战第二例【二】

零.前言&#xff1a; 本文章借鉴&#xff1a;Python爬虫实战&#xff08;五&#xff09;&#xff1a;根据关键字爬取某度图片批量下载到本地&#xff08;附上完整源码&#xff09;_python爬虫下载图片-CSDN博客 大佬的文章里面有API的获取&#xff0c;在这里我就不赘述了。 一…

Vue2:路由的两种模式history模式和hash模式

一、情景说明 之前我们写的项目启动后&#xff0c;浏览器访问时&#xff0c;路径中会有个#/&#xff0c;会导致不够美观 因为一般的访问地址都是http://123.123.123.123/aaa/bbb这种形式 这一篇&#xff0c;就来解决这个问题 二、案例 1、hash模式 特点&#xff1a;#/后的…

Docker与虚拟机比较

在对比Docker和虚拟机前&#xff0c;先简单了解下虚拟化&#xff0c;明确Docker和虚拟机分别对应的虚拟化级别&#xff0c;然后对Docker和虚拟机进行比较。需要注意的是&#xff0c;Docker和虚拟机并没有什么可比性&#xff0c;而是Docker使用的容器技术和虚拟机使用的虚拟化技…

微信小程序触屏事件_上划下划事件

一、微信小程序触屏事件 bindtouchstart&#xff1a;手指触摸动作开始 bindtouchmove&#xff1a;手指触摸后移动 bindend&#xff1a;手指触摸动作结束 属性类型说明touchesArray触摸事件&#xff0c;当前停留在屏幕中的触摸点信息的数组 Touch 对象 属性类型说明identi…

《HelloGitHub》第 95 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 Python、Java、Go、C/C、Swift...让你在短时间内…

DDR5内存相比DDR4内存的优势和区别?选择哪一个服务器内存配置能避免丢包和延迟高?

根据幻兽帕鲁服务器的实际案例分析&#xff0c;选择合适的DDR4与DDR5内存大小以避免丢包和延迟高&#xff0c;需要考虑以下几个方面&#xff1a; 性能与延迟&#xff1a;DDR5内存相比DDR4在传输速率、带宽、工作电压等方面都有显著提升&#xff0c;但同时也伴随着更高的延迟。D…

Javaweb之SpringBootWeb案例之自动配置的两种常见方案的详细解析

3.2.2.2 方案一 ComponentScan组件扫描 SpringBootApplication ComponentScan({"com.itheima","com.example"}) //指定要扫描的包 public class SpringbootWebConfig2Application {public static void main(String[] args) {SpringApplication.run(Sprin…

Wireless LAN演进整理以及STA与AP之间的关联行为

一、WLAN standard WLAN标准也是由电机电子工程师学会 (IEEE, Electrical and Electronics Engineers)组织制定的&#xff0c;WLAN标准统称为802.11 二、802.11传输标准 IEEE标准 名称 年份 频道 最高传输速率 调变方式 802.11 WIFI 0 1997 2.4 GHz 2 Mbps DSSS 8…

STM32------分析GPIO寄存器

一、初始LED原理图 共阴极led LED发光二极管&#xff0c;需要有电流通过才能点亮&#xff0c;当有电压差就会产生电流 二极管两端的电压差超过2.7v就会有电流通过 电阻的作用 由于公式IV/R 不加电阻容易造成瞬间电流无穷大 发光二极管工作电流为10-20MA 3.3v / 1kΩ 3.…

如何在群晖Docker运行本地聊天机器人并结合内网穿透发布到公网访问

文章目录 1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&#xff0c;包括聊天机…

获取linuxIP、内存、cpu、磁盘IO等信息的Shell脚本及其讲解

shell基础知识 1.grep grep是一个在Unix和Unix-like系统上使用的命令行工具&#xff0c;用于在文本文件中搜索匹配指定模式的行。它的名字来自于"global regular expression print"&#xff08;全局正则表达式打印&#xff09;的缩写。grep的基本用法是通过指定一个…