返回顶部
首页 > 资讯 > 移动开发 >Android 7.1添加一个 系统底层服务
  • 746
分享到

Android 7.1添加一个 系统底层服务

系统Android 2022-06-06 13:06:00 746人浏览 薄情痞子
摘要

受疫情影响,自己工作目前又比较忙,很长时间没有更细博客了,最近看了一下底层服务,尝试着添加了一个底层服务,之前写过一个文章是 Android在java层添加服务进行通讯,对Ja

受疫情影响,自己工作目前又比较忙,很长时间没有更细博客了,最近看了一下底层服务,尝试着添加了一个底层服务,之前写过一个文章是 Android在java层添加服务进行通讯,对Java层服务感兴趣的同学可以去看一下

Android 7.1 添加一个进程间通讯的系统服务(java层)

本次添加一个底层服务,目的是为了应用程序可以获取此服务 与 底层服务和外部设备进行通讯 .

分为大概几个步骤

1.添加文件

2.编译文件

3.将文件打到ROM中

4.添加sepolicy权限

5.测试权限

一:添加文件

本次涉及的文件如下图所示:


frameworks/base$ tree customcamera 显示文件夹结构
customcamera
├── customcamera //编写可执行文件 
│   ├── Android.mk
│   └── customcamera.cpp
└── libcustomcamera //服务的具体实现类
    ├── CustomCamera.cpp
    └── CustomCamera.h
2 directories, 4 files

1.创建文件夹 customcamera 以及两个子文件夹 customcamera 和 libcustomcamera 

首先在 libcustomcamera文件夹下创建  CustomCamera.cpp 和  CustomCamera.h 因为是简单的Demo 代码写的比较简单.

-----CustomCamera.h 内容如下:


#ifndef ANDROID_GUILH_ADD_SERVICE_H
#define ANDROID_GUILH_ADD_SERVICE_H
#include 
#include 
#include 
#include 
namespace android {
        class CustomCamera: public BBinder{// 从 BBinder 派生,实现本地接口
                public:
                static int instantiate();
                CustomCamera();
                virtual ~CustomCamera();
                virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);
        };
}; //namespace
#endif

------CustomCamera.cpp


#include "CustomCamera.h"
#include 
#include 
namespace android {
    static struct sigaction oldact;
	static pthread_key_t sigbuskey;
	// 把自己注册到系统中
	int CustomCamera::instantiate() {
	ALOGW("CustomCamera instantiate");
    int r = defaultServiceManager()->addService(
				String16("custom_camera"), new CustomCamera());//服务添加到 Binder Driver 中服务名为 custom_camera
		ALOGW("CustomCamera r = %d/n", r);
		return r;
	}
	// 构造函数
	CustomCamera::CustomCamera()
	{
		ALOGW("CustomCamera created");
		pthread_key_create(&sigbuskey, NULL);
	}
	// 析构函数
	CustomCamera::~CustomCamera()
	{
		pthread_key_delete(sigbuskey);
		ALOGW("CustomCamera  destroyed");
	}
	// 这个是服务具体的本地实现,功能实现都应该放在这里面,通过传入执行代码( code ) // 的不同来执行不同的操作,上层隐射为不同的 api 。
	status_t CustomCamera::onTransact(
			uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags){
		switch(code) {
			case 0: {// 根据 code 的不同执行不同的操作
					pid_t pid = data.readInt32();
					int num = data.readInt32();
					num = num + 1000;
					reply->writeInt32(num);
					return NO_ERROR;
				}
				break;
			default:
				return BBinder::onTransact(code, data, reply, flags);
		}
	}};
//namespace

到这一步可以先在libcustomcamera本文件夹下建立一个makefile文件 测试当前写的CustomCamera.cpp 是否正确,当然也可以后期测试,这里就进行后期测试.

之后在customcamera 文件夹下创建 customcamera.cpp 和 Android.mk 文件.

------customcamera.cpp内容如下


#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "../libcustomcamera/CustomCamera.h"
using namespace android;
int main(int arGC, char** argv)
{
	sp proc(ProcessState::self());
	sp sm = defaultServiceManager();//取得 ServiceManager
	ALOGW("CustomCamera ServiceManager: %p", sm.get());
	CustomCamera::instantiate();//把自己添加到 ServiceManager中
	ProcessState::self()->startThreadPool();//启动缓冲池
	IPCThreadState::self()->joinThreadPool();//这里是把服务添加到 Binder闭合循环进程中
}

------Android.mk 内容


LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := ../libcustomcamera/CustomCamera.cpp \
        customcamera.cpp \
LOCAL_CFLAGS := -D__STDC_CONSTANT_MacROS -Wl,-Map=test.map -g -Wno-unused-parameter -Wno-unused-variable
LOCAL_CONLYFLAGS := -std=c11
LOCAL_SHARED_LIBRARIES := libcutils \
                libsysutils \
        libutils \
        libbinder \
        libui \
        libgui \
        liblog
LOCAL_LDLIBS := -llog
LOCAL_MODULE := custom_camera
LOCAL_MODULE_TAGS := optional
LOCAL_C_INCLUDES += $(LOCAL_PATH)
#编译为可执行文件
include $(BUILD_EXECUTABLE)

到此文件编写完毕.

二.编译文件

之后返回到源码根目录 执行如下

~:source build/envsetup.sh 
~:lunch XX

然后回到 frameworks/base/customcamera/customcamera 文件夹 执行 mm 命令,进行单模块编译.

此时应该会看到如下图所示内容: successfully 编译成功  (因为代码简单也就五六秒钟)

然后到上图对应的目录下去查找可以看到 :custom_camera 已经在存在了 (红色框内)

三. 打到ROM 中

1.因为我们是在framework/base下面创建的文件Android.mk 系统全编译的时候会自动拷贝到 out目录下的 system/bin下

这样打ROM的时候会把编译好的 custom_camera 带到系统ROM里面.

2.如果我们是在外部提前编译好的 custom_camera 将custom_camera放到某一个文件夹下, 在系统的对应的mk中添加拷贝代码.

比如我的是高通的代码 添加 路径为 device/qcom/msmxxx/msmxxx.mk文件,在文件中增加拷贝custom_camera代码如下:


PRODUCT_COPY_FILES += \
    /custom_camera:system/bin/custom_camera
例如如下面的代码就是拷贝custom_camera 到system/文件夹下
PRODUCT_COPY_FILES += \
    out/target/product/msm8953_64/system/bin/custom_camera:system/bin/custom_camera

这句话的意思就是标示 如果编译系统的时候 将这个文件 拷贝到 out/target/product/msmxxxx/system/bin/custom_camera

  四.启动服务

添加启动服务的代码 文件路径为 device/qcom/msmXXX/init.target.rc  其它平台的可能是其它的 .rc 但是逻辑是一样的

先修改权限


    #修改权限 增加的代码
     chmod 0777 /system/bin/custom_camera
    #系统代码不必关注
     chmod 0660 /sys/devices/soc.0/78b7000.i2c/i2c-3/3-0020/input/input0/secure_touch_enable

增加开机启动服务


#启动我们的服务,开机启动
service custom_camera /system/bin/custom_camera
    class core
    user root
    group root
    oneshot
五.测试服务 

//在应用程序中测试服务的代码:
    private void test(){
                try{
                        IBinder binder = ServiceManager.getService("custom_camera");// 取得服务
                        Parcel data = Parcel.obtain();
                        Parcel reply = Parcel.obtain();
                        if(binder == null)
                        Log.d(TAG,"failed to get custom_camera");
                        data.writeInt(Process.myPid());// 固定操作
                        data.writeInt(100);// 传入参数
                        binder.transact(0, data, reply, 0);// 执行远程调用
                        Log.d(TAG," custom_camer aresult="+reply.readInt());// 验证结果
                }catch(Exception e){
                         Log.d(TAG,e.toString());
                }
六.添加selinux权限

Android 7.1 添加一个进程间通讯的系统服务(java层) 文章的后半部分有介绍,这里就不再过多赘述

主要涉及如下几个文件



#主要是修改 neverallow 内容
#-mcu_service
system/sepolicy/domain.te
#/system/bin/custom_camera  u:object_r:custom_camera_service_exec:s0
system/sepolicy/file_contexts
# custom_camera               u:custom_camera_service_exec:s0
system/sepolicy/custom_camera.te # 拷贝别的te修改名字就行
# custom_camera               u:object_r:custom_camera_service_service:s0
system/sepolicy/service_contexts #  与 file_contexts 相对应

作者:ChaoLi_Chen


--结束END--

本文标题: Android 7.1添加一个 系统底层服务

本文链接: https://lsjlt.com/news/29554.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android 7.1添加一个 系统底层服务
    受疫情影响,自己工作目前又比较忙,很长时间没有更细博客了,最近看了一下底层服务,尝试着添加了一个底层服务,之前写过一个文章是 Android在java层添加服务进行通讯,对Ja...
    99+
    2022-06-06
    系统 Android
  • 怎么在Android系统中添加服务
    怎么在Android系统中添加服务?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。如何获取系统服务我们获取系统服务都是在context中,getSystemService获取...
    99+
    2023-05-31
    android roi %d
  • Ubuntu如何添加一个服务
    小编给大家分享一下Ubuntu如何添加一个服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Ubuntu简介Ubuntu是一个以桌面应用为主的Linux操作系统,...
    99+
    2023-06-27
  • 怎么在Ubuntu系统中添加一个辅助IP地址
    小编给大家分享一下怎么在Ubuntu系统中添加一个辅助IP地址,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linux 管理员应该意识到这一点,因为这是一项例行任...
    99+
    2023-06-16
  • android 12.0 添加自定义系统服务接口给app调用
    1.前言 0 定制化开发中,在app需要调用系统层的一些功能的时候,由于受限于系统api权限或者某些api被隐藏了,所以需要添加自定义系统服务给app调用 首先要自定义服务 然后给app调用就好 2.自定义服务功能实现 添加自定义系统服务A...
    99+
    2023-09-12
    android system systemserver 自定义服务 添加自定义服务
  • windows系统如何添加和删除redis服务
    小编给大家分享一下windows系统如何添加和删除redis服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体方法如下:一、...
    99+
    2024-04-02
  • CentOS 7怎么添加自定义系统服务
    小编给大家分享一下CentOS 7怎么添加自定义系统服务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Centos7开机启动项分为system和user两种类型 ...
    99+
    2023-06-10
  • 探索 Google 云数据库托管服务中的底层操作系统
    简介 任何公司的主要目标之一都是关注其服务的进步。例如,Google Cloud是众所周知的云服务提供商,其服务包括SQL Server引擎、MYSQL和PostgreSQL。 数据库需要很长时间才能完成修补操作系统等任务。在 Googl...
    99+
    2023-10-22
  • CentOS7将Nginx添加系统服务的方法步骤
    导语 经过编译安装以及解决问题,Nginx 已经运行正常,但是此时 Nginx 并没有添加进系统服务。接下来会将 Nginx 添加进系统服务并且设置开机启动。 查看服务 首先查看 Nginx 的服务状态,输入 syste...
    99+
    2022-06-04
    CentOS7 Nginx添加系统服务 CentOS7 添加系统服务
  • CentOS7 systemd添加自定义系统服务的方法
    systemd: CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,即:/usr/lib/systemd/system ,/usr/l...
    99+
    2022-06-04
    CentOS7 systemd 系统服务 CentOS7 添加自定义系统服务
  • 怎么添加Dropbox服务到系统右键菜单
    这篇文章主要介绍“怎么添加Dropbox服务到系统右键菜单”,在日常操作中,相信很多人在怎么添加Dropbox服务到系统右键菜单问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么添加Dropbox服务到系统右...
    99+
    2023-06-14
  • 阿里云服务器系统账号的添加方法
    在使用阿里云服务器的过程中,系统账号的添加是非常重要的一步。本文将详细介绍如何在阿里云服务器上添加系统账号。 一、添加系统账号的步骤登录阿里云控制台首先,你需要登录阿里云控制台,通过用户名和密码进行登录。打开实例列表在控制台的左侧菜单栏,点...
    99+
    2023-10-29
    阿里 账号 服务器
  • 云服务器系统哪个好一点
    云服务器系统是一种高可扩展的云计算服务,可以根据用户的需求进行快速部署和配置,可以为用户提供稳定、高效的云计算服务。不同品牌和型号的云服务器系统各有所长,具体哪个好要看您的使用需求和预算。 以下是几个常见的云服务器系统品牌和型号推荐: ...
    99+
    2023-10-27
    服务器 系统
  • 云服务器哪个系统好一点
    云服务器提供商有很多,每一家提供的服务和性能都不同,因此没有一个特别好的系统可以比较。 以下是根据您的具体要求,云服务器系统哪个系统好一些: IaaS云服务器:比如AWS、Google Cloud等,它们提供高可用性和高可靠性的云端基础...
    99+
    2023-10-27
    服务器 系统
  • 云服务器系统哪个好一点的
    弹性:云服务器可以随着用户需求自动扩展或缩减计算能力,避免了传统服务器的硬件瓶颈和资源浪费。 安全性:云服务器使用分布式存储和加密技术,能够确保数据的安全性和隐私性。用户不必担心数据泄露或遭受黑客攻击。 可靠性:云服务器使用多台计算机协同...
    99+
    2023-10-27
    服务器 系统
  • 云服务器哪个系统好用一点
    AWS 云服务器 AWS 云服务器是 AWS 推出的云计算平台,它可以提供高性能、低成本和可靠的云计算服务,让用户可以在自己的服务器上运行 AWS 的应用程序。AWS 云服务器的价格非常亲民,是大多数人可以接受的。AWS 云服务器还提...
    99+
    2023-10-28
    好用 服务器 系统
  • 云服务器系统哪个好用一点
    优势 云服务器系统具有以下几个优点: (1) 灵活性:云服务器可以根据用户需求进行自定义配置,可以支持各种不同的计算和存储需求。 (2) 可扩展性:云服务器可以通过分布式架构进行扩展,可以随着用户需求的增长而快速扩容。 (3) 可靠性...
    99+
    2023-10-27
    好用 服务器 系统
  • 怎么在Android中实现一个仿微软系统加载动画效果
    怎么在Android中实现一个仿微软系统加载动画效果?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。实现步骤:初始化五个圆球分别设置中心点,方便画圆利用ValueAnimat...
    99+
    2023-06-14
  • apache与mysql添加进系统服务并设置开机启动
             apache与mysql添加进系统服务并设置开机启动apache1  cp /usr/local/apache/bin/apac...
    99+
    2024-04-02
  • 网络安全之如何添加后门中的系统服务
    这篇文章主要介绍了网络安全之如何添加后门中的系统服务,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。现在很多的木马、后门、蠕虫病毒都是“肆意”通过修改注册表中的RUN键值来实现...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作