前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Android][Framework] 添加系统服务

[Android][Framework] 添加系统服务

原创
作者头像
wOw
修改2018-09-15 18:45:31
1.4K0
修改2018-09-15 18:45:31
举报
文章被收录于专栏:wOw的Android小站wOw的Android小站

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

  1. 添加接口

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

代码语言:txt
复制

package android.app;

interface IDemoManager

{

代码语言:txt
复制
   int getCpuTemperature();

}

代码语言:txt
复制
  1. 添加服务,实现aidl文件定义的接口

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

代码语言:txt
复制

package com.android.server;

import android.app.IDemoManager;

import android.content.Context;

import android.util.Slog;

public class DemoManagerService extends IDemoManager.Stub {

代码语言:txt
复制
   private Context mContext;
代码语言:txt
复制
   public DemoManagerService(Context context) {
代码语言:txt
复制
       mContext = context;
代码语言:txt
复制
       Slog.d("Demo", "Construct");
代码语言:txt
复制
   }
代码语言:txt
复制
   @Override
代码语言:txt
复制
   public int getCpuTemperature() {
代码语言:txt
复制
       return 100; // Test code
代码语言:txt
复制
   }

}

代码语言:txt
复制
  1. 添加对应的Manager

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

代码语言:txt
复制

package android.app;

import android.content.Context;

import android.os.RemoteException;

import android.util.Slog;

public class DemoManager {

代码语言:txt
复制
   Context mContext;
代码语言:txt
复制
   IDemoManager mService;
代码语言:txt
复制
   public DemoManager(Context context, IDemoManager service) {
代码语言:txt
复制
       mContext = context;
代码语言:txt
复制
       mService = service;
代码语言:txt
复制
   }
代码语言:txt
复制
   public int getCpuTemperature() {
代码语言:txt
复制
       if (mService != null) {
代码语言:txt
复制
           try {
代码语言:txt
复制
               return mService.getCpuTemperature();
代码语言:txt
复制
           } catch (RemoteException e) {
代码语言:txt
复制
               Slog.e("Demo", "RemoteException " + e);
代码语言:txt
复制
           }
代码语言:txt
复制
       }
代码语言:txt
复制
       return -1;
代码语言:txt
复制
   }

}

代码语言:txt
复制
  1. 添加aidl到Makefile src

frameworks/base/Android.mk

代码语言:txt
复制

LOCAL_SRC_FILES += \

代码语言:txt
复制
   core/java/android/app/IDemoManager.aidl \
代码语言:txt
复制
  1. 添加DEMO_SERVICE常量

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

代码语言:txt
复制

public static final String DEMO_SERVICE = "demo";

代码语言:txt
复制
  1. 注册系统服务

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

代码语言:txt
复制

registerService(Context.ORISLINK_SERVICE, DemoManager.class,

代码语言:txt
复制
   new CachedServiceFetcher<DemoManager>() {
代码语言:txt
复制
       @Override
代码语言:txt
复制
       public DemoManager createService(ContextImpl ctx) {
代码语言:txt
复制
           IBinder b = ServiceManager.getService(Context.DEMO_SERVICE);
代码语言:txt
复制
           return new DemoManager(ctx, IDemoManager.Stub.asInterface(b));

}});

代码语言:txt
复制
  1. 开机启动服务

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

代码语言:txt
复制

try {

代码语言:txt
复制
   ServiceManager.addService(Context.DEMO_SERVICE, new DemoManagerService(context));

} catch (Throwable e) {

代码语言:txt
复制
   Slog.e("Demo", "Failed to start Demo Service " + e);

}

代码语言:txt
复制
  1. 编译源码,因为添加了接口,所以需要
代码语言:txt
复制

make update-api

代码语言:txt
复制

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

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

device/qcom/sepolicy/msm8937/service.te

代码语言:txt
复制

type demo_service, system_api_service, system_server_service, service_manager_type;

代码语言:txt
复制

device/qcom/sepolicy/msm8937/service_contexts

代码语言:txt
复制

demo u:object_r:demo_service:s0

代码语言:txt
复制
  1. 重新编译代码,使用下面测试代码验证
代码语言:txt
复制
```java
代码语言:txt
复制
import android.app.DemoManager;
代码语言:txt
复制
DemoManager om = (DemoManager) getSystemService(Context.DEMO_SERVICE);
代码语言:txt
复制
Log.d(TAG, "Current temperature is " + om.getCpuTemperature());
代码语言:txt
复制
```
代码语言:txt
复制
最终log打印出100,服务添加完成。

个人博客

http://wossoneri.github.io/2018/09/15/Androidcreate-system-service/

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档