【Android车载系列】第11章 系统服务-SystemServer自定义服务
1 编写自定义系统服务
1.1 AIDL接口定义
系统源码目录/frameworks/base/core/java/android/app/
下新建AIDL接口IYvanManager.aidl
package android.app;/**
* 目录:/frameworks/base/core/java/android/app/IYvanManager.aidl
*/
interface IYvanManager{String request(String msg);
}
1.2 服务端
package com.android.server.yvan;import android.app.IYvanManager;
import android.os.RemoteException;/*** 服务端 AMS PMS WMS* 目录:/frameworks/base/services/core/java/com/android/server/yvan/YvanManagerService.java*/
public class YvanManagerService extends IYvanManager.Stub {@Overridepublic String request(String msg) throws RemoteException {return "YvanManagerService接收数据:"+msg;}
}
1.3 客户端
package android.app;import android.annotation.SystemService;
import android.compat.annotation.UnsupportedAppUsage;
import android.content.Context;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Singleton;
import android.os.ServiceManager;
import android.annotation.Nullable;
/*** 客户端* 目录:/frameworks/base/core/java/android/app/YvanManager.java*/
@SystemService(Context.YVAN_SERVICE)
public class YvanManager{/*** @hide*/public YvanManager() {}/*** @hide*/public static IYvanManager getServerice(){return I_YVAN_MANAGER_SINGLETON.get();}@UnsupportedAppUsageprivate static final Singleton<IYvanManager> I_YVAN_MANAGER_SINGLETON =new Singleton<IYvanManager>() {@Overrideprotected IYvanManager create() {final IBinder b= ServiceManager.getService(Context.YVAN_SERVICE);final IYvanManager im=IYvanManager.Stub.asInterface(b);return im;}};@Nullablepublic String request(@Nullable String msg){try{return getServerice().request(msg);}catch (RemoteException e){throw e.rethrowFromSystemServer();}}
}
1.4 添加上下文件常量
/frameworks/base/core/java/android/context/Context.java
文件下添加服务名字:
public static final String YVAN_SERVICE = "yvan";
- 常量内增加该服务
YVAN_SERVICE
@StringDef(suffix = { "_SERVICE" }, value = {POWER_SERVICE,//@hide: POWER_STATS_SERVICE,WINDOW_SERVICE,LAYOUT_INFLATER_SERVICE,ACCOUNT_SERVICE,ACTIVITY_SERVICE,YVAN_SERVICE,
1.5 注册BINDER
1.5.1 frameworks/base/services/java/com/android/server/SystemServer.java
文件下startOtherServices()
方法下将服务添加
ServiceManager.addService(Context.YVAN_SERVICE,new YvanManagerService());
1.5.2 获取服务在Context中getSystemService()
方法ContextImpl中实现
SystemServiceRegistry.getSystemService(this, name);
1.5.3 frameworks/base/core/java/android/app/SystemServiceRegistry.java
为用于给客户端获取服务的类,其中有一个static块 执行了registerService()
用于注册
registerService(Context.YVAN_SERVICE, YvanManager.class,new CachedServiceFetcher<YvanManager>() {@Overridepublic YvanManager createService(ContextImpl ctx) {return new YvanManager();}});
1.5.4 最后修改SeLinux安全权限
system/sepolicy/prebuilts/api/32.0/private/ 与 system/sepolicy/private/
目录下,分别修改以下三个文件
1.service_contexts
#配置自定义服务selinux角色
yvan u:object_r:yvan_service:s0
用户:角色:类型:安全级别
2.service.te
#配置自定义服务类型的权限
type yvan_service,
app_api_service, ephemeral_app_api_service,
system_server_service,
service_manager_type;
3.untrusted_app_all.te
#允许所有app使用自定义服务
allow untrusted_app_all yvan_service:service_manager find;
1.5.5 更新并编译
#更新:make update-api
#编译:m
#运行模拟器:emulator
1.5.6 服务添加成功验证
adb shell service list |grep yvan
2 使用自定义服务
2.1 方法一:利用双亲委托机制
一般只是用来调试自己的服务功能是否正常
package android.app;public class YvanManager {public String request(String msg){return null;}
}// 使用
YvanManager yvanManager=(YvanManager)getSystemService("yvan");
String str=yvanManager.request("app msg!");
Log.i("yvan",str);
2.2 方法二:通过修改SDK配置
自定义SDK给应用层使用
2.2.1 把正在使用的SDK复制一份并改名为android-32.car,android-32.car中的platforms和sources下的平台同样也复制一份
2.2.2 将复制出来的原生SDK/platforms中的android.jar用自己编译出的替换
out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes-header.jar
2.2.3 修改SDK配置
2.2.3.1 修改android-32.car\platforms\android-321\source.properties
#指定自定义平台标识为321(可以是任意数字,但为了与原生标识区分,请使用三位数) #修改: Pkg.Desc=Android SDK Platform 321 Pkg.UserSrc=false #修改: Platform.Version=321 Platform.CodeName= Pkg.Revision=1 #修改: AndroidVersion.ApiLevel=321 Layoutlib.Api=15 Layoutlib.Revision=1 Platform.MinToolsRev=22
2.2.3.2 修改 android-32.car\platforms\android-321\package.xml
<localPackage path="platforms;android-321" obsolete="false"> <type-details xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:type="ns5:platformDetailsType"> <!-- 修改 --> <api-level>321</api-level> <codename></codename> <layoutlib api="15"/></type-details> <revision> <major>1</major> </revision> <!-- 修改 --> <display-name>Android SDK Platform 321</display-name> <uses-license ref="android-sdk-license"/>
</localPackage>
2.2.4 配置源码跳转
修改android-32.car\sources\android-321
目录下的,参考第3步source.properties
和package.xml
文件
3 思考题
如何编写自定义服务并要求有系统执行过程的生命周期管理
???参考AMS服务的生命周期管理。
相关文章:

【Android车载系列】第11章 系统服务-SystemServer自定义服务
1 编写自定义系统服务 1.1 AIDL接口定义 系统源码目录/frameworks/base/core/java/android/app/下新建AIDL接口IYvanManager.aidl package android.app;/** * 目录:/frameworks/base/core/java/android/app/IYvanManager.aidl */ interface IYvanManager{String …...
Lerna
Lerna Lerna是一个优化基于gitnpm的多pagkage项目的管理工具 解决的痛点 痛点一:重复操作 多Package本地link多Package依赖安装多Package单元测试多Package代码提交多Package代码发布 痛点二:版本一致性 发布时版本一 致性发布后相互依赖版本升级 package越多,管…...
迁移学习 pytorch
迁移学习(Transfer Learning)是通过使用一个预训练模型来快速训练一个新的网络模型,通常应用于数据集较小或计算资源较少的情况下。在 PyTorch 中,由于 torchvision 库中已经内置了一些经典的预训练模型,因此我们可以通过简单的调用函数来实现迁移学习。 下面是一个基于 …...

【python】keras包:深度学习( RNN循环神经网络 Recurrent Neural Networks)
RNN循环神经网络 应用: 物体移动位置预测、股价预测、序列文本生成、语言翻译、从语句中自动识别人名、 问题总结 这类问题,都需要通过历史数据,对未来数据进行预判 序列模型 两大特点 输入(输出)元素具有顺序关系…...

vue框架快速入门
vue 1、第一个Vue程序1.1、什么是Vue程序1.2、为什么要使用MVVM1.3、Vue1.4、第一个vue程序 2、基础语法2.1、v-bind2.2、v-if, v-else2.3、v-for2.4、v-on 3、Vue表单双绑、组件3.1、什么是双向数据绑定3.2、在表单中使用双向数据绑定3.3、什么是组件 4、Axios异步…...

Java连接顺丰开放平台
今天使用Java去访问顺丰的开放平台时,JSON转换一直不成功,最终发现是 可以看到这里是 "apiResultData": "{\"success\": .........它是以 " 开头的!!!如果是对象的话,那么…...

前端三剑客 - HTML
前言 前面都是一些基础的铺垫,现在就正式进入到web开发环节了。 我们的目标就是通过学习 JavaEE初阶,搭建出一个网站出来。 一个网站分成两个部分: 前端(客户端) 后端(服务器) 通常这里的客户端…...

【计算机视觉 | 自然语言处理】BLIP:统一视觉—语言理解和生成任务(论文讲解)
文章目录 一、前言二、试玩效果三、研究背景四、模型结构五、Pre-training objectives六、CapFilt架构七、Experiment八、结论 一、前言 今天我们要介绍的论文是 BLIP,论文全名为 Bootstrapping Language-Image Pre-training for Unified Vision-Language Understa…...

c++基础-运算符
目录 1关系运算符 2运算符优先级 3关系表达式的书写 代码实例: 下面是面试中可能遇到的问题: 1关系运算符 C中有6个关系运算符,用于比较两个值的大小关系,它们分别是: 运算符描述等于!不等于<小于>大于<…...
美术馆c++
题目: 杜老师非常喜欢玩一种叫做“美术馆”的数字游戏,蜗蜗看了之后决定也来试一试,他改编了这个游戏,规则如下: 有一个 n� 行 m� 列的方格,每一个格子中有一个数,数字…...

浅谈MySQL索引以及执行计划
MySQL索引及执行计划 🐪索引的作用🐫索引的分类(算法)🦙BTREE索引算法演变🦒Btree索引功能上的分类4.1 辅助索引4.2 聚集索引4.3 辅助索引和聚集索引的区别 🐘辅助索引分类🦏索引树高…...

在c++项目中使用rapidjson(有具体的步骤,十分详细) windows10系统
具体的步骤: 先下载rapidjson的依赖包 方式1:直接使用git去下载 地址:git clone https://github.com/miloyip/rapidjson.git 方式2:下载我上传的依赖包 将依赖包引入到项目中 1 将解压后的文件放在你c项目中 2 将rapidjson文…...
编译方式汇总:Makefile\configure\autogen.sh\configure.ac、Makefile.am文件
一、前言 文章目的:针对各种开源项目,由于部分项目文档写的不够详细,(或者是我太菜了),没有进行详细的介绍怎么编译该项目,导致花费过多时间在查找如何编译该项目上。因此该篇文章针对目前遇到的…...
explicit关键字
explicit关键字只能用来修饰构造函数。使用explicit可以禁止编译器自动调用拷贝初始化,还可以禁止编译器对拷贝函数的参数进行隐式转换。 那么什么是隐式转换呢? 类 命名 参数; //有参构造类 命名 命名对象; //拷贝构造&#x…...
[优雅的面试] 你了解python的对象吗
前情提要:小编面试,结果面试官着急去吃饭~又约了这次来面,不晓得又会问什么问题呢? 面试官大佬:小伙子来的挺准时的(赞赏的表情~),今天咱们接着聊哈,小伙子,你有对象了没?…...

【hello Linux】线程概念
目录 1. 线程概念的铺设 2. Linux线程概念 2.1 什么是线程 2.2 线程的优点 2.3 线程的缺点 2.4 线程异常 2.5 线程用途 3. Linux进程VS线程 4. Linux线程控制 4.1 POSIX线程库 4.2 创建线程 4.3 进程ID和线程ID 4.4 线程终止 4.5 线程等待 4.6 分离线程 Linux🌷 1…...

JavaWeb07(MVC应用01[家居商城]连接数据库)
目录 一.什么是MVC设计模式? 1.2 MVC设计模式有什么优点? 二.MVC运用(家居商城) 2.1 实现登录 2.2 绑定轮播【随机三个商品】 2.2.1 效果预览 index.jsp 2.3 绑定最新上架&热门家居 2.3.1 效果预览 2.3.2 代码实现 数据…...
如何使用电商API接口API接口如何应用
使用API接口 API(应用程序接口)是现代软件开发中必不可少的一部分,它通常允许软件与其他软件或服务进行交互。使用API可以大大提高软件的灵活性和可扩展性,并允许您轻松添加新的功能和服务,因此,API接口的…...

【移动端网页布局】流式布局案例 ⑥ ( 多排按钮导航栏 | 设置浮动及宽度 | 设置图片样式 | 设置文本 )
文章目录 一、多排按钮导航栏样式及核心要点1、实现效果2、总体布局设计3、设置浮动及宽度4、设置图片样式5、设置文本 二、完整代码实例1、HTML 标签结构2、CSS 样式3、展示效果 一、多排按钮导航栏样式及核心要点 1、实现效果 要实现下面的导航栏效果 ; 2、总体布局设计 该导…...

1. 先从云计算讲起
本章讲解知识点 什么是云计算? 为什么要用云计算? 物理服务器与云服务器对比 云计算服务类型 云计算部署类型 1. 什么是云计算? 云计算是一种通过计算机网络以服务的方式提供动态可伸缩的虚拟化资源的计算模式。按照服务层次分为IaaS、…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...

工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)
更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...