当前位置: 首页 > ai >正文

Android 14 Binderized HAL开发实战指南(AIDL版)

Android 14 Binderized HAL开发实战指南(AIDL版)

环境要求

  • Android 14源码编译环境
  • AOSP android-14.0.0_r7分支
  • Soong build系统
  • Java 17 & NDK r25c

项目结构

hardware/interfaces/myservice/
├── 1.0
│   ├── IMyHalService.aidl   # AIDL接口定义
│   └── Android.bp          # 接口构建配置
├── impl
│   ├── MyHalService.cpp     # HAL实现
│   ├── service.cpp         # 服务入口
│   └── Android.bp          # 实现层构建配置
└── sepolicy└── myservice.te        # SELinux策略

完整实现步骤

1. 定义AIDL接口

// hardware/interfaces/myservice/1.0/IMyHalService.aidl
package android.hardware.myservice@1.0;@Backing(type="int")
enum ErrorCode {OK,DEVICE_BUSY,INVALID_PARAM
}interface IMyHalService {@nullableString getHardwareId();@error(ErrorCode)int sendControlCommand(in int cmdId, in byte[] payload);oneway void registerCallback(in ICallback callback);oneway void unregisterCallback(in ICallback callback);
}interface ICallback {oneway void onEvent(int eventId, in byte[] data);
}

2. 实现HAL服务

// hardware/interfaces/myservice/impl/MyHalService.cpp
#include <android/binder_ibinder.h>
#include <aidl/android/hardware/myservice/BnMyHalService.h>using namespace aidl::android::hardware::myservice;class MyHalService : public BnMyHalService {
public:ndk::ScopedAStatus getHardwareId(std::string* _aidl_return) override {*_aidl_return = "MY_HAL_1.0";return ndk::ScopedAStatus::ok();}ndk::ScopedAStatus sendControlCommand(int cmdId, const std::vector<uint8_t>& payload, int* _aidl_return) override {if (cmdId < 0 || cmdId > 255) {*_aidl_return = static_cast<int>(ErrorCode::INVALID_PARAM);return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT);}// 实际硬件操作*_aidl_return = static_cast<int>(ErrorCode::OK);return ndk::ScopedAStatus::ok();}ndk::ScopedAStatus registerCallback(const std::shared_ptr<ICallback>& callback) override {std::lock_guard<std::mutex> lock(mMutex);mCallbacks.insert(callback);return ndk::ScopedAStatus::ok();}ndk::ScopedAStatus unregisterCallback(const std::shared_ptr<ICallback>& callback) override {std::lock_guard<std::mutex> lock(mMutex);mCallbacks.erase(callback);return ndk::ScopedAStatus::ok();}private:std::mutex mMutex;std::unordered_set<std::shared_ptr<ICallback>> mCallbacks;
};

3. 服务入口实现

// hardware/interfaces/myservice/impl/service.cpp
#include <binder/ProcessState.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>using aidl::android::hardware::myservice::MyHalService;int main() {ABinderProcess_setThreadPoolMaxThreadCount(4);std::shared_ptr<MyHalService> service = ndk::SharedRefBase::make<MyHalService>();const std::string instance = std::string() + IMyHalService::descriptor + "/default";binder_status_t status = AServiceManager_addService(service->asBinder().get(), instance.c_str());if (status != STATUS_OK) {ALOGE("Failed to register service");return 1;}ABinderProcess_joinThreadPool();return 0;
}

构建配置

接口层配置

// hardware/interfaces/myservice/1.0/Android.bp
aidl_interface {name: "android.hardware.myservice.IMyHalService",srcs: ["IMyHalService.aidl"],stability: "vintf",backend: {cpp: {enabled: true,},java: {enabled: false,},},versions: ["1"],
}

实现层配置

// hardware/interfaces/myservice/impl/Android.bp
cc_library_shared {name: "android.hardware.myservice-service",srcs: ["MyHalService.cpp","service.cpp",],shared_libs: ["android.hardware.myservice.IMyHalService","libbinder_ndk","libbase","liblog",],cflags: ["-Wall","-Werror",],
}cc_binary {name: "android.hardware.myservice@1.0-service",relative_install_path: "hw",vendor: true,init_rc: ["myservice.rc"],srcs: [":android.hardware.myservice-service"],shared_libs: ["android.hardware.myservice.IMyHalService","libbinder_ndk","libbase","liblog",],
}

SELinux配置

//myservice.te
type myservice_hwservice, hwservice_manager_type;
type myservice_default, domain;# HAL服务权限
allow myservice_default hwservicemanager:binder { call transfer };
allow myservice_default hwservicemanager:service_manager add;# 客户端权限
allow hal_client_domain myservice_hwservice:hwservice_manager { find };

VINTF配置

<!-- hardware/interfaces/compatibility_matrix.xml -->
<hal format="aidl"><name>android.hardware.myservice</name><version>1.0</version><interface><name>IMyHalService</name><instance>default</instance></interface>
</hal>

客户端调用示例

// 在SystemServer中获取服务IMyHalService service = IMyHalService.Stub.asInterface(ServiceManager.waitForService("android.hardware.myservice.IMyHalService/default"));// 发送控制命令
byte[] payload = new byte[]{0x01, 0x02};
int result = service.sendControlCommand(0x20, payload);// 注册回调
service.registerCallback(new ICallback.Stub() {@Overridepublic void onEvent(int eventId, byte[] data) {// 处理硬件事件}
});
http://www.xdnf.cn/news/8373.html

相关文章:

  • StringBuilder 和 StringBuffer 的线程安全分析
  • maven添加自己下载的jar包到本地仓库
  • Python字典的工作原理:深入理解哈希表实现
  • Redis主从+哨兵+集群分片
  • 回溯算法:解锁多种问题的解决之门
  • 利用Qt绘图随机生成带多种干扰信息的数字图片
  • Lavavel学习笔记(Eloquent ORM/Swoole 定时任务)
  • Logback 在 Spring Boot 中的详细配置
  • 【深尚想!爱普特APT32F1023H8S6单片机重构智能电机控制新标杆】
  • PostgreSQL 软件升级
  • 06 如何定义方法,掌握有参无参,有无返回值,调用数组作为参数的方法,方法的重载
  • 解构赋值与剩余参数:语法特性背后的思考
  • Go语言爬虫系列教程(三)HTML解析技术
  • 【MySQL】剖析事务和锁
  • 疏锦行Python打卡 DAY 9 热力图和子图的绘制
  • 如何备份和恢复Linux系统?
  • RHCSA Linux 系统 硬盘管理
  • linux 内核warn_on/Bug_on
  • 【深度学习-Day 16】梯度下降法 - 如何让模型自动变聪明?
  • 应对进行性核上性麻痹,健康护理铸就温暖防线
  • MATLAB NLP 工具箱 文本预处理教程
  • 四、GPU是如何成为当前电脑中不可或缺的一部分的,opengl在其中起到了什么效果
  • HTA8111 18W内置升压单声道D类音频功放
  • SAP Business One, Web Client: The Advantages of All Worlds
  • 微服务架构下的智能规则解析:Java 解释器模式的高可用实现
  • 【438. 找到字符串中所有字母异位词】
  • 【MySQL】第九弹——索引(下)
  • Unity基础学习(七)Mono中的重要内容(3)协同程序的本质
  • PyQt5安装,在Pycharm上配置以及使用教程
  • 设计模式-备忘录模式