Android11(RK3568)自定义服务制作(3)-Hardware制作和权限管理
根据上一篇Android11(RK3568)自定义服务制作(2)-Service制作 完成了系统service的注册后,进一步就要完成Hardware层的制作,完成自定义service跟kernel驱动的调用。
通过Service调用Kernel驱动的最简单方法就是用JNI。
首先在hardware/libhardware/modules/下创建hello文件夹,并在hello文件夹中添加hello.c文件
#define LOG_TAG "HelloStub"#include <hardware/hardware.h>
#include <hardware/hello.h>
// #include <fcntl.h>
#include <errno.h>
#include <cutils/log.h>
#include <cutils/atomic.h>#include <malloc.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>#define DEVICE_NAME "/dev/hello"
#define MODULE_NAME "Hello"
#define MODULE_AUTHOR "sommer_jiang@163.com"/*设备打开和关闭接口*/
static int hello_device_open(const struct hw_module_t *module, const char *name, struct hw_device_t **device);
static int hello_device_close(struct hw_device_t *device);/*设备访问接口*/
static int hello_set_val(struct hello_device_t *dev, int val);
static int hello_get_val(struct hello_device_t *dev, int *val);static int hello_device_open(const struct hw_module_t *module, const char *name, struct hw_device_t **device)
{struct hello_device_t *dev;dev = (struct hello_device_t *)malloc(sizeof(struct hello_device_t));if (!dev){ALOGE("Hello Stub: failed to alloc space");return -EFAULT;}memset(dev, 0, sizeof(struct hello_device_t));dev->common.tag = HARDWARE_DEVICE_TAG;dev->common.version = 0;dev->common.module = (hw_module_t *)module;dev->common.close = hello_device_close;dev->set_val = hello_set_val;dev->get_val = hello_get_val;if ((dev->fd = open(DEVICE_NAME, O_RDWR)) == -1){ALOGE("Hello Stub: failed to open /dev/hello -- %s.", strerror(errno));free(dev);return -EFAULT;}*device = &(dev->common);ALOGI("Hello Stub: open /dev/hello successfully.");ALOGI("Hello Stub: name -- %s.", name);return 0;
}static int hello_device_close(struct hw_device_t *device)
{struct hello_device_t *hello_device = (struct hello_device_t *)device;if (hello_device){close(hello_device->fd);free(hello_device);}return 0;
}static int hello_set_val(struct hello_device_t *dev, int val)
{ALOGI("Hello Stub: set value %d to device.", val);write(dev->fd, &val, sizeof(val));return 0;
}static int hello_get_val(struct hello_device_t *dev, int *val)
{if (!val){ALOGE("Hello Stub: error val pointer");return -EFAULT;}read(dev->fd, val, sizeof(*val));ALOGI("Hello Stub: get value %d from device", *val);return 0;
}/*模块方法表*/
static struct hw_module_methods_t hello_module_methods = {.open = hello_device_open};/*模块实例变量*/
struct hello_module_t HAL_MODULE_INFO_SYM = {.common = {.tag = HARDWARE_MODULE_TAG,.version_major = 1,.version_minor = 0,.id = HELLO_HARDWARE_MODULE_ID,.name = MODULE_NAME,.author = MODULE_AUTHOR,.methods = &hello_module_methods,}};
并在相同的目录写下Android.bp,内容如下:
// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.cc_library_shared {name: "hello.default",relative_install_path: "hw",proprietary: true,srcs: ["hello.c"],cflags: ["-Wall", "-Werror"],header_libs: ["libhardware_headers"],shared_libs: ["liblog"],
}
接下来在hardware/libhardware/include/hardware/中添加供引用的hello.h文件
#ifndef ANDROID_HELLO_INTERFACE_H #define ANDROID_HELLO_INTERFACE_H #include <hardware/hardware.h> __BEGIN_DECLS /*定义模块ID*/ #define HELLO_HARDWARE_MODULE_ID "hello" /*硬件模块结构体*/ struct hello_module_t { struct hw_module_t common; }; /*硬件接口结构体*/ struct hello_device_t { struct hw_device_t common; int fd; int (*set_val)(struct hello_device_t* dev, int val); int (*get_val)(struct hello_device_t* dev, int* val); }; __END_DECLS #endif
这几个完成后别忘了在/hardware/libhardware/Android.mk中添加以下硬件模块
hardware_modules := \hello
添加完这些后,可以采用mmm编译整个libhardware来把硬件驱动层完成。
完成了硬件驱动层后,最艰难痛苦的一步来了,就是selinux的填写。其实按照规律也不是很难填写。
/device/rockchip/common/sepolicy/vendor/device.te添加以下设备
#sommerjiang 20211101 add
type hello_device, dev_type;
/device/rockchip/common/sepolicy/vendor/domain.te添加以下代码
#sommerjiang 20211101 add
allow domain hello_device:chr_file rw_file_perms;
/device/rockchip/common/sepolicy/vendor/file_contexts添加以下代码
//sommer.jiang,20211115,add for /dev/hello
/dev/hello u:object_r:hello_device:s0
/device/rockchip/common/sepolicy/private/service_contexts添加以下代码
hello u:object_r:hello_service:s0
/device/rockchip/common/sepolicy/vendor/service.te添加以下代码
type hello_service, system_api_service, system_server_service, service_manager_type;
/device/rockchip/common/sepolicy/vendor/system_app.te添加以下代码
#sommerjiang 20211101 add
allow system_app hello_service:service_manager find;
/device/rockchip/common/sepolicy/vendor/system_server.te添加以下代码
#sommerjiang 20211101 add
allow system_server hello_device:chr_file rw_file_perms;
allow system_server hello_service:service_manager {add };
device/rockchip/common/sepolicy/vendor/untrusted_app.te添加以下代码
#sommer.jiang add
allow untrusted_app hello_service:service_manager find;
至此,所有的中间层都完成了。
Android11(RK3568)自定义服务制作(3)-Hardware制作和权限管理相关推荐
- SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/weixin_44102992/article/ details/107335702 前言 提到权限管理这块肯定很多人第一想到的 ...
- SVN服务端客户端安装配置及权限管理
SVN服务端安装配置: 1. 下载SVN服务端: 下载地址:https://www.visualsvn.com/downloads/ 2. 安装SVN服务端: 打开程序:安装目录\bin\msc程序 ...
- Android11(RK3568)自定义服务制作(2)-Service制作
上一篇介绍了如何在android中制作kernel驱动,并在驱动中留下了dev和sys两种接口供应用程序调用. Android11(RK3568)自定义服务制作(1)-Kernel驱动 一,驱动测试 ...
- 第一节 安卓自定义轮播图的制作
专栏目录 第一节 自定义轮播图的制作 第二节 底部导航栏菜单,炫酷菜单动画,背景变暗.按钮焦点获取 第三节 适配Android10的拍照.从相册获取代码,包括完整的权限申请和图片地址获取 第四节 百度 ...
- 学生老师的家教服务平台小程序制作
学生老师的家教服务平台小程序制作 本文项目是一款连接学生和老师的家教服务平台小程序,主要是为求教家庭提供有效的平台途径,同时也帮助在校大学生以及在职教师找到更多的教学机会,是一款连接学生.家长和老师的 ...
- hbuilder制作简单网页_企业信息化网站+营销服务之电子商务网站制作流程
爱美食爱技术 网站制作流程,是指网站制作过程中必须遵循的工作顺序.每个成品网站都必须按标准流程进行建设.这类似于企业的产品生产线,一个工序一个工序地完成整个产品加工.很多人把网站制作与网页制作混为一谈 ...
- Ambari自定义服务
在学习Ambari的路上,欢迎提出问题并相互交流,共同成长 基础思路框架 一.Pulsar服务部署 ZooKeeper 集群(3 个 ZooKeeper 节点组成) Broker 集群(3 个 Pul ...
- PageAdmin CMS网站制作教程:如何创建及管理栏目?
PageAdmin CMS网站制作教程: 1.登录管理后台后,在顶部导航中找到网站,并点击: 2.在左侧栏目中找到栏目管理,并点击: 3.进入到栏目管理页面,在顶部找到菜单,点击添加. 4.进入到栏目 ...
- 制作报价单,制作价目表的软件和app
报价单制作,制作价目表,主要为商户与个人提供方便快速的电子价目表制作与展示,商户可以通过价目二维码扫一扫为客户提供方便信息浏览.并且提供用户个性化价目表制作定制服务.我们有丰富的价目模版,提供价目表制 ...
- html如何制作一个漂亮的表格?+ 列表制作 + 表单制作(干货!直接收代码)
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 html如何 ...
最新文章
- CNS接连发文背书,原来生姜这么神奇
- LeetCode 1119. Remove Vowels from a String--C++,Java,Python解法
- EWORD 0511
- Android NFC开发实战详解
- 用Shell脚本在推出的RAC节点上批量部署32个Oracle11gR2 RAC备份恢复案例场景的方法PART2...
- const修饰指针和引用的用法【转贴】
- 计算机基础知识ip地址,计算机基础知识练习题
- paip.目录文件列表排序算法
- mysql与_mysql常见的运算符及使用
- 人体姿态估计的基本概念
- 大华NVR接入海康摄像机的设置
- IIC原理超详细讲解---值得一看
- 从 C10K 到 DPDK
- 苹果手机投屏到Windows
- 深大uooc大学生心理健康章节答案第二章
- https请求百度share分享报错问题
- 史上最全——QQ秘籍之全攻略
- OkHttp3使用详解
- postgis版本升级
- Xd等设计可用的相关资源整理