Android 11新增系统服务
1.编写.aidl文件
存放位置:frameworks/base/core/java/android/os
package android.os;interface ISystemVoiceServer {void setHeightVoice(int flag);void setBassVoice(int flag);void setReverbVoice(int flag);}
2.将.aidl文件添加到frameworks/base/Android.bp
filegroup {name: "framework-core-sources",srcs: ["core/java/**/*.java","core/java/**/*.aidl",],path: "core/java",
}
说明:android.bp文件中默认把core/java/目录下的aidl文件添加到编译文件中,所以这一步不需要操作.
由于Android 11对语法检测比较严格,所以针对我们新增的文件先加入忽略:
// TODO(b/145644363): move this to under StubLibraries.bp or ApiDocs.bp
metalava_framework_docs_args = "--manifest $(location core/res/AndroidManifest.xml) " +"--ignore-classes-on-classpath " +"--hide-package com.android.server " +"--error UnhiddenSystemApi " +"--hide RequiresPermission " +"--hide CallbackInterface " +"--hide MissingPermission --hide BroadcastBehavior " +"--hide HiddenSuperclass --hide DeprecationMismatch --hide UnavailableSymbol " +"--hide SdkConstant --hide HiddenTypeParameter --hide Todo --hide Typo " +"--force-convert-to-warning-nullability-annotations +*:-android.*:+android.icu.*:-dalvik.* " +"--api-lint-ignore-prefix android.icu. " +"--api-lint-ignore-prefix java. " +"--api-lint-ignore-prefix android.os. " + //新增这一行 "--api-lint-ignore-prefix android.app. " + //新增这一行 "--api-lint-ignore-prefix junit. " +"--api-lint-ignore-prefix org. "
3、Context.java添加服务注册名称, 添加该服务名称, 用于快捷注册和快捷引用
修改位置:frameworks/base/core/java/android/content/
//增加新增定义服务名称 /*** Use with {@link #getSystemService(String)} to retrieve a* {@link android.app.SystemVoiceManager} for accessing* text services.** @see #getSystemService(String)*/public static final String SYSTEMVOCIE_SERVICER = "systemvoice";/** @hide */@StringDef(suffix = { "_SERVICE" }, value = {POWER_SERVICE,SYSTEMVOCIE_SERVICER, //此处新增服务WINDOW_SERVICE,LAYOUT_INFLATER_SERVICE,......}
4、新建SystemVoiceService.java和SystemVoiceManager.java
存放位置:frameworks\base\services\core\java\com\android\server\SystemVoiceService.java
frameworks\base\core\java\android\app\SystemVoiceManager.java
package com.android.server;import android.app.SystemVoiceManager;
import android.content.Context;
import android.os.ISystemVoiceServer;
import android.os.RemoteException;
import com.android.server.SystemService;
import com.android.internal.app.IAppOpsService;public class SystemVoiceService extends SystemService {private final String TAG = "SystemVoiceService";private Context mContext;private IAppOpsService mAppOps;private SystemVoiceManager mManager;public SystemVoiceService(Context context) {super(context);this.mContext = context;}public void systemReady(IAppOpsService appOps) {mAppOps = appOps;if (mManager == null) {mManager = (SystemVoiceManager) mContext.getSystemService(Context.SYSTEMVOICE_SERVICE);}}@Overridepublic void onStart() {publishBinderService(Context.SYSTEMVOICE_SERVICE, new BinderService());}private final class BinderService extends ISystemVoiceServer.Stub {@Overridepublic void setHeightVoice(int flag) throws RemoteException {}@Overridepublic void setBassVoice(int flag) throws RemoteException {}@Overridepublic void setReverbVoice(int flag) throws RemoteException {}}
}
package android.app;import android.content.Context;
import android.os.ISystemVoiceServer;
import android.util.Log;
import android.annotation.SystemService;
import android.os.RemoteException;@SystemService(Context.SYSTEMVOICE_SERVICE)
public class SystemVoiceManager {private static final String TAG = "SystemVoiceManager";private ISystemVoiceServer mService;private Context context;public SystemVoiceManager(Context ctx, ISystemVoiceServer service) {mService = service;context = ctx;}public void setHeightVoice(int flag) {try {mService.setHeightVoice(flag);} catch (Exception e) {e.printStackTrace();}}public void setBassVoice(int flag) {try {mService.setBassVoice(flag);} catch (Exception e) {e.printStackTrace();}}public void setReverbVoice(int flag) {try {mService.setReverbVoice(flag);} catch (Exception e) {e.printStackTrace();}}}
5、SystemServer.java 中注册该service
修改位置: frameworks\base\services\java\com\android\server
import com.android.server.SystemVoiceService ;//导包private SystemVoiceService mSystemVoiceService; //定义//系统服务加入的位置加入以下内容t.traceBegin("StartSystemVoiceManager");mSystemVoiceService = mSystemServiceManager.startService(SystemVoiceService.class);t.traceEnd();//系统服务加入的位置加入以下内容t.traceBegin("MakeSystemVoiceManagerServiceReady");try {// TODO: use boot phasemSystemVoiceService.systemReady(mActivityManagerService.getAppOpsService());} catch (Throwable e) {reportWtf("making SystemVoice Manager Service ready", e);}t.traceEnd();
6、SystemServiceRegistry的static{}, 并在其中注册该service
修改位置:frameworks\base\core\java\android\app
import android.os.ISystemVoiceServer;//导包
//SystemVoiceManager在同一目录下所以不用导包
registerService(Context.SYSTEMVOICE_SERVICE, SystemVoiceManager.class,new CachedServiceFetcher<SystemVoiceManager>() {@Overridepublic SystemVoiceManager createService(ContextImpl ctx)throws ServiceNotFoundException {IBinder b = ServiceManager.getServiceOrThrow(Context.SYSTEMVOICE_SERVICE);return new SystemVoiceManager(ctx.getOuterContext(),ISystemVoiceService.Stub.asInterface(b));}});
以上步骤完成我们的自定义系统服务就完成了90% 但是我们还有最后一步,也是最重要的一步:
然后我们只需要添加这个自定义服务SystemVoiceService相关的 SELinux 规则。为了方便之后验证,打开selinux
要记住这个命令 adb shell setenforce 1 # 1为打开 #0为关闭
Android 11 的 selinux 规则是放在 system/sepolicy 目录下的:
service.te 和 service_contexts 都要加上SystemVoiceService的配置:
//在以下目录文件
./prebuilts/api/30.0/public/service.te # 需要
./public/service.te # 需要
//添加以下内容
type systemvoice_service, app_api_service, ephemeral_app_api_service, system_server_service, service_manager_type;
//在以下目录文件
./prebuilts/api/30.0/private/service_contexts # 需要
./private/service_contexts # 需要
//添加以下内容
systemvoice_service u:object_r:isystemvoice_service:s0
添加完配置后,Android11版本还要需要在以下目录修改以下忽略配置,才能正常编译
在以下目录
./prebuilts/api/30.0/private/compat/29.0/29.0.ignore.cil
./prebuilts/api/30.0/private/compat/28.0/28.0.ignore.cil
./prebuilts/api/30.0/private/compat/27.0/27.0.ignore.cil
./prebuilts/api/30.0/private/compat/26.0/26.0.ignore.cil
./private/compat/29.0/29.0.ignore.cil
./private/compat/28.0/28.0.ignore.cil
./private/compat/27.0/27.0.ignore.cil
./private/compat/26.0/26.0.ignore.cil

到此,android 11 系统服务已经添加完成!.
8、验证:
编译完成后,输入adb shell
#service list
查看服务列表中 是否存在有添加服务 :itest
如果不存在 逐步排查 参照上一步看哪一步错误
如果存在 就在代码中验证
找到编译最新生成的class.jar文件,导入Androidstudio(如何导入自行百度)
编译后的class.jar目录\out\target\common\obj\JAVA_LIBRARIES\framework_intermediates
如果未生成 执行下make javac-check-framework 这个命令 就会生成!!!
觉得我写的好的兄弟 动动你发财的小手 点个赞 !!!
你们的认同将是我继续写下去的动力 !!
相关文章:

Android 11新增系统服务
1.编写.aidl文件存放位置:frameworks/base/core/java/android/ospackage android.os;interface ISystemVoiceServer {void setHeightVoice(int flag);void setBassVoice(int flag);void setReverbVoice(int flag);}2.将.aidl文件添加到frameworks/base/Android.bp f…...
“你要多弄弄算法”
开始瞎掰 ▽ 2月的第一天,猎头Luna给我推荐了字节的机会,菜鸡我呀,还是有自知之明的,赶忙婉拒:能力有限,抱歉抱歉。 根据我为数不多的和猎头交流的经验,一般猎头都会稍微客套一下:…...

【数据结构】千字深入浅出讲解队列(附原码 | 超详解)
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石. 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:C语言实现数据结构 💬总结:希望你看完…...
vue面试题(day04)
vue面试题vue插槽?vue3中如何获取refs,dom对象的方式?vue3中生命周期的和vue2中的区别?说说vue中的diff算法?说说 Vue 中 CSS scoped 的原理?vue3中怎么设置全局变量?Vue中给对象添加新属性时&a…...

自动标注工具 Autolabelimg
原理简介~~ 对于数据量较大的数据集,先对其中一部分图片打标签,Autolabelimg利用已标注好的图片进行训练,并利用训练得到的权重对其余数据进行自动标注,然后保存为xml文件。 一、下载yolov5v6.1 https://github.com/ultralytic…...
2023-03-20干活
transformer复现 from torch.utils.data import Dataset,DataLoader import numpy as np import torch import torch.nn as nn import os import time import math from tqdm import tqdmdef get_data(path,numNone):all_text []all_label []with open(path,"r",e…...
Java 注解(详细学习笔记)
注解 注解英文为Annotation Annotation是JDK5引入的新的技术 Annotation的作用: 不是程序本身,可以对程序做出解释可以被其他程序(比如编译器)读取。 Annotation的格式: 注解是以注解名在代码中存在的,还…...

LeetCode:35. 搜索插入位置
🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀算法专栏: 👉🏻123 一、🌱35. 搜索插入位置 题目描述:给定一个排序数组和一个目标值&…...
菜鸟刷题Day2
菜鸟刷题Day2 一.判定是否为字符重排:字符重排 描述 给定两个由小写字母组成的字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。 解题思路: 这题思路与昨天最后两道类似&…...

Selenium基础篇之不打开浏览器运行
文章目录前言一、场景二、设计1.引入库2.引入浏览器配置3.设置无头模式4.启动浏览器实例,添加配置信息5.访问质量分地址6.隐式等待5秒7.定位到输入框8.输入博文地址9.定位到查询按钮10.点击查询按钮11.定位到查询结果模块div12.打印结果13.结束webdriver进程三、结果…...

【数据结构初阶】栈与队列笔试题
前言在我们学习了栈和队列之后,今天来通过几道练习题来巩固一下我们的知识。题目一 用栈实现队列题目链接:232. 用栈实现队列 - 力扣(Leetcode)这道题难度不是很大,重要的是我们对结构认识的考察,由于这篇文…...

【Linux入门篇】操作系统安装、网络配置
目录 🍁Linux详解 🍂1.操作系统 🍂2.操作系统组成 🍂3.操作系统历史 🍂4.常见的Linux系统 🍂5.centos7下载 🍂6.安装centos7 🍁linux初始化配置 🍃1.虚拟机系统安装后操作…...
Selenium:找不到对应的网页元素?常见的一些坑
目录 1. 用Xpath查找数据时无法直接获取节点属性 2. 使用了WebDriverWait以后仍然无法找到元素 2.1. 分辨率原因 2.2. 需要滚动页面 2.3. 由于其他元素的遮挡 1. 用Xpath查找数据时无法直接获取节点属性 通常在我们使用xpath时,可以使用class的方式直接获取节…...

flex布局优化(两端对齐,从左至右)
文章目录前言方式一 nth-child方式二 gap属性方式三 设置margin左右两边为负值总结前言 flex布局是前端常用的布局方式之一,但在使用过程中,我们总是感觉不太方便,因为日常开发中,大多数时候,我们想要的效果是这样的 …...

【Django 网页Web开发】03. 初识Django(保姆级图文)
目录1. 命令行创建与pycharm创建的区别2. 项目结构信息2.1 项目结构2.2 项目app结构2.3 快速查看项目结构树3. 创建并注册app3.1 创建app3.2 注册app4. 编写URL与视图的对应关系5. 编写视图文件6. 启动项目7. 写多个页面8. templates模板的使用8.1 编写html文件8.3 导入html文件…...

KubeSphere All in one安装配置手册
KubeSphere All in one安装配置手册 1. 初始化 1.1 配置apt源 # vi /etc/apt/sources.list deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiversedeb…...
Spring Boot 核心配置文件
Spring Boot 核心配置文件1、application.properties2、application.yml使用建议3、常用配置项服务器配置数据库配置日志配置其他配置4、配置文件的加载顺序5、配置文件的占位符6、配置文件的动态刷新7、配置文件的属性分组定义属性分组绑定属性分组使用属性分组总结Spring Boo…...

个人小站折腾后记
个人小站折腾后记 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某…...

WebService简单入门
1. JAX-WS发布WebService 创建web工程 创建simple包,和server、client两个子包。正常情况下server和client应该是两个项目,这里我们只是演示效果,所以简化写到一个项目中: 1.1 创建服务类Server package simple.server;import ja…...

「Vue面试题」vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
文章目录一、是什么二、如何做接口权限路由权限控制菜单权限方案一方案二按钮权限方案一方案二小结参考文章一、是什么 权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源 而前端权限归根结底是请求的发起权,…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...