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.pswp.cn/pingmian/81963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81963.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81963.shtml

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

相關文章

第九天的嘗試

目錄 一、每日一言 二、練習題 三、效果展示 四、下次題目 五、總結 一、每日一言 創造美好的代價是努力&#xff0c;失望以及毅力&#xff0c;首先是痛苦&#xff0c;然后才是歡樂。 時間是快的&#xff0c;看怎么利用&#xff0c;安排好一切事情&#xff0c;才能從容面對…

交安安全員:交通工程安全領域的關鍵角色

在交通工程這個龐大而復雜的領域中&#xff0c;交安安全員扮演著舉足輕重的角色&#xff0c;他們是安全的捍衛者&#xff0c;是交通工程順利推進的重要保障。? 交安安全員&#xff0c;專門從事公路水運工程施工企業安全生產管理工作。他們的專業身份由交通運輸部門頒發的交安…

實驗-設計一個應用系統(計算機組成原理)

目錄 一. 實驗內容 二. 實驗步驟 &#xff08;1&#xff09;七段數碼管顯示模塊 &#xff08;2&#xff09;指令模塊 &#xff08;3&#xff09;控制模塊 &#xff08;4&#xff09;ALU模塊 &#xff08;5&#xff09;CPU模塊 三. 實現效果 四. 實驗環境 五. 實驗小結…

【博客系統】博客系統第四彈:令牌技術

令牌機制 為什么不能使用 Session 實現登錄功能&#xff1f; 傳統思路&#xff1a; 登錄頁面把用戶名密碼提交給服務器。服務器端驗證用戶名密碼是否正確&#xff0c;并返回校驗結果給前端。如果密碼正確&#xff0c;則在服務器端創建 Session。通過 Cookie 把 sessionId 返回…

【瑞數3代】藥監評審中心逆向分析 | 后綴MmEwMD參數

1.目標 目標網址&#xff1a;https://www.cde.org.cn/main/news/listpage/545cf855a50574699b46b26bcb165f32 import requestscookies {FSSBBIl1UgzbN7N80S: 8sYeMWaC_IHoNl8Ckfx2y9MLiueMCkPr2V3MIoZkrMPUfzMMaXKzAoxpNPvyw4lt,Path: /,FSSBBIl1UgzbN7N80T: 3js3ygV.St6BvO20…

【漫話機器學習系列】274.基尼指數(Gini Index)

決策樹中的基尼指數&#xff08;Gini Index&#xff09;詳解 —— 從公式理解到實際應用 在構建決策樹模型時&#xff0c;一個核心問題是&#xff1a;如何選擇最優的特征來進行節點劃分&#xff1f; 這就涉及到了“劃分準則”的問題。常見的準則有信息增益、信息增益率以及本文…

R語言學習--Day07--T分布與T檢驗

昨天我們介紹了R中用于對數據進行分類的聚類分析的方法&#xff0c;接下來我們來看T分布。 T分布 T分布適用于幫我們估計整組數據&#xff08;較小的數據量&#xff0c;一般小于30&#xff09;的真實值在哪一個區間&#xff0c;具體是計算置信區間&#xff08;一般為95%&#…

數據結構與算法-線性表-雙向鏈表(Double Linked List)

1 線性表 1.4 雙向鏈表&#xff08;Double Linked List&#xff09; 雙向鏈表的結點中有兩個指針域&#xff0c;一個指向直接后繼&#xff0c;另一個指向直接前驅&#xff0c;主要是為了解決前向查找的問題。 雙向鏈表結構&#xff1a; 書籍和視頻教程都只講解了插入和刪除的…

甘特圖實例 dhtmlxGantt.js

本文介紹了如何使用dhtmlxGantt庫創建一個基礎的甘特圖示例&#xff0c;并對其進行漢化和自定義配置。首先&#xff0c;通過引入dhtmlxgantt.css和dhtmlxgantt.js文件初始化甘特圖。接著&#xff0c;通過設置gantt.i18n.setLocale("cn")實現核心文本的漢化&#xff0…

C++23 新增扁平化關聯容器詳解

文章目錄 一、引言已有關聯容器回顧新容器的引入原因 二、std::flat_set定義與特性代碼示例適用場景 三、std::flat_multiset定義與特性代碼示例適用場景 四、std::flat_map定義與特性代碼示例適用場景 五、std::flat_multimap定義與特性代碼示例適用場景 六、與其他容器的比較…

使用zap,對web應用/API接口 做安全檢測

https://www.zaproxy.org/getting-started/ 檢測方法 docker pull ghcr.io/zaproxy/zaproxy:stable# 執行baseline測試 docker run -t ghcr.io/zaproxy/zaproxy:stable zap-baseline.py \ -t https://baseline.yeshen.org# 執行api測試 docker run -t ghcr.io/zaproxy/zaproxy…

Qt—模態與非模態對話框

Qt—模態與非模態對話框 核心概念 ?模態對話框??&#xff1a;強制用戶優先處理當前窗口&#xff0c;阻塞指定范圍的用戶交互。?非模態對話框??&#xff1a;允許用戶自由切換窗口&#xff0c;無交互限制。 一、模態對話框類型與行為 1. 應用級模態&#xff08;Applica…

Axure高保真CRM客戶關系管理系統原型

一套出色的CRM&#xff08;客戶關系管理&#xff09;系統&#xff0c;無疑是企業管理者掌控客戶動態、提升銷售業績的得力助手。今天&#xff0c;就為大家介紹一款精心打造的Axure高保真CRM客戶關系管理系統原型模板&#xff0c;助你輕松開啟高效客戶管理之旅。 這款CRM原型模…

【羊圈——狀壓 + DP / 記憶化搜索DP】

題目 一般DP代碼&#xff08;注意&#xff0c;這里只能向外推(起始狀態是f(1,0)&#xff0c;不能向內推&#xff08;不然會導致之前的羊圈被割裂&#xff09;&#xff09; #include <bits/stdc.h> using namespace std;const int MAX_N 210; const int MAX_M 16;int n…

講解Mysql InnoDB的MVCC

1. 定義 MVCC是多版本并發控制&#xff08;Multi - Version Concurrency Control&#xff09;的縮寫。它是InnoDB存儲引擎實現高并發控制的一種機制。在數據庫系統中&#xff0c;多個事務可能會同時對數據進行讀寫操作&#xff0c;而MVCC通過為數據行保存多個版本來解決并發事務…

ZeroMQ Sockets介紹及應用示例

1. 概念解釋 ZeroMQ Sockets提供了一種類標準套接字&#xff08;socket-like&#xff09;的 API&#xff0c;是消息導向的通信機制&#xff0c;基于 TCP/UDP 等傳輸層協議&#xff0c;但封裝了底層細節&#xff08;如連接管理、消息路由、緩沖區等&#xff09;&#xff0c;提供…

語音合成之十五 語音合成(TTS)分句生成拼接時的響度一致性問題:現狀、成因與對策

語音合成&#xff08;TTS&#xff09;分句生成拼接時的響度一致性問題&#xff1a;現狀、成因與對策 引言&#xff1a;分段式文本轉語音中的響度一致性挑戰業界對響度差異問題的認知拼接語音片段中響度變化的根本原因分段拼接的固有挑戰各片段預測韻律特征的差異文本特征和模型…

Android中Binder驅動作用?

Binder驅動的作用與核心功能 Binder驅動是Android系統中實現進程間通信&#xff08;IPC&#xff09;的核心底層組件&#xff0c;它工作于Linux內核層&#xff0c;負責管理跨進程通信的建立、數據傳輸、資源同步等關鍵任務。以下是其核心作用及實現細節&#xff1a; 1. ??進程…

網絡學習-TCP協議(七)

一、TCP協議 TCP&#xff08;Transmission Control Protocol&#xff0c;傳輸控制協議&#xff09;是一種面向連接的、可靠的、基于字節流的傳輸層通信協議。 1、三次握手 客戶端&#xff1a; 1、先發起連接&#xff0c;發送SYN置1&#xff0c;seqnum12345(隨機值)----半連接…

【Python 基礎與實戰】從基礎語法到項目應用的全流程解析

&#xff08;1&#xff09;列表和元組的區別是什么?如何從列表創建元組?如何從元組創建列表? 列表和元組的區別&#xff1a; 可變性&#xff1a;列表是可變的&#xff0c;即可以對列表進行元素的增、刪、改操作。例如&#xff0c;可以使用append()方法添加元素&#xff0c;r…