Android系統打通HAL層到應用層 --- Framework框架搭建

本文是接續上文,針對于HAL層的接口封裝Framework層的接口
HAL層框架搭建:https://blog.csdn.net/m0_50408097/article/details/151148637?spm=1001.2014.3001.5502
在 Android 系統架構中,Framework 層(框架層) 位于 HAL 層(硬件抽象層)之上,是連接底層硬件能力與上層應用的核心中間層。它基于 HAL 層提供的硬件抽象接口,封裝出更易用、更貼近應用開發的標準化服務和 API,供應用層調用。Framework框架搭建
Step1. 創建framework service(用于與hal層通信)

1.1?? ?定義aidl接口(用于與manager進程間通信)
路徑:/frameworks/base/core/java/android/app/ITestService.aidl

package android.app;/** {@hide} */
interface ITestService {int additionTest(int a, int b);
}

注意:這里的接口要與.hal中定義的接口相同(函數名、返回值類型、參數類型和數量)

1.2?? ?實現service
路徑:/frameworks/base/services/core/java/com/android/server/TestService.java

package com.android.server;import android.app.ITestService;
import android.content.Context;public class TestService extends ITestService.Stub {private static final String TAG = " TestService ";private Context mContext;public TestService(Context context) {android.util.Log.d(TAG,"Start TestService...");mContext = context;}@Overridepublic int additionTest(int a, int b) {android.util.Log.d(TAG,"yuan TestService additionTest()...");return additionTest_native(a, b);}private static native int additionTest_native(int a, int b);}

1.3?? ?在Context.java中定義新規的service
路徑:/frameworks/base/core/java/android/content/Context.java

public static final String TEST_SERVICE = "test";

1.4?? ?注冊 Service 到 SystemServer
路徑:frameworks/base/services/java/com/android/server/SystemServer.java#startOtherServices()

TestService testService = null;traceBeginAndSlog("yuan StartTestService");
try {testService = new TestService(context);ServiceManager.addService(Context.TEST_SERVICE, testService);
} catch (Throwable e) {reportWtf("starting TestService", e);
}
traceEnd();


Step2. 創建JNI橋接代碼(連接framework service和hal)
具體的JNI框架搭建可以參考:https://blog.csdn.net/m0_50408097/article/details/151115313?spm=1001.2014.3001.5506
2.1 定義jni文件
路徑:frameworks/base/services/core/jni/com_android_server_Test.cpp

#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include <binder/IServiceManager.h>
#include <vendor/xxx/hardware/test/1.0/ITest.h>
#include <log/log.h>
#include <android_runtime/AndroidRuntime.h>
#include <android_runtime/Log.h>using android::hardware::Return;
using android::hardware::Void;
using android::sp;
using vendor::xxx::hardware::test::V1_0::ITest;namespace android {sp<ITest> rw_device;
std::string asyncResult;void serialNoCallback(const ::android::hardware::hidl_string& serialNo) {asyncResult = serialNo.c_str();
}static jint additionTest_native(JNIEnv *env, jobject /* thiz */, jint a, jint b) {ALOGI("additionTest_native.....");sp<IServiceManager> sm = defaultServiceManager();if (sm == nullptr) {ALOGE("failed to get ServiceManager");return -1;}rw_device = ITest::getService();if (rw_device == nullptr) {ALOGE("failed to get ITest service");return -1;}return rw_device->additionTest(a, b);
}static const JNINativeMethod method_table[] = {{ "additionTest_native", "(II)I", (void *)additionTest_native },
};int register_android_server_TestService(JNIEnv* env) {return jniRegisterNativeMethods(env, "com/android/server/TestService",method_table, NELEM(method_table));
}}; // namespace android

在additionTest_native()函數中直接調用HAL層的函數additionTest()

2.2 在 Android.bp 中添加編譯依賴
① 新增JNI文件
路徑:frameworks/base/services/core/jni/Android.bp#cc_library_static

"com_android_server_Test.cpp",

② 添加HAL依賴
路徑:frameworks/base/services/core/jni/Android.bp# cc_defaults

"vendor.xxx.hardware.test@1.0",

2.3 注冊 JNI 到 Android Runtime
① 聲明一個 JNI 注冊函數,用于將 TestService 的 Native 方法(C++ 實現)綁定到 Java 層
路徑:frameworks/base/services/core/jni/onload.cpp

int register_android_server_TestService(JNIEnv* env);

② 在 JNI_OnLoad 函數中調用注冊方法,完成 TestService 的 JNI 方法綁定

register_android_server_TestService(env);


Step3. 創建framework manager(給app提供API)
3.1 定義manager類
路徑:frameworks/base/core/java/android/os/TestManager.java

package android.os;import android.annotation.SuppressLint;
import android.annotation.SystemService;
import android.app.ITestService;
import android.content.Context;
import android.util.Log;@SystemService(Context.TEST_SERVICE)
public class TestManager {private ITestService mService;private Context mContext;private static final String TAG = " TestManager ";private static final boolean Debug = true;/** @hide */public TestManager(Context context, ITestService service){mContext = context;mService = service;}@SuppressLint({"MissingNullability", "StartWithLower"})public int additionTest(int a, int b){Log.d(TAG, "yuan additionTest");try {return mService.additionTest(a, b);} catch (RemoteException e) {if (Debug) Log.e(TAG, e.getMessage());}return 0;}
}

在additionTest()方法中調用 mService.additionTest() 會通過 Binder IPC 將請求發送到系統服務端

3.2 注冊 Manager 到 SystemServiceRegistry
路徑:frameworks/base/core/java/android/app/SystemServiceRegistry.java

registerService(Context.TEST_SERVICE, TestManager.class,new CachedServiceFetcher<TestManager>() {@Overridepublic TestManager createService(ContextImpl ctx)throws ServiceNotFoundException {IBinder b = ServiceManager.getServiceOrThrow(Context.TEST_SERVICE);return new TestManager(ctx.getOuterContext(),ITestService.Stub.asInterface(b));}});

Step4. 配置 SELinux 策略
4.1 允許 system_server 注冊服務
路徑:/system/sepolicy/private/system_server.te

#test service
allow system_server test_service:service_manager add;

4.2 允許普通應用查找服務
路徑:/system/sepolicy/private/untrusted_app_all.te

allow untrusted_app_all test_service:service_manager find;

4.3 定義新的服務類型
路徑:/system/sepolicy/public/service.te

type test_service, system_api_service, system_server_service, service_manager_type;

注意:以下te文件都需要添加4.1-4.3
/system/sepolicy/prebuilts/api/下所有的system_server.te && untrusted_app_all.te && service.te
/system/sepolicy/private/system_server.te
/system/sepolicy/private/untrusted_app_all.te
/system/sepolicy/public/service.te

4.4 允許 system_server 訪問 HAL
路徑:/device/xxx/xxx/sepolicy/non_plat/hal_test.te

allow system_app hal_test_hwservice:hwservice_manager { find };

4.5 允許 system_server 查找 hal_test_hwservice
路徑:/device/xxx/xxx/sepolicy/non_plat/system_sever.te

allow system_server hal_test_hwservice:hwservice_manager find;

Step5. 更新framework 的公開 API 定義文件
用source和lunch加載一下環境變量

make update-api

執行后,自動更新current.txt
可以在frameworks/base庫下,用git diff查看一下
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921060.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921060.shtml

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

相關文章

LwIP入門實戰 — 2 LwIP概述

目錄 2.1 LwIP簡介 2.2 LwIP文件架構分析 2.2.1 LwIP軟件架構 2.2.2 主要模塊劃分 2.3 IPC通訊機制 2.4 LwIP的3種編程接口 2.4.1 RAW/Callback API 2.4.2 Netconn API 2.1 LwIP簡介 LWIP&#xff08;Light Weight Internet Protocol&#xff0c;輕型網絡協議棧&#…

微信小程序-day3

頁面導航跳轉聲明式導航注意&#xff1a;url開頭要有/1. 導航到 tabBar 頁面2. 導航到非 tabBar 頁面3. 后退導航編程式導航跳轉傳參參數可以在onLoad里用option獲取下拉刷新事件可在onPullDownRefresh中定義下拉事件對應操作在其中加入這個函數wx.stopPullDownRefresh()&#…

關于ES中文分詞器analysis-ik快速安裝

ES中文分詞器插件 安裝快速安裝手動安裝 應用ik_max_word 與 ik_smart 的區別驗證是否生效 官方地址&#xff1a;https://github.com/infinilabs/analysis-ik 安裝 快速安裝 插件安裝&#xff08;將鏈接最后的版本號換成當前ES版本號&#xff09;&#xff1a; bin/elastics…

STM32G4 電流環閉環

目錄一、STM32G4 電流環閉環1 電流環閉環PID控制2 電流環閉環建模附學習參考網址歡迎大家有問題評論交流 (* ^ ω ^)一、STM32G4 電流環閉環 1 電流環閉環 電流環框圖 PID控制 時域和拉普拉斯域的傳遞函數 PID&#xff1a; P比例部分&#xff0c;I積分部分&#xff0c;D微分…

利用 Java 爬蟲獲取淘寶商品詳情 API 接口

本文將詳細介紹如何使用 Java 編寫爬蟲程序&#xff0c;通過淘寶開放平臺的高級版 API 接口獲取商品的詳細信息。一、淘寶商品詳情 API 接口概述淘寶開放平臺提供了多個 API 接口用于獲取商品的詳細信息&#xff0c;其中 taobao.item.get 和 taobao.item.get_pro 是常用的接口。…

idea上傳本地項目代碼到Gitee倉庫教程

前言&#xff1a;本地一個項目代碼上傳到Gitee倉庫1.登錄Gitee官網新建倉庫&#xff08;命名跟項目同名&#xff09;2.idea添加Gitee插件&#xff08;需要Restart&#xff09;3.idea配置已安裝git的路徑4.idea添加Gitee賬戶5.給項目創建Git本地倉庫Git倉庫創建成功&#xff0c;…

往屆生還有機會進入計算機這個行業嗎?還能找見好工作嗎

前言 最近有很多的往屆生來咨詢我&#xff0c;問我還能找見工作嗎&#xff0c;還能進入這一行嗎&#xff08;大多數都是一些24屆&#xff0c;考研失敗的同學&#xff09; 針對目前這種情況&#xff0c;還能不能進&#xff0c;只能說很難&#xff0c;非常難。 在這里&#xff0c…

Python爬蟲實戰:研究 Lines, bars and markers 模塊,構建電商平臺數據采集和分析系統

1. 引言 1.1 研究背景 隨著互聯網技術的飛速發展,網絡上積累了海量的數據資源,這些數據蘊含著豐富的信息和價值。如何高效地獲取、處理和分析這些數據,成為信息時代面臨的重要課題。Python 作為一種功能強大的編程語言,憑借其豐富的庫支持和簡潔的語法,在網絡數據爬取和…

大文件穩定上傳:Spring Boot + MinIO 斷點續傳實踐

文章目錄一、引言&#xff1a;問題背景二、技術選型與項目架構三、核心設計與實現1. 初始化上傳 (/init)2. 上傳分塊 (/chunk)3. 完成上傳與合并 (/complete)4. 查詢上傳進度 (/progress)四、斷點續傳工作流程五、方案優勢總結六、拓展優化七、方案優勢對比一、引言&#xff1a…

表達式語言EL

表達式語言EL 1.EL表達式的作用 可以說&#xff0c;EL&#xff08;Expression Language&#xff09;表達式語言&#xff0c;就是用來替代<% %>的&#xff0c;EL比<%%>更簡潔&#xff0c;更方便。 2.與請求參數有關的內置對象 1.使用表達式&#xff1a;<%request…

pycharm無法添加本地conda解釋器/命令行激活conda時出現很多無關內容

本文主要解決以下兩種問題&#xff1a;1.pycharm在添加本地非base環境時出現無法添加的情況&#xff0c;特征為&#xff1a;正在創建conda解釋器--->彈出一個黑窗口又迅速關閉&#xff0c;最終無法添加成功2.在conda prompt中進行activate 指定env&#xff08;非base&#x…

LeetCode 844.比較含退格的字符串

給定 s 和 t 兩個字符串&#xff0c;當它們分別被輸入到空白的文本編輯器后&#xff0c;如果兩者相等&#xff0c;返回 true 。# 代表退格字符。 注意&#xff1a;如果對空文本輸入退格字符&#xff0c;文本繼續為空。 示例 1&#xff1a; 輸入&#xff1a;s “ab#c”, t “a…

什么是涌浪電壓

涌浪電壓&#xff08;浪涌電壓&#xff09;是電路或設備在運行時突然出現的、超出額定電壓的瞬時過電壓。它通常由雷擊、電感性負載的斷開、電力系統的故障切換或大型電容性負載的接通等原因引起。涌浪電壓是一種高能量的瞬變干擾&#xff0c;可能損壞電子設備&#xff0c;如擊…

uniapp 優博訊k329藍牙打印機,設置打印機,一鍵打印

設置頁面&#xff1a;<template><view class"pageBg"><u-navbar leftIconColor"#fff" :leftIconSize"28" title"打印設置" bgColor"#3c9cff" :placeholder"true"leftClick"$navigateBack&quo…

pikachu之sql注入

目錄 XX型注入 insert/update注入 delete注入 "http header"注入 基于boolian的盲注 基于時間的盲注 寬字節注入&#xff08;wide byte注入&#xff09; pikachu靶場的字符型注入中xx or 11#可以得到所有用戶的信息。 XX型注入 首先輸入1探測一下。 然后返回…

TLS(傳輸層安全協議)

文章目錄一、核心概念二、為什么需要 TLS/SSL&#xff1f;三、工作原理與詳細流程握手步驟詳解&#xff1a;1.ClientHello & ServerHello&#xff1a;2.服務器認證 (Certificate, ServerKeyExchange)&#xff1a;3.客戶端響應 (ClientKeyExchange, Finished)&#xff1a;4.…

【SpringMVC】SSM框架【二】——SpringMVC超詳細

SpringMVC 學習目標&#xff1a; 1.SpringMVC簡介 1&#xff09;web訪問流程1.web服務器通過瀏覽器訪問頁面2.前端頁面使用異步提交的方式發送請求到后端服務器3.后端服務器采用&#xff1a;表現層—業務層—數據層的架構進行開發4.頁面請求由表現層進行接收&#xff0c;獲取用…

PostgreSQL表膨脹的危害與解決方案

PostgreSQL 的 表膨脹&#xff08;Table Bloat&#xff09; 是數據庫中由于 MVCC&#xff08;多版本并發控制&#xff09;機制導致的一種常見性能問題&#xff0c;表現為物理存儲空間遠大于實際有效數據量。以下是詳細解釋及其危害&#xff1a;一、表膨脹的產生原因 1. MVCC 機…

Elasticsearch面試精講 Day 5:倒排索引原理與實現

【Elasticsearch面試精講 Day 5】倒排索引原理與實現 在“Elasticsearch面試精講”系列的第五天&#xff0c;我們將深入探討搜索引擎最核心的技術基石——倒排索引&#xff08;Inverted Index&#xff09;。作為全文檢索系統的靈魂&#xff0c;倒排索引直接決定了Elasticsearc…

【小白筆記】基本的Linux命令來查看服務器的CPU、內存、磁盤和系統信息

一、 核心概念與命令知識點英文名詞&#xff08;詞源解釋&#xff09;作用與命令CPU (中央處理器)Central Processing Unit&#xff1a;<br> - Central&#xff08;中心的&#xff09;&#xff1a;來自拉丁語 centralis&#xff0c;意為“中心的”。<br> - Process…