Android 11 添加系统服务SystemService

2023-11-14

添加自定义的systemservice,到时候就可以直接getSystemService这样使用了。

1.添加AIDL

在frameworks/base/core/java/android/os 下新建一个aidl文件

package android.os;

/**
 * @hide
 */
interface IMyTestService {
    void startTest( String text);
    void stopTest();
}

2.新建service

路径:frameworks/base/services/core/java/com/android/server

package com.android.server;

import android.util.Log;
import android.os.IMyTestService;

public class MyTestService extends IMyTestService.Stub {
    public MyTestService() {}

    @Override
    public void startTest(String text){
        Log.i("Test","MyTestService  startTest: "+text);
    }

    @Override
    public void stopTest(){
        Log.i("Test","MyTestService  stopTest");
    }
}

3.添加service到系统

路径: frameworks/base/services/java/com/android/server/SystemServer.java

private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
        t.traceBegin("startOtherServices");

       //省略代码...

        try {
            final String SECONDARY_ZYGOTE_PRELOAD = "SecondaryZygotePreload";
            // We start the preload ~1s before the webview factory preparation, to
            // ensure that it completes before the 32 bit relro process is forked
            // from the zygote. In the event that it takes too long, the webview
            // RELRO process will block, but it will do so without holding any locks.
            mZygotePreload = SystemServerInitThreadPool.submit(() -> {
                try {
                    Slog.i(TAG, SECONDARY_ZYGOTE_PRELOAD);
                    TimingsTraceAndSlog traceLog = TimingsTraceAndSlog.newAsyncLog();
                    traceLog.traceBegin(SECONDARY_ZYGOTE_PRELOAD);
                    if (!Process.ZYGOTE_PROCESS.preloadDefault(Build.SUPPORTED_32_BIT_ABIS[0])) {
                        Slog.e(TAG, "Unable to preload default resources");
                    }
                    traceLog.traceEnd();
                } catch (Exception ex) {
                    Slog.e(TAG, "Exception preloading default resources", ex);
                }
            }, SECONDARY_ZYGOTE_PRELOAD);


            //添加
            ServiceManager.addService(Context.MY_TEST_SERVICE, new MyTestService());

4.新建manager

路径:frameworks/base/core/java/android/app  新建一个MyTestServiceManager

这边提供一些方法给别人用,当有地方调用了,它再去调用service中的方法。

package android.app;

import android.annotation.NonNull;
import android.content.Context;
import android.os.IMyTestService;
import android.os.RemoteException;


public class MyTestServiceManager {
    private IMyTestService mService;

    /**
     * @hide
     */
    public MyTestServiceManager(@NonNull Context mContext, @NonNull IMyTestService service) {
        mService = service;
    }

    /**
     * @hide
     */
    public void startTest(String text) {
        try {
            mService.startTest(text);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    /**
     * @hide
     */
    public void stopTest() {
        try {
            mService.stopTest();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

5.注册这个manager

    static {
        //CHECKSTYLE:OFF IndentationCheck
        registerService(Context.ACCESSIBILITY_SERVICE, AccessibilityManager.class,
                new CachedServiceFetcher<AccessibilityManager>() {
            @Override
            public AccessibilityManager createService(ContextImpl ctx) {
                return AccessibilityManager.getInstance(ctx);
            }});

        //省略代码......

        

        registerService(Context.MY_TEST_SERVICE, MyTestServiceManager.class,
                new CachedServiceFetcher<MyTestServiceManager>() {
                    @Override
                    public MyTestServiceManager createService(ContextImpl ctx) {
                        IBinder b = ServiceManager.getService(Context.MY_TEST_SERVICE);
                        IMyTestService service = IMyTestService.Stub.asInterface(b);
                        return new MyTestServiceManager(ctx, service);
                    }
                });

到这里systemservice就添加好了,下面直接build。如果出现

就按照2来做。

注意所有函数都有加@hide

最后编译完,刷完image就可以直接使用我们自己添加的SystemService了。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 11 添加系统服务SystemService 的相关文章

  • 如何在android中点击画布上绘制的圆圈?

    我正在开发一个人脸检测应用程序 在这个应用程序中 我必须在脸上的眼睛和嘴巴用户可以点击拖动圆圈 在检测到的人脸上根据自己设置位置 因此 所有圆圈都已成功绘制在脸上 但我无法单击特定圆圈并使用缩小选项在整个脸上移动 请建议我有关相同问题的正确
  • APK META-INF/library_release.kotlin_module 中复制的重复文件

    我最近通过 JitPack 添加了两个 Android 库 但出现以下错误 Duplicate files copied in APK META INF library release kotlin module 我已经清除了缓存 并尝试使
  • 如何使用 Android 版 Facebook 同步的联系人图片

    我的手机上安装了 Android 版 Facebook 它会自动将联系人列表中人员的 FB 个人资料图片同步到我的手机 我想在我访问的应用程序中使用这些图片ContactsContract PhoneLookup 我真的需要 Faceboo
  • ActionBarCompat 支持库 android:selectableItemBackground 不起作用

    我正在使用新的 ActionBarCompat 支持库 操作栏中的操作按钮在按下时应更改其背景 它适用于 Android 4 3 但不适用于 Gingerbread 在姜饼中 如果我按下按钮 它不会改变背景 我什至改变了选择器 它再次适用于
  • android - 过度绘制布局允许通过 LinearLayout 进行触摸

    在下面的 UI 中 我将下面的 drabable 覆盖了整个屏幕 LinearLayout 是透明的 并允许其下方的控件可单击或可触摸 基本上我可以滚动此 LinearLayout 下面的列表以及单击控件 我如何禁用它 See attach
  • Android Studio磁盘空间不足如何解决?

    我随机收到此错误 并且不确定为什么 Android Studio 的磁盘空间变低 Android Studio 系统目录分区磁盘空间不足 Update 此应用程序安装在运行 10 10 1 的 Mac 上 具有 251GB 内部存储和占用
  • Android 上通过 JSCH 的基本 SSH 连接

    作为来自此的用户question https stackoverflow com questions 14323661 simple ssh connect with jsch和这个tutorial http eridem net andr
  • 如何在 android-studio 0.3.6 中运行 Gradle 1.9?

    我只是花了一些时间尝试将现有的 android studio 项目从 gradle 1 8 迁移到 gradle 1 9 Final 昨天发布 但失败了19th Nov 我在这里阅读了大多数其他与 gradle 相关的帖子 但没有一个对我有
  • 从Asynctask返回结果

    如果我的 Android 应用程序中有这个后台工作文件 并且它从我的数据库获取数据 我如何将字符串 结果 传递给另一个类 后台工作人员连接到我的服务器 然后使用 php 连接到数据库 public class BackgroundWorke
  • 使用 POST 将数据从 Android 发送到 AppEngine Datastore

    抱歉 如果这是一个简单的问题 但我只是不知道我应该做什么 而且我认为我有点超出了我的深度 我想将数据从 Android 应用程序发送到在 Google App Engine 上运行的应用程序 数据必须从那里写入数据存储区 我的数据主要采用对
  • android studio 底部工具栏的“运行”选项卡消失了

    Android Studio 底部工具栏中曾经有一个 运行 选项卡 但该选项卡不再显示 怎么把它带回来 请检查下图以了解它消失之前的位置 Run 选项卡曾经位于 TODO 选项卡之前的红色圆圈中 查看 gt 工具窗口 gt 运行 Or us
  • NullPointerException org.chromium.android_webview.AwContents$AwViewMethodsImpl.onDragEvent

    大约 10 天前 我的应用程序开始记录此异常 在开发控制台上看到 java lang NullPointerException at org chromium android webview AwContents AwViewMethods
  • Android接收通知打开和取消事件

    我从 webService 接收数据以生成自定义通知 我想追踪Intent要知道open 点击 或cancel 滑动 通知上的事件 以报告服务器进行分析 有没有听众onIntentStart or onIntentCanceled 也许是通
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 在Android的activity中调用onResume

    在活动的过程中通过调用 this OnResume 强制 onResume 事件可以吗 或者我应该实现另一个由 OnResume 和第一个成员调用的过程 实现在您的重写中调用的另一个过程onResume 后者不打算由您调用 它是一种方便的方
  • MPAndroidChart:组合图表

    我在用MPAndroidChart 库 https github com PhilJay MPAndroidChart 我想用CombinedChart创建这样的图表 那可能吗 我尝试了一下 但似乎不起作用 因为 这些条目没有按我的预期工作
  • Android apk 调试模式工作正常,但发布模式给出太多警告

    我正在尝试从 eclipse 获取签名的 APK 我有一个可调试的 apk 版本 运行良好 现在发布时 当我尝试使用 Eclipse ADT 进行编译和签名时 我收到很多警告 其中大部分是can t find superclass or i
  • 在 Android SDK 中通过单击按钮更改背景颜色不起作用

    我有一个简单的程序 可以在单击按钮后更改背景颜色 但它不起作用 public class ChangeBackgroundActivity extends Activity Called when the activity is first
  • 在 TextView onTextChanged 上设置文本

    我有一个定义为类属性的文本视图 以便我可以在整个类中访问它 在 onCreate 方法中我执行以下操作 chars TextView findViewById R id chars chars setText 300 之后 public v
  • 将数据放入短信发送意图中?

    我想发送短信 如果文字太长 我会将其分成多条消息 我试图将一些额外的信息放入 已发送 意图中 以了解哪个部分已发送 以及所有部分何时完成 ArrayList

随机推荐

  • 微信小程序获取用户唯一标识openid

    相关知识 微信小程序 spring boot 一 步骤 1 获得的用户登录凭证code 有效期五分钟 2 发送参数code至后端 3 通过code获取openid 二 实现 1 获取code 接口 wx login 接口地址 https d
  • 工作中碰到的git问题

    这是平时工作中遇到的问题 百度结果很多 觉得有用的在此作个记录 一 git解决代码冲突 拉取时冲突 1 将本地的修改提交到本地库 2 执行命令 1 git pull origin master 将远程库代码拉取并合并到本地库 2 git p
  • 结构体字节对齐问题

    文章目录 一 结构体必知知识 二 结构体字节对齐有什么用 三 如何进行内存对齐 1 对齐规则 按结构体中最长类型字节为单位 2 结构体嵌套的情况 3 存在指定字节对齐单位的情况 pragma pack 总结 一 结构体必知知识 1 结构体内
  • Git 常用命令小结 -- 个人

    一 Git 放弃本地修改 强制pull代码 git fetch all git reset hard origin 分支 git pull 二 Git 基础命令 git status git diff 查看代码修改的状态和内容 git br
  • CAN初始化流程

    1 配置相关引脚的复用功能 使能CAN时钟 要用CAN 首先要使能CAN的时钟 CAN的时钟通过APB1ENR的第25位来设置 其次要设置CAN的相关引脚为复用输出 这里我们需要设置PA11位上拉输入 CAN RX引脚 PA12为复用输出
  • ubuntu14 java8_ubuntu14.04 安装Java8 (JDK8)

    目前腾讯云服务器 Ubuntu 14 04 系统用 sudo apt get install default jdk 安装的JDK还是 java 7的 会导致一些对于需要Java 8 支持的一些应用无法编译或者运行 所以 目前还需要自己手动
  • 浅谈后台管理系统

    一 后台是什么 二 模块管理 三 角色管理 四 账号管理 五 密码管理 六 更多讨论 一 后台是什么 后台不是某个独立系统 是多个模块的组合 并且之间还有信息交互 所以后台的设计对于PM要求一般较高 后台是用来数据维护的 后台需要一个管理模
  • 学了那么多年设计模式依然不会用!那可真蠢!

    什么是设计模式 设计模式 Design Pattern 代表了最佳的实践 通常被有经验的面向对象的软件开发人员所采用 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案 这些解决方案是众多软件开发人员经过相当长的一段时间的试验和
  • 调试最长的一帧(第21天)

    看看全流程 主要讲sceneview cull 跟过去 重点在cullstage 状态树与渲染树的构建都是在pushStateSet和popStateSet函数中完成的 而CullVisitor apply函数 在遍历节点时调用 则负责根据
  • vnc远程管理kvm,在办公室连接kvm服务器

    文章目录 vnc远程管理kvm vnc远程管理kvm vnc概念图 首先试试服务器装了VNC没 rpm q tigervnc tigervnc server 没安装的话会直接出现 package tigervnc is not instal
  • getopt()与getopt_long()的使用简介

    感性认识 getopt 与getopt long 是专门处理命令行参数的两个函数 getopt 处理短参数 getopt long 处理长参数 还不明白请看下面这张图 解析 t yiqi 就是这两个函数做的事 下面我们一起来看看究竟如何使用
  • 查看电脑连接的wifi密码

    一 常规方法查看电脑连接的wifi密码 1 使用电脑连接需要查看的WiFi 鼠标右击电脑桌面右下角 WiFi图标 在弹出的菜单中点击 打开 网络和internet 设置 2 在弹出的设置窗口中点击 网络和共享中心 如下图所示 3 在弹出的网
  • MSP430F149小系统开发板实现RS232串口通信

    程序功能 MCU不停向PC机发送数据 在屏幕上显示0 127对应 的ASCII字符 通信格式 N 8 1 2400 测试说明 打开串口调试精灵 正确设置通信格式 观察屏幕 调试说明 该程序通过USB口 在sscom32上可以观察到现象 用的
  • 2022年十月份电赛OpenMV巡线方案详细代码分析(1)

    前言 1 马上要进行电赛了 机器识别是铁定会使用到的 为了防止出现去年十月份那种特殊的巡线方案 我在此分享出OpenMV巡线方案 并且进行讲解和分析如何更改 2 学习本文之前 需要学习 OpenMV串口通讯详解 OpenMV图像处理之后给单
  • Java的多重循环

    多重循环 1 打印图案 经过打印分析 外层循环控制行数 内层循环控制列数 打印三角形 第一行元素的个数决定了计数器的初始值 如果元素是越来越多 那么计数器变化为 当计数器为 我们必须设置一个上限 也就是判断条件必须小于或者小于等于某个值 如
  • 5款优秀的开源 CSS3 动画库,助你轻松地实现各种动画效果,让网页不再单调

    CSS 动画主要通过Transition 过渡 和Animation 关键帧动画 实现 是一种非常实用和流行的网页设计技术 可以帮助用户实现丰富多彩的动画效果 提升用户体验和页面互动性 CSS 动画具有简单 轻量 易用等特点 可以在不依赖
  • 【网络原理】UDP和TCP协议重点知识汇总

    目录 1 UDP协议 2 TCP协议 1 UDP协议 UDP协议的特点 无连接 不可靠传输 面向数据报和全双工 UDP报文最大长度是2个字节 2个字节表示的范围就是0 65535 也就是64kb 所以如果需要使用UDP传输一个比较大的数据
  • html+css实现3D相册

  • VSCode执行Python程序出错:vscode conda activate激活失败

    VSCode执行Python程序出错 vscode conda activate激活失败 1 vscode conda activate激活失败 C Users 17316 gt conda activate CommandNotFound
  • Android 11 添加系统服务SystemService

    添加自定义的systemservice 到时候就可以直接getSystemService这样使用了 1 添加AIDL 在frameworks base core java android os 下新建一个aidl文件 package and