漳浦建设局网站更新,wordpress如何去除页眉部分,icp备案 网站负责人,商城网站有哪些功能我一直觉得#xff0c;现代计算机不是一门科学#xff0c;起码快算不上一门理科科学。上上下下全是人造#xff0c;左左右右全是生意#xff0c;用管理学#xff0c;经济学去学计算机#xff0c;也许更看得懂很多问题。HAL就是一个典型例子。
传统Linux绕开了微软的霸权…我一直觉得现代计算机不是一门科学起码快算不上一门理科科学。上上下下全是人造左左右右全是生意用管理学经济学去学计算机也许更看得懂很多问题。HAL就是一个典型例子。
传统Linux绕开了微软的霸权但是又面临GPL要开源的尴尬。谷歌为了迎合硬件资本家封闭垄断发财的愿望所以搞了HAL这个概念。将原来在内核态的驱动移了大部分核心内容到用户态这样就可以封闭可以垄断赚钱。然后因为HAL这玩意只在安卓上有配合了安卓的硬件公司反过来又被谷歌绑架这样一环套一环吃钱。一开始用Java吸引广大的Java生态码农进场。现在又搞Kotlin想把码农套牢。搞这几出是真的只是科学吗当然不是归根结底大部分还是生意。
我对安卓接触不久有些理解不一定对大家用批判的眼光看就好。有什么错误还请指正。
一 安卓硬件接口的演化
传统Linux怎么调用硬件就是ko。。。几个函数搞定。Android复杂了很多所以整理一下。
在安卓中除了上面讲的HAL还有一个就是Framework这个就是app的framework要理解安卓驱动层这两点绕不开。为了适配framework安卓把硬件是作为服务service来使用。在Android中这种结构也进化了很多代。 1 首先是传统HALLegacy HAL
在内核8.0以前使用。用户态的so貌似保存在/system/lib64这个版本是直接读取硬件so比较原始暴力。
App-Service-AIDL-Server-JNI-HAL so-kernel driver
2 现代HALConventional 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。
首先是AIDLAndroid 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的调用。就算上层函数调用其实也很多方式比如COMsoaprpc都是干这事的。安卓应该还是用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.husing android::hardware::led::V1_0::ILedService;
using android::hardware::Return;
using android::hardware::Void;class LedService : public ILedService {
public:LedService() {}Returnint32_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?hlzh-cn
https://source.android.com/docs/core/architecture/aidl/aidl-hals?hlzh-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 - 简书