本文是接续上文,针对于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…