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)

4 全AIDL

(10內核開始)。

App->AIDL->HAL Service->so(vender.img)

來自ASOP官網的圖。

二 看一下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實戰_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.pswp.cn/news/712674.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712674.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712674.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

圖片的處理庫Thumbnailator

摘要&#xff1a;最近遇到圖片處理的問題&#xff0c;借助了Thumbnailator庫&#xff0c;記錄下使用步驟如下…… 圖片處理&#xff0c;JDK中也提供了對應的工具類&#xff0c;不過處理較麻煩&#xff0c;Thumbnailator 是Google一個 開源Java 圖像處理庫&#xff0c;用于簡化 …

re正則表達式匹配單個字符串

import retext001 "hello" a re.match(h,text001) print(a.group())text002 "hello" a re.match(.,text002) #匹配任意字符串 print(a.group())text003 "11111" a re.match(r\d, text003) #匹配任意數字 print(a.group())text004…

網絡-TCP關閉連接(close、shutdown)

在TCP協議中&#xff0c;關閉連接的過程可以通過shutdown函數和close函數來實現。 close close函數用于關閉一個socket描述符。實際上是對socket的引用計數-1&#xff0c;當引用計數為0時&#xff0c;就會被關閉。且是關閉兩個方向的數據流。如果是多個進程共享一個socket描述…

代碼隨想錄三刷day10 | 棧與隊列之 232.用棧實現隊列 225. 用隊列實現棧

232.用棧實現隊列 題目鏈接 解題思路&#xff1a;在pop的時候&#xff0c;操作就復雜一些&#xff0c;輸出棧如果為空&#xff0c;就把進棧數據全部導入進來&#xff1b;peek的時候可以用this指針。 代碼如下&#xff1a; class MyQueue { public:stack<int> stIn;sta…

Oracle臨時表應用

1.參考 oracle兩種臨時表的創建及使用方法_oracle 臨時表-CSDN博客 【SQL】全局臨時表 GLOBAL TEMPORARY TABLE-CSDN博客 2.語句 CREATE GLOBAL TEMPORARY TABLE tablename (columns) [ ON COMMIT PRESERVE | DELETE ROWS ] 3.應用 CREATE GLOBAL TEMPORARY TABLE "SE…

嵌入式驅動學習第一周——內核的中斷機制

前言 本文介紹中斷機制&#xff0c;中斷作為需要頻繁使用的功能&#xff0c;本文將詳細介紹linux內核中的中斷機制。 嵌入式驅動學習專欄將詳細記錄博主學習驅動的詳細過程&#xff0c;未來預計四個月將高強度更新本專欄&#xff0c;喜歡的可以關注本博主并訂閱本專欄&#xff…

初始Tomcat(Tomcat的基礎介紹)

目錄 一、Tomcat的基本介紹 1、Tomcat是什么&#xff1f; 2、Tomcat的配置文件詳解 3、Tomcat的構成組件 4、Tomcat的頂層架構 5、Tomcat的核心功能 6、Tomcat的請求過程 一、Tomcat的基本介紹 1、Tomcat是什么&#xff1f; Tomcat 服務器是一個免費的開放源代碼的Web …

【數據庫管理系統】Mysql 8.0.36入門級安裝

下載地址 官方網址&#xff1a;MySQL 注意事項 建議不要安裝最新版本&#xff0c;一般找mysql5.0或mysql8.0系列版本即可&#xff1b;mysq1官網有.zip和.msi兩種安裝形式&#xff1b;zip是壓縮包&#xff0c;直接解壓縮以后使用的&#xff0c;需要自己配置各種東西&#xff…

912. 排序數組(堆排序)

堆排序&#xff1a; 聲明全局堆長度建堆&#xff08;大頂堆&#xff09;從最后一個元素開始向前遍歷&#xff0c;進行&#xff1a;1. 交換最后元素和堆頂元素&#xff1b;2. 全局堆長度-1&#xff1b;3. 調整大頂堆&#xff08;從第0個位置開始&#xff09; 建堆&#xff1a;…

【遞歸搜索回溯專欄】前言與本專欄介紹

本專欄內容為&#xff1a;遞歸&#xff0c;搜索與回溯算法專欄。 通過本專欄的深入學習&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn個人主頁&#xff1a;小小unicorn ?專欄分類&#xff1a;遞歸搜索回溯專欄 &#x1f69a;代碼倉庫&#xff1a;小小unicorn的代…

分享6個解決msvcp110.dll丟失的方法,全面解析msvcp110.dll文件

msvcp110.dll 是一個動態鏈接庫 (DLL) 文件&#xff0c;屬于 Microsoft Visual C 庫的一部分&#xff0c;具體來說是 Microsoft Visual C 2012 版本的運行時組件。這個 DLL 文件包含了在 Windows 環境下運行用 C 編寫的程序所必需的一些函數和資源。當一個應用程序是使用 Visua…

視頻拉流推流技術梳理

概況 視頻的整個流程主要分為推流和拉流 攝像頭場景&#xff1a; 攝像頭捕捉視頻畫面&#xff0c;推流到服務器&#xff0c;服務器分發到CDN&#xff0c; 客戶端從CDN地址拉流&#xff0c;客戶端進行播放 直播場景&#xff1a; 主播通過手機&#xff0c;電腦等客戶端&…

G8-ACGAN理論

本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客 原作者&#xff1a;K同學啊|接輔導、項目定制 我的環境&#xff1a; 1.語言&#xff1a;python3.7 2.編譯器&#xff1a;pycharm 3.深度學習框架Pytorch 1.8.0cu111 一、對比分析 前面的文章介紹了CGAN&#xf…

java基礎(4)注解,集合,

注解 什么是注解&#xff08;Annotation&#xff09;&#xff1f;注解是放在Java源碼的類、方法、字段、參數前的一種特殊“注釋” // this is a component: Resource("hello") public class Hello {Injectint n;PostConstructpublic void hello(Param String name…

經典文獻閱讀之--CamMap(基于SLAM地圖對不共視相機進行外參標定)

0. 簡介 由于多相機之間通常存在有限或無重疊的視場&#xff0c;因此在估計外參相機參數時面臨著一定的挑戰&#xff0c;為了解決這個問題&#xff0c;本文提出了CamMap&#xff1a;一種新穎的6自由度外參標定流程。根據三個操作規則&#xff0c;使一個多相機系統單獨捕捉一些…

【Linux進程】進程狀態(運行阻塞掛起)

目錄 前言 1. 進程狀態 2. 運行狀態 3. 阻塞狀態 4. 掛起狀態 5. Linux中具體的狀態 總結 前言 在Linux操作系統中&#xff0c;進程狀態非常重要&#xff0c;它可以幫助我們了解進程在系統中的運行情況&#xff0c;從而更好地管理和優化系統資源&#xff0c;在Linux系統中&am…

【Python筆記-設計模式】迭代器模式

一、說明 迭代器模式是一種行為設計模式&#xff0c;讓你能在不暴露集合底層表現形式&#xff08;列表、棧和樹等&#xff09;的情況下遍歷集合中所有的元素。 (一) 解決問題 遍歷聚合對象中的元素&#xff0c;而不需要暴露該對象的內部表示 (二) 使用場景 需要對聚合對象…

SpringBoot實現短鏈跳轉

目錄 1.背景介紹 2.短鏈跳轉的意義 3.SpringBoot中的代碼實現 1.建議短鏈-長鏈的數據庫表&#xff1a;t_url_map: 2.映射實體 3.Dao層實現 4.Service層實現 5.Controller層實現 3.結果測試 4.問題 1.背景介紹 短鏈跳轉是一種通過將長鏈接轉換為短鏈接的方式&…

南方電網的能源棋局上,蔚來換電扮演什么角色?

2 月 26 日&#xff0c;南網儲能科技與蔚來能源簽署協議&#xff0c;將充換電站、儲能站、可調負載等聚合資源連接到虛擬電廠平臺&#xff0c;推動換電站作為分布式儲能在虛擬電廠項目上的應用。 蔚來換電站是國內首個智慧微電網型分布式換電設施&#xff0c;可透過換電訂單預…

軟考-系統集成項目管理中級-信息系統建設與設計

本章重點考點 1.信息系統的生命周期 信息系統建設的內容主要包括設備采購、系統集成、軟件開發和運維服務等。信息系統的生命周期可以分為四個階段:立項、開發、運維和消亡。 2.信息系統開發方法 信息系統常用的開發方法有結構化方法、原型法、面向對象方法等 1)結構化方法 …