新博客地址

http://wossoneri.github.io/2018/09/15/[Android][Framework]create-system-service/

做系统开发,有时候需要自己定义一些接口供App使用, 同时为了方便维护管理,就会需要自己建立一个服务,把新的功能集中在一起。下面就是新建一个系统服务的基本步骤。

  1. 添加接口

    frameworks/base/core/java/android/app/IDemoManager.aidl

    package android.app;
    
    interface IDemoManager
    {
    int getCpuTemperature();
    }
  2. 添加服务,实现aidl文件定义的接口

    frameworks/base/services/core/java/com/android/server/DemoManagerService.java

    package com.android.server;
    
    import android.app.IDemoManager;
    import android.content.Context;
    import android.util.Slog; public class DemoManagerService extends IDemoManager.Stub {
    private Context mContext; public DemoManagerService(Context context) {
    mContext = context;
    Slog.d("Demo", "Construct");
    } @Override
    public int getCpuTemperature() {
    return 100; // Test code
    }
    }
  3. 添加对应的Manager

    frameworks/base/core/java/android/app/DemoManager.java

    package android.app;
    
    import android.content.Context;
    import android.os.RemoteException;
    import android.util.Slog; public class DemoManager {
    Context mContext;
    IDemoManager mService; public DemoManager(Context context, IDemoManager service) {
    mContext = context;
    mService = service;
    } public int getCpuTemperature() {
    if (mService != null) {
    try {
    return mService.getCpuTemperature();
    } catch (RemoteException e) {
    Slog.e("Demo", "RemoteException " + e);
    }
    }
    return -1;
    }
    }
  4. 添加aidl到Makefile src

    frameworks/base/Android.mk

    LOCAL_SRC_FILES += \
    core/java/android/app/IDemoManager.aidl \
  5. 添加DEMO_SERVICE常量

    frameworks/base/core/java/android/content/Context.java

    public static final String DEMO_SERVICE = "demo";
  6. 注册系统服务

    frameworks/base/core/java/android/app/SystemServiceRegistry.java

    registerService(Context.ORISLINK_SERVICE, DemoManager.class,
    new CachedServiceFetcher<DemoManager>() {
    @Override
    public DemoManager createService(ContextImpl ctx) {
    IBinder b = ServiceManager.getService(Context.DEMO_SERVICE);
    return new DemoManager(ctx, IDemoManager.Stub.asInterface(b));
    }});
  7. 开机启动服务

    frameworks/base/services/java/com/android/server/SystemServer.java

    try {
    ServiceManager.addService(Context.DEMO_SERVICE, new DemoManagerService(context));
    } catch (Throwable e) {
    Slog.e("Demo", "Failed to start Demo Service " + e);
    }
  8. 编译源码,因为添加了接口,所以需要

    make update-api

    更新接口。然后再整编刷机。

  9. service list 查看服务,不存在,这是因为selinux权限没加。

  10. 添加sepolicy权限

device/qcom/sepolicy/msm8937/service.te

type demo_service, system_api_service, system_server_service, service_manager_type;

device/qcom/sepolicy/msm8937/service_contexts

demo  u:object_r:demo_service:s0
  1. 重新编译代码,使用下面测试代码验证

    import android.app.DemoManager;
    
    DemoManager om = (DemoManager) getSystemService(Context.DEMO_SERVICE);
    Log.d(TAG, "Current temperature is " + om.getCpuTemperature());

    最终log打印出100,服务添加完成。

[Android][Framework] 添加系统服务的更多相关文章

  1. 如何在Android中添加系统服务

    一,在frameworks/base/core/java/android/content/Context.java中添加 public static final String RADIO_SERVIC ...

  2. Android 添加系统服务

    原创文章,转载请注明出处:http://blog.csdn.net/t5721654/article/details/7480696 Android系统本身提供了很多系统服务,如WindowManag ...

  3. 【转】Android 添加系统服务

    Android系统本身提供了很多系统服务,如WindowManagerService,PowerManagerService等.下面描述一下添加一个系统服务的具体步骤. 1.  撰写一个aidl文件, ...

  4. 在Android 源码中添加系统服务

    Android系统本身提供了很多系统服务,如WindowManagerService,PowerManagerService等.下面描述一下添加一个系统服务的具体步骤. 1.定义自定义系统服务接口 撰 ...

  5. 添加 Android Framework 到 Adt

    Android Framework jar 包: class4.0.3 1.项目属性中的-Java Build Path,选择 Libraries,点击 “Add Library...”,添加 2.选 ...

  6. [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法

    博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...

  7. Android按键添加和处理的方案

    Android按键添加和处理的方案  版本号 说明 作者 日期  1.0  Android按键添加和处理的方案 Sky Wang  2013/06/18        需求:Android机器上有个W ...

  8. Android按键添加和处理的方案【转】

    本文转载自:http://www.cnblogs.com/skywang12345/p/3142851.html Android按键添加和处理的方案  版本号 说明 作者 日期  1.0  Andro ...

  9. 解析android framework下利用app_process来调用java写的命令及示例

    解析android framework下利用app_process来调用java写的命令及示例 在android SDK的framework/base/cmds目录下了,有不少目录,这些目的最终都是b ...

随机推荐

  1. 将本地代码上传到github走过的坑

    1.因为github是服务端,需要自己在自己的电脑上安装一个客户端git 2.配置SSH(配置一次就好了) github是不能随便上传代码上去的,而是通过一种网络协议---SSH授权的.SSH是一种网 ...

  2. sql server 备份与恢复系列五 完整模式下的备份与还原

    一.概述 前面介绍了简单恢复模式和大容量恢复模式,这篇继续写完整恢复模式下的备份与还原.在完整恢复模式里最大的优点是只要能成功备份尾日志,就可以还原到日志备份内包含的任何时点("时点恢复&q ...

  3. [java核心篇02]__内部类

    前言 其实我们在前面已经初步接触到内部类了,但是我们去对它的作用并不胜了解.只是简单的知道了类的定义也是可以嵌套的,定义在一个类里面的类就是内部类. class out{ private String ...

  4. Docker容器互访三种方式

    我们都知道docker容器之间是互相隔离的,不能互相访问,但如果有些依赖关系的服务要怎么办呢.下面介绍三种方法解决容器互访问题. 方式一.虚拟ip访问 安装docker时,docker会默认创建一个内 ...

  5. More Effective C# 【前戏】

    买了很多很多书,想到就买,觉得有需要就买.买书的情况是不一样的:有时候,买的时候还是比较空,买来之后工作开始忙起来了,就没怎么看:有时候,买的时候比较忙,忙的乱了方寸,觉得有必要找本书来静心一下.不过 ...

  6. vue开发中,build时css打包报错

    vue在打包的时候css报错,首先声明的这个并没有解决webpack本身的问题,本来这个也是一个警示,不会影响代码正常运行 这个是因为我在多个页面引入了同一个css文件,webpack打包时候对css ...

  7. MySQL集群结构说明

    在以前,数据库的集群配置一直很难,难点在于MySQL主从结构的高可用和读写分离.万幸的是,Galera/GR的出现,让整个集群的配置都极大程度地简化了. 以下是一个简单的MySQL集群拓扑图: 1.M ...

  8. Docker端口映射及创建镜像演示(二)--技术流ken

    前言 在上一篇博客<Docker介绍及常用操作演示--技术流ken>中,已经详细介绍了docker相关内容以及有关镜像和容器的使用命令演示. 现在我们已经可以自己下载镜像,以及创建容器了. ...

  9. [转]Angular: Hide Navbar Menu from Login page

    本文转自:https://loiane.com/2017/08/angular-hide-navbar-login-page/ In this article we will learn two ap ...

  10. 【转载】C#防SQL注入过滤危险字符信息

    不过是java开发还是C#开发或者PHP的开发中,都需要关注SQL注入攻击的安全性问题,为了保证客户端提交过来的数据不会产生SQL注入的风险,我们需要对接收的数据进行危险字符过滤来防范SQL注入攻击的 ...