怎么做網(wǎng)盤(pán)搜索引擎網(wǎng)站抖音怎么推廣
我一直覺(jué)得,現(xiàn)代計(jì)算機(jī)不是一門(mén)科學(xué),起碼快算不上一門(mén)理科科學(xué)。上上下下全是人造,左左右右全是生意,用管理學(xué),經(jīng)濟(jì)學(xué)去學(xué)計(jì)算機(jī),也許更看得懂很多問(wèn)題。HAL就是一個(gè)典型例子。
傳統(tǒng)Linux繞開(kāi)了微軟的霸權(quán),但是又面臨GPL要開(kāi)源的尷尬。谷歌為了迎合硬件資本家封閉壟斷發(fā)財(cái)?shù)脑竿?#xff0c;所以搞了HAL這個(gè)概念。將原來(lái)在內(nèi)核態(tài)的驅(qū)動(dòng),移了大部分核心內(nèi)容到用戶態(tài),這樣就可以封閉,可以壟斷賺錢(qián)。然后因?yàn)镠AL這玩意只在安卓上有,配合了安卓的硬件公司反過(guò)來(lái)又被谷歌綁架,這樣一環(huán)套一環(huán)吃錢(qián)。一開(kāi)始用Java,吸引廣大的Java生態(tài)碼農(nóng)進(jìn)場(chǎng)。現(xiàn)在又搞Kotlin想把碼農(nóng)套牢。搞這幾出,是真的只是科學(xué)嗎?當(dāng)然不是,歸根結(jié)底大部分還是生意。
我對(duì)安卓接觸不久,有些理解不一定對(duì),大家用批判的眼光看就好。有什么錯(cuò)誤還請(qǐng)指正。
一 安卓硬件接口的演化
傳統(tǒng)Linux怎么調(diào)用硬件?就是ko。。。幾個(gè)函數(shù)搞定。Android復(fù)雜了很多,所以整理一下。
在安卓中,除了上面講的HAL,還有一個(gè)就是Framework,這個(gè)就是app的framework,要理解安卓驅(qū)動(dòng)層,這兩點(diǎn)繞不開(kāi)。為了適配framework,安卓把硬件是作為服務(wù)service來(lái)使用。在Android中,這種結(jié)構(gòu)也進(jìn)化了很多代。
1 首先是傳統(tǒng)HAL(Legacy HAL)
在內(nèi)核8.0以前使用。用戶態(tài)的so貌似保存在/system/lib64,這個(gè)版本是直接讀取硬件so,比較原始暴力。
App->Service->AIDL->Server->JNI->HAL so->kernel driver
2 現(xiàn)代HAL(Conventional HAL)
使用Iibhardware來(lái)管理so,同時(shí)下層的驅(qū)動(dòng)使用一個(gè)單獨(dú)的分區(qū),so全部集成到vender.img,和system解綁。要找尋so通過(guò)libhardware這個(gè)中間層。編譯時(shí)要提供一個(gè)Android.bp文件。
App->Service->AIDL->Server->JNI->Iibhardware->so(vender.img)
3 HIDL
在安卓8之后,開(kāi)始使用HIDL,總的來(lái)說(shuō)就是將HAL封裝成服務(wù),完全就是rpc的玩法。
HIDL編譯后,會(huì)生成Android.bp(這個(gè)有時(shí)間再看看)。最后會(huì)有兩個(gè)so,一個(gè)so,放在system分區(qū);一個(gè)impl.so,放在vendor分區(qū),以此實(shí)現(xiàn)framework和驅(qū)動(dòng)服務(wù)的分離??蛻舳耸褂们罢?#xff0c;服務(wù)端使用后者。服務(wù)端包含impl.so之后,會(huì)生成一個(gè)可執(zhí)行程序,就可以作為一個(gè)service單獨(dú)運(yùn)行??蛻舳税藄o可以直接調(diào)用服務(wù)。
分為直通式和綁定式。有大神說(shuō)直通式就是雖然使用HAL,但還是在一個(gè)進(jìn)程,綁定式是使用HAL,但是數(shù)據(jù)通過(guò)Binder轉(zhuǎn)發(fā),上面說(shuō)的應(yīng)該就是綁定式。直通式和綁定式也都是HAL生成的代碼中控制的。比如:
extern "C" IXXX* HIDL_FETCH_IXXX(const char* name);
AIDL和HIDL的中間就是安卓的framework。
App->AIDL->Service->HIDL->HAL Service->so(vender.img)
示例1,大概就是下面這種結(jié)構(gòu)
Power.c往下是通過(guò)systemcall,這部分代碼是封在so里面的。
PowerManagerService.cpp是封裝下層的so,然后對(duì)上提供HIDL的接口。
PowerManagerService.java對(duì)下調(diào)用HIDL的接口,對(duì)上提供AIDL的接口。
DisplayPowerState.java調(diào)用AIDL的接口。
大概是這樣。
示例2,下面這張圖更細(xì)一點(diǎn):
4 全AIDL。AIDL for HAL
(andorid11開(kāi)始)。
App->AIDL->HAL Service->so(vender.img)
二 看一下AIDL和HIDL。
最新的HAL主要涉及到的主要是兩個(gè)接口,AIDL和HIDL。
首先是AIDL,Android Interface definition language??促Y料說(shuō)是android中兩個(gè)app交互的IPC方式。首先IPC有很多種,管道,域套接字,message,共享內(nèi)存,問(wèn)題是谷歌為什么要搞出來(lái)一套新的呢?
從一個(gè)AIDL的例子可以看到:
// IMyRemoteService.aidl
interface IMyRemoteService {int getValue();void setValue(int value);
}
一邊使用:
private final IMyRemoteService.Stub mBinder = new IMyRemoteService.Stub()
另一邊使用:
mRemoteService = IMyRemoteService.Stub.asInterface(iBinder);
在接口中主要定義的還是函數(shù),也就是說(shuō)比管道這些更上層,更適合Java的調(diào)用。就算上層函數(shù)調(diào)用,其實(shí)也很多方式,比如COM,soap,rpc都是干這事的。安卓應(yīng)該還是用binder進(jìn)行統(tǒng)一管理了吧,畢竟是一個(gè)單獨(dú)的服務(wù)。
HIDL
主要還是提供底層cpp驅(qū)動(dòng)和上層java的通信。hal文件定義如下:
// ILedService.hal
package android.hardware.led;interface ILedService {int getLedState();void setLedState(int state);
};
它的C++語(yǔ)法稍怪:
#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側(cè)的倒是差不多。
在Binder的使用中,Server端繼承BnInterface, Client端繼承BpInterface。我接觸的工程中,一邊叫做BP側(cè),那么應(yīng)該就是app側(cè),BN側(cè)那么就是服務(wù)端了。
最后,寫(xiě)完的service可以通過(guò)rc文件,作為一個(gè)系統(tǒng)服務(wù)。
參考:
針對(duì) Android 進(jìn)行開(kāi)發(fā) ?|? Android 開(kāi)發(fā)者 ?|? 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實(shí)戰(zhàn)_hidl會(huì)被aidl代替-CSDN博客
Android HIDL 介紹學(xué)習(xí)和實(shí)戰(zhàn)應(yīng)用-CSDN博客
AIDL for HALs實(shí)戰(zhàn)_hidl會(huì)被aidl代替-CSDN博客
HIDL 原理及使用詳解-CSDN博客
Android上層與驅(qū)動(dòng)交互完整篇(三)HIDL服務(wù)_android.bp hidl_interface-CSDN博客
Android HIDL學(xué)習(xí)(2) ---- HelloWorld - 簡(jiǎn)書(shū)