如何添加 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/private 和system/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_contexts 和 system/sepolicy/prebuilts/api/29.0/private/file_contexts 中添加:
/system/bin/HelloServer u:object_r:helloserver_dt_exec:s0
注意 file_contexts 最后一行必须是空行,不然无法编译过。
在 system/sepolicy/private/service_contexts 和 system/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 系统服务 工作学习过程中,我们可能需要去阅读不同类型的 Native 系统服务,也有可能会自己去完成一个 Native 系统服务。无论哪种情况都需要我们了解基本的 Native 如何去添加。就像我们写 Android App 得先了解一下四大组件才行…...
【力扣】189.轮转数组
题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 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, 大家好,我是一代,今天给大家带来有关字符函数和字符串函数的有关知识 所属专栏:C语言 创作不易,望得到各位佬们的互三呦 一.字符函数 在C语言中有一些函数是专门为字符设计的,这些函数的使用都需要包含一个头文…...
【CKA模拟题】查询消耗CPU最多的Pod
题干 For this question, please set this context (In exam, diff cluster name) 对于此问题,请设置此上下文(在考试中,diff 集群名称) kubectl config use-context kubernetes-adminkubernetesFind the pod that consumes the …...
网络简略总结
目录 一、三次握手 四次挥手 1、三次握手:为了建立长链接进行交互即建立一个会话,使用http/https协议 2、四次挥手是一个断开连接释放服务器资源的过程 3、如果已经建立了连接,但是客户端突然出现故障了怎么办? 4、谁可以中断连接?客户端还是服务端还是都可以? 5、…...
如何处理错误情况
处理错误情况是确保自动窗帘系统稳定运行的重要一环。在编写代码时,你需要考虑可能发生的各种错误情况,并编写相应的错误处理代码。下面是一些处理错误情况的常见方法: (1)错误检测: 首先,你需要能够检测到错误的发生。…...
【Greenhills】MULTI IDE-GHS最新版本Compiler 23.5.4的兼容性问题
【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 关于GHS推出的最新编译器版本 Compiler 2023.5.4在GHS以前版本的MULTI IDE上面能否使用的问题 2、 问题场景 针对于,客户使用MULTI IDE 8.1.4以前的IDE版本,想要搭载使用最新版本的编译器…...
用连续自然数之和来表达整数 - 华为OD统一考试(C卷)
OD统一考试(C卷) 分值: 100分 题解: Java / Python / C++ 题目描述 一个整数可以由连续的自然数之和来表示。给定一个整数,计算该整数有几种连续自然数之和的表达式,且打印出每种表达式。 输入描述 一个目标整数T (1 <=T<= 1000) 输出描述 该整数的所有表达式…...
SQLiteC/C++接口详细介绍之sqlite3类(十二)
返回目录:SQLite—免费开源数据库系列文章目录 上一篇:SQLiteC/C接口详细介绍之sqlite3类(十一) 下一篇:SQLiteC/C接口详细介绍之sqlite3类(十三) 37.sqlite3_load_extension 用于在SQLit…...
linux系统--------------mysql数据库管理
目录 一、SQL语句 1.1SQL语言分类 1.2查看数据库信息 1.3登录到你想登录的库 1.4查看数据库中的表信息 1.5显示数据表的结构(字段) 1.5.1数据表的结构 1.5.2常用的数据类型: 二、关系型数据库的四种语言 2.1DDL:数据定义语言&am…...
网络——入门基础
目录 协议 网络协议 OSI七层模型 网络传输基本流程 网络传输流程图 局域网通信 数据包的封装和解包 广域网通信 网络地址管理 IP地址 MAC地址 协议 关于什么是局域网,什么是广域网,我这里就不过多赘述了,我们直接来谈一下什么…...
二、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语言的,不是windows操作系统的,和PATH环境变量完全不同classpath环境变量是给classloader(类加载器)指路的java A 。执行后,先启动JVM, JVM启动classload…...
Linux快速入门,上手开发 01.学习路线
少时曾许凌云志,当取世间第一流 再见少年拉满弓,不惧岁月不飓风 —— 24.3.20 1.Linux的发展历史 2.VM虚拟机的Linux初体验 3.图形化页面设置系统——快速上手 4.命令行操作——向专业前进 5.核心操作命令——必知必会(管理企业级权限/定位b…...
JSX return里面如何用if判断
在JSX中,由于不能直接使用传统的JavaScript if 语句,但可以通过条件渲染来实现类似的效果。以下是一些方法: 1. 三元运算符(Ternary Operator) 最简单的条件渲染方式是使用三元运算符: return (<div>{condition ? <ComponentIfTrue /> : <Com…...
Vulnhub靶机渗透:DC-7打靶记录
前言 自信自强,来自于不怕苦、不怕难的积淀。宝剑锋从磨砺出,梅花香自苦寒来;任何美好理想,都离不开筚路蓝缕、手胼足胝的艰苦奋斗! 靶场介绍 DC-7是一个初中级的靶场,需要具备以下前置知识:…...
目标检测---IOU计算详细解读(IoU、GIoU、DIoU、CIoU、EIOU、Focal-EIOU、SIOU、WIOU)
常见IoU解读与代码实现 一、✒️IoU(Intersection over Union)1.1 🔥IoU原理☀️ 优点⚡️缺点 1.2 🔥IoU计算1.3 📌IoU代码实现 二、✒️GIoU(Generalized IoU)2.1 GIoU原理☀️优点⚡️缺点 2…...
探索并发编程:深入理解线程池
文章目录 前言一、线程池是什么?二、如何创建线程池1.使用Executors类2.使用ThreadPoolExecutor类手动配置线程池 总结 前言 随着计算机系统的不断发展和进步,我们需要处理更多的并发任务和复杂的操作。而线程池作为一种高效的线程管理机制,…...
html5cssjs代码 023 公制计量单位进位与换算表
html5&css&js代码 023 公制计量单位进位与换算表 一、代码二、解释 这段HTML代码定义了一个网页,用于展示公制计量单位的进位与换算表。 一、代码 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"utf-8&quo…...
java面试必问14:MySQL 索引类型:从基础到优化,面试官给你点赞
MySQL 索引类型:从基础到优化,一篇讲透面试官:“MySQL 有哪些索引类型?” 你:“主键索引、唯一索引、普通索引、复合索引、全文索引。索引能大大加快查询速度,但会降低增删改的性能。” 面试官:…...
终极BepInEx指南:5分钟搞定Unity游戏模组开发
终极BepInEx指南:5分钟搞定Unity游戏模组开发 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 你是否曾经想过为心爱的Unity游戏添加新功能,却不知道从何入手…...
ANSYS分析问题:发现至少一个几何体在至少2个方向上只有1个单元,并且集成度降低。这种情况可能导致结果无效或是求解器主元错误。
🎓作者简介:科技自媒体优质创作者 🌐个人主页:莱歌数字-CSDN博客 💌公众号:莱歌数字(B站同名) 📱个人微信:yanshanYH 211、985硕士,从业16年 从…...
从Arduino到STM32:手把手教你将GRBL固件移植到STM32F446RE开发板(附引脚配置详解)
从Arduino到STM32:GRBL固件移植实战指南 在创客和CNC爱好者社区中,GRBL作为一款开源的运动控制固件,因其高效稳定而广受欢迎。传统上它运行在Arduino的Atmega328P芯片上,但随着项目复杂度提升,许多开发者开始寻求性能更…...
嵌入式Linux驱动开发(3)——内核模块机制 - Linux 的插件系统
嵌入式Linux驱动开发(3)——内核模块机制 - Linux 的插件系统 仓库已经开源!所有教程,主线内核移植,跑新版本imx-linux/uboot都在这里!欢迎各位大佬观摩!喜欢的话点个⭐! 仓库地址&a…...
别再死记MobileNet结构了!用PyTorch手撕V1/V2/V3的深度可分离卷积(附代码对比)
从零实现MobileNet系列:深度可分离卷积的PyTorch实战解析 在移动端和嵌入式设备上部署神经网络模型时,我们常常面临计算资源有限的挑战。传统卷积神经网络如VGG、ResNet虽然性能优异,但其庞大的参数量和计算量使得它们难以在资源受限的环境中…...
GraphvizOnline:基于Web的高效图形可视化专业工具
GraphvizOnline:基于Web的高效图形可视化专业工具 【免费下载链接】GraphvizOnline Lets Graphviz it online 项目地址: https://gitcode.com/gh_mirrors/gr/GraphvizOnline GraphvizOnline是一款基于Web的图形可视化工具,通过创新的技术架构实现…...
Agent Skill开发:Qwen3-ForcedAligner-0.6B语音助手集成
Agent Skill开发:Qwen3-ForcedAligner-0.6B语音助手集成 1. 引言 你有没有遇到过这种情况:对着智能音箱说了半天,它却总是理解错你的意思?或者看视频时想要精确找到某个台词出现的时间点,却要反复拖动进度条…...
0419晨间日记
- 关键词 - 上午- 出发- 浦东到太原- - 浦东机场- 打印登机牌- 身份证- 自助托运- 身份证- 个人免费20kg- 安检- 所有的电子类拿出来- 液体类倒掉- 国内登机口- 身份证- 找登机口- 登机- 登机牌,撕掉- 扫描登机牌 - 下午- 等待- 13点到了太原洲际- 到了酒店…...
SeqGPT-560M实操手册:审计底稿中‘被审计单位’‘问题描述’‘整改建议’三段式抽取
SeqGPT-560M实操手册:审计底稿中‘被审计单位’‘问题描述’‘整改建议’三段式抽取 1. 项目简介 SeqGPT-560M是一个专门为企业级信息抽取需求定制开发的高性能AI系统。与常见的聊天对话模型不同,这个系统专注于一件事:从复杂的非结构化文本…...
