当前位置: 首页 > news >正文

如何添加 Android Native 系统服务

如何添加 Android Native 系统服务

工作学习过程中,我们可能需要去阅读不同类型的 Native 系统服务,也有可能会自己去完成一个 Native 系统服务。无论哪种情况都需要我们了解基本的 Native 如何去添加。就像我们写 Android App 得先了解一下四大组件才行。接着我们就来看看如何添加一个 Android Native 系统服务。

开机自启动 Native 程序

首先,我们先来完成一个开启自动动的 Native 程序:

首先我们在我们的自定义 Product device/jelly/rice14 下创建如下的文件与文件夹:

关于自定义 Product,请查看 https://yuandaimaahao.github.io/AndroidFrameworkTutorialPages/0 02.%E7%8E%A9%E8%BD%ACAOSP%E7%AF%87/003.%20%E6%B7%BB%E5%8A%A0%20Product.html

HelloNativeService/
├── Android.bp
├── HelloServer.cpp
└── HelloServer.rc

其中 HelloServer.cpp:

#define LOG_TAG "helloserver"
#include <log/log.h>
#include <unistd.h>int main(int argc, char const *argv[])
{ALOGD("Hello Server is runing");while(1) {sleep(1);}return 0;
}

这是我们的主程序,打印一个 Log,然后进入无线循环。

init.rc 脚本 HelloServer.rc:

service HelloServer /system/bin/HelloServerclass coreuser systemgroup system

当启动启动的时候,init 程序会解析我们的 init.rc 教程,并启动我们的程序。

接着,我们需要编写我们的 Android.bp 文件:

cc_binary {name: "HelloServer",srcs: ["HelloServer.cpp"],shared_libs: ["liblog",],init_rc: ["HelloServer.rc"],
}

接着,改编译文件 rice14.mk :

PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST +=\/system/bin/HelloClientPRODUCT_PACKAGES += \HelloServer

最后我们,编译运行我们的程序:

source build/envsetup.sh
lunch rice14-eng
make -j32
# 进入 Android 模拟器
adb shell 
logcat | grep Hello

接着我们就可以看到打印的 Log 了:

07-16 16:25:06.670  1530  1530 D helloserver: Hello Server is runing

说明,我们的开机自启动程序就启动成功了

添加 Native 服务

接着我们在 device/jelly/rice14/HelloNativeService 目录下创建包目录 com/yuandaima

接着在包目录下创建:

package com.yuandaima;interface IHello {void hello();int sum(int x, int y);
}

接着在项目目录下执行下面的命令,生产源文件:

aidl-cpp com/yuandaima/IHello.aidl ./ ./IHello.cpp

接着我们完善 HelloServer 程序

#define LOG_TAG "helloserver"
#include <log/log.h>#include <unistd.h>
#include <stdlib.h>
#include <utils/RefBase.h>
#include <utils/Log.h>
#include <binder/TextOutput.h>
#include <binder/IInterface.h>
#include <binder/IBinder.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>#include "com/yuandaima/IHello.h"
#include "com/yuandaima/BnHello.h"using namespace android;class MyHelloService : public com::yuandaima::BnHello
{public:binder::Status hello() {ALOGI("server hello function is running");return binder::Status();}binder::Status sum(int32_t x, int32_t y, int32_t* _aidl_return) {ALOGI("server sum function is running");*_aidl_return = x + y;return binder::Status();}};int main(int argc, char const *argv[])
{ALOGD("Hello Server is runing");defaultServiceManager()->addService(String16("MyHelloService"), new MyHelloService());ProcessState::self()->startThreadPool();IPCThreadState::self()->joinThreadPool();return 0;
}

接着我们写一个 HelloClient 来测试我们的服务程序:

#define LOG_TAG "aidl_cpp"
#include <log/log.h>#include <stdlib.h>
#include <utils/RefBase.h>
#include <utils/Log.h>
#include <binder/TextOutput.h>
#include <binder/IInterface.h>
#include <binder/IBinder.h>
#include <binder/ProcessState.h>
#include <binder/IServiceManager.h>
#include <binder/IPCThreadState.h>#include "com/yuandaima/IHello.h"
#include "com/yuandaima/BpHello.h"using namespace android;int main(int argc, char const *argv[])
{sp<IServiceManager> sm = defaultServiceManager();sp<IBinder> binder = sm->getService(String16("MyHelloService"));sp<com::yuandaima::IHello> hello = interface_cast<com::yuandaima::IHello>(binder);hello->hello();int ret = 0;hello->sum(1, 2, &ret);return 0;
}

然后,完善 Android.bp

cc_binary {name: "HelloServer",srcs: ["HelloServer.cpp", "IHello.cpp"],shared_libs: ["liblog","libcutils","libutils","libbinder",],init_rc: ["HelloServer.rc"],
}cc_binary {name: "HelloClient",srcs: ["HelloClient.cpp", "IHello.cpp"],shared_libs: ["liblog","libcutils","libutils","libbinder",],
}

Selinux 配置

我们需要修改系统的 sepolicy 文件,不能在自定义 Product 的 sepolicy 中添加 selinux 配置,因为会被系统的 seplicy 给覆盖掉。

system/sepolicy/privatesystem/sepolicy/prebuilts/api/29.0/private 中添加:

helloserver.te:

type helloserver_dt, domain, coredomain;
type helloserver_dt_exec, exec_type, file_type, system_file_type;init_daemon_domain(helloserver_dt)allow helloserver_dt servicemanager:binder { call transfer };
allow helloserver_dt HelloServer_service:service_manager { add find };binder_use(helloserver_dt)
add_service(helloserver_dt,HelloServer_service)

编译时,编译系统会同时检查这两个目录,如果不同就会报错,所以我们要同时修改两个地方。

system/sepolicy/private/file_contextssystem/sepolicy/prebuilts/api/29.0/private/file_contexts 中添加:

/system/bin/HelloServer     u:object_r:helloserver_dt_exec:s0

注意 file_contexts 最后一行必须是空行,不然无法编译过。

system/sepolicy/private/service_contextssystem/sepolicy/prebuilts/api/29.0/private/service_contexts 中倒数第二行添加

MyHelloService                            u:object_r:HelloServer_service:s0

注意 service_contexts 最后一行必须是空行,不然无法编译过。

system/sepolicy/private/service.te system/sepolicy/prebuilts/api/29.0/private/service.te
最后一样中添加:

type HelloServer_service,           service_manager_type;

最后编译启动模拟器:

source build/envsetup.sh
lunch rice14-eng
make -j32
# 进入 Android 模拟器
adb shell 
logcat | grep hello

然后就可以看到 Log 了:

07-16 16:42:11.616  1534  1534 D helloserver: Hello Server is runing

接着我们运行我们的客户端程序,再查看 Log:

logcat | grep "hello"                                                           
07-16 16:57:46.794  1531  1531 D helloserver: Hello Server is runing
07-16 16:58:52.638  1531  1577 I helloserver: server hello function is running
07-16 16:58:52.638  1531  1577 I helloserver: server sum function is running

这样,我们的远程调用就成功了。

相关文章:

如何添加 Android Native 系统服务

如何添加 Android Native 系统服务 工作学习过程中&#xff0c;我们可能需要去阅读不同类型的 Native 系统服务&#xff0c;也有可能会自己去完成一个 Native 系统服务。无论哪种情况都需要我们了解基本的 Native 如何去添加。就像我们写 Android App 得先了解一下四大组件才行…...

【力扣】189.轮转数组

题目描述 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6…...

C语言字符函数和字符串函数详解

Hello, 大家好&#xff0c;我是一代&#xff0c;今天给大家带来有关字符函数和字符串函数的有关知识 所属专栏&#xff1a;C语言 创作不易&#xff0c;望得到各位佬们的互三呦 一.字符函数 在C语言中有一些函数是专门为字符设计的&#xff0c;这些函数的使用都需要包含一个头文…...

【CKA模拟题】查询消耗CPU最多的Pod

题干 For this question, please set this context (In exam, diff cluster name) 对于此问题&#xff0c;请设置此上下文&#xff08;在考试中&#xff0c;diff 集群名称&#xff09; kubectl config use-context kubernetes-adminkubernetesFind the pod that consumes the …...

网络简略总结

目录 一、三次握手 四次挥手 1、三次握手:为了建立长链接进行交互即建立一个会话,使用http/https协议 2、四次挥手是一个断开连接释放服务器资源的过程 3、如果已经建立了连接,但是客户端突然出现故障了怎么办? 4、谁可以中断连接?客户端还是服务端还是都可以? 5、…...

如何处理错误情况

处理错误情况是确保自动窗帘系统稳定运行的重要一环。在编写代码时&#xff0c;你需要考虑可能发生的各种错误情况&#xff0c;并编写相应的错误处理代码。下面是一些处理错误情况的常见方法&#xff1a; (1)错误检测&#xff1a; 首先&#xff0c;你需要能够检测到错误的发生。…...

【Greenhills】MULTI IDE-GHS最新版本Compiler 23.5.4的兼容性问题

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 关于GHS推出的最新编译器版本 Compiler 2023.5.4在GHS以前版本的MULTI IDE上面能否使用的问题 2、 问题场景 针对于&#xff0c;客户使用MULTI IDE 8.1.4以前的IDE版本&#xff0c;想要搭载使用最新版本的编译器…...

用连续自然数之和来表达整数 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。 输入描述 一个目标整数T (1 <=T<= 1000) 输出描述 该整数的所有表达式…...

SQLiteC/C++接口详细介绍之sqlite3类(十二)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十一&#xff09; 下一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十三&#xff09; ​37.sqlite3_load_extension 用于在SQLit…...

linux系统--------------mysql数据库管理

目录 一、SQL语句 1.1SQL语言分类 1.2查看数据库信息 1.3登录到你想登录的库 1.4查看数据库中的表信息 1.5显示数据表的结构&#xff08;字段&#xff09; 1.5.1数据表的结构 1.5.2常用的数据类型: 二、关系型数据库的四种语言 2.1DDL&#xff1a;数据定义语言&am…...

网络——入门基础

目录 协议 网络协议 OSI七层模型 网络传输基本流程 网络传输流程图 局域网通信 数据包的封装和解包 广域网通信 网络地址管理 IP地址 MAC地址 协议 关于什么是局域网&#xff0c;什么是广域网&#xff0c;我这里就不过多赘述了&#xff0c;我们直接来谈一下什么…...

二、yocto 集成ros2(基于raspberrypi 4B)

yocto 集成ros2 yocto 集成ros21. 下载ros layer2. 编译集成ros3. 功能验证 yocto 集成ros2 本篇文章为基于raspberrypi 4B单板的yocto实战系列的第二篇文章。 一、yocto 编译raspberrypi 4B并启动 本节我们将ros2机器人操作系统移植到我们的yocto系统里面。 1. 下载ros laye…...

html--bug

文章目录 html html <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>老师</title><style>body {background-color: #008000;margin: 0px;cursor: none;overflow: hidden;}</style></head><bod…...

Java基础学习笔记三

环境变量CLASSPATH classpath环境变量是隶属于java语言的&#xff0c;不是windows操作系统的&#xff0c;和PATH环境变量完全不同classpath环境变量是给classloader&#xff08;类加载器&#xff09;指路的java A 。执行后&#xff0c;先启动JVM&#xff0c; JVM启动classload…...

Linux快速入门,上手开发 01.学习路线

少时曾许凌云志&#xff0c;当取世间第一流 再见少年拉满弓&#xff0c;不惧岁月不飓风 —— 24.3.20 1.Linux的发展历史 2.VM虚拟机的Linux初体验 3.图形化页面设置系统——快速上手 4.命令行操作——向专业前进 5.核心操作命令——必知必会&#xff08;管理企业级权限/定位b…...

JSX return里面如何用if判断

在JSX中,由于不能直接使用传统的JavaScript ​​if​​ 语句,但可以通过条件渲染来实现类似的效果。以下是一些方法: 1. 三元运算符(Ternary Operator) 最简单的条件渲染方式是使用三元运算符: return (<div>{condition ? <ComponentIfTrue /> : <Com…...

Vulnhub靶机渗透:DC-7打靶记录

前言 自信自强&#xff0c;来自于不怕苦、不怕难的积淀。宝剑锋从磨砺出&#xff0c;梅花香自苦寒来&#xff1b;任何美好理想&#xff0c;都离不开筚路蓝缕、手胼足胝的艰苦奋斗&#xff01; 靶场介绍 DC-7是一个初中级的靶场&#xff0c;需要具备以下前置知识&#xff1a;…...

目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、SIOU、WIOU)

常见IoU解读与代码实现 一、✒️IoU&#xff08;Intersection over Union&#xff09;1.1 &#x1f525;IoU原理☀️ 优点⚡️缺点 1.2 &#x1f525;IoU计算1.3 &#x1f4cc;IoU代码实现 二、✒️GIoU&#xff08;Generalized IoU&#xff09;2.1 GIoU原理☀️优点⚡️缺点 2…...

探索并发编程:深入理解线程池

文章目录 前言一、线程池是什么&#xff1f;二、如何创建线程池1.使用Executors类2.使用ThreadPoolExecutor类手动配置线程池 总结 前言 随着计算机系统的不断发展和进步&#xff0c;我们需要处理更多的并发任务和复杂的操作。而线程池作为一种高效的线程管理机制&#xff0c;…...

html5cssjs代码 023 公制计量单位进位与换算表

html5&css&js代码 023 公制计量单位进位与换算表 一、代码二、解释 这段HTML代码定义了一个网页&#xff0c;用于展示公制计量单位的进位与换算表。 一、代码 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8&quo…...

AX-MES生产制造管理系统-总览

前言说起 MES 就不得不说 ERP&#xff0c;但是 ERP 大家基本上都知道&#xff0c;MES 就不一定了&#xff0c;常见的 ERP 系统包括 SAP、金蝶、用友等&#xff0c;ERP的流程相对来说也比较统一&#xff1b;MES就不同了&#xff0c;基本上熟悉业务流程的软件公司都可以开发并实施…...

Blender渲染通道完全指南:如何像电影后期一样,分离出深度、阴影与反射图

Blender渲染通道完全指南&#xff1a;影视级后期制作的深度解析在数字内容创作领域&#xff0c;Blender已经从一个简单的3D建模工具成长为能够处理复杂视觉特效的全流程解决方案。对于追求影视级质量的中高级用户而言&#xff0c;掌握渲染通道技术是提升作品专业度的关键一步。…...

从分立逻辑到单片机:基于ATmega8的MIDI通道分析仪设计与实现

1. 项目概述&#xff1a;从分立逻辑到单片机的MIDI通道分析仪进化史二十年前&#xff0c;当我在《Elektor》杂志上发表第一版MIDI通道分析仪时&#xff0c;整个数字音乐世界还处于一个相当“硬核”的阶段。那个版本的设计&#xff0c;用今天的话来说&#xff0c;简直就是一场“…...

浏览器 Profile 环境排查:Cookie、LocalStorage、网络出口与自动化任务配置清单

一、为什么浏览器环境经常“今天能用&#xff0c;明天失效”很多团队遇到登录状态丢失、页面配置异常、自动化任务失败时&#xff0c;会先怀疑网络、脚本或系统本身。但在实际项目里&#xff0c;问题经常不是单点故障&#xff0c;而是浏览器环境缺少稳定管理&#xff1a;对象常…...

MBTI性格测试

简介 MBTI&#xff08;Myers‑Briggs Type Indicator&#xff0c;迈尔斯‑布里格斯类型指标&#xff09;是基于荣格心理类型理论发展出的性格类型工具&#xff0c;由凯瑟琳库克布里格斯及其女儿伊莎贝尔布里格斯迈尔斯创建。它通过四对偏好维度将个体的认知与行为倾向归纳为 16…...

差分隐私GDP机制紧密度量化:从隐私剖面到∆度量的实践指南

1. 差分隐私GDP机制&#xff1a;从理论到实践&#xff0c;如何量化隐私保护紧密度在差分隐私&#xff08;Differential Privacy, DP&#xff09;的实际部署中&#xff0c;尤其是在机器学习的隐私保护训练&#xff08;如DP-SGD&#xff09;场景里&#xff0c;我们常常面临一个核…...

深度解析网络设备权限管理工具:中兴光猫工厂模式与Telnet服务完整指南

深度解析网络设备权限管理工具&#xff1a;中兴光猫工厂模式与Telnet服务完整指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 在当今网络设备管理领域&#xff0c;获取设备完整控制…...

Unity项目实战:用TriLib插件动态加载FBX模型,5分钟搞定外部资源读取

Unity项目实战&#xff1a;用TriLib插件高效加载外部FBX模型的完整指南在VR展示、产品配置器等需要动态加载用户上传模型的场景中&#xff0c;如何快速实现外部FBX文件的读取是许多Unity开发者面临的挑战。传统的手动导入方式不仅效率低下&#xff0c;更无法满足运行时动态加载…...

5分钟掌握AutoClicker:Windows鼠标点击自动化的终极指南

5分钟掌握AutoClicker&#xff1a;Windows鼠标点击自动化的终极指南 【免费下载链接】AutoClicker AutoClicker is a useful simple tool for automating mouse clicks. 项目地址: https://gitcode.com/gh_mirrors/au/AutoClicker AutoClicker是一款专为Windows设计的鼠…...

麒麟桌面CVE-2024-1086漏洞深度修复指南

1. 这个漏洞不是“修个补丁就完事”&#xff1a;麒麟桌面系统CVE-2024-1086的真实威胁图谱你可能刚在安全通告里看到“麒麟桌面系统修复CVE-2024-1086”&#xff0c;顺手点了个更新&#xff0c;心里想着“又一个内核提权漏洞&#xff0c;打上补丁不就完了&#xff1f;”——我去…...