[Android][Framework] 添加系统服务
新博客地址
http://wossoneri.github.io/2018/09/15/[Android][Framework]create-system-service/
做系统开发,有时候需要自己定义一些接口供App使用, 同时为了方便维护管理,就会需要自己建立一个服务,把新的功能集中在一起。下面就是新建一个系统服务的基本步骤。
添加接口
frameworks/base/core/java/android/app/IDemoManager.aidl
package android.app; interface IDemoManager
{
int getCpuTemperature();
}
添加服务,实现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
}
}
添加对应的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;
}
}
添加aidl到Makefile src
frameworks/base/Android.mk
LOCAL_SRC_FILES += \
core/java/android/app/IDemoManager.aidl \
添加DEMO_SERVICE常量
frameworks/base/core/java/android/content/Context.java
public static final String DEMO_SERVICE = "demo";
注册系统服务
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));
}});
开机启动服务
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);
}
编译源码,因为添加了接口,所以需要
make update-api
更新接口。然后再整编刷机。
service list 查看服务,不存在,这是因为selinux权限没加。
添加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
重新编译代码,使用下面测试代码验证
import android.app.DemoManager; DemoManager om = (DemoManager) getSystemService(Context.DEMO_SERVICE);
Log.d(TAG, "Current temperature is " + om.getCpuTemperature());
最终log打印出100,服务添加完成。
[Android][Framework] 添加系统服务的更多相关文章
- 如何在Android中添加系统服务
一,在frameworks/base/core/java/android/content/Context.java中添加 public static final String RADIO_SERVIC ...
- Android 添加系统服务
原创文章,转载请注明出处:http://blog.csdn.net/t5721654/article/details/7480696 Android系统本身提供了很多系统服务,如WindowManag ...
- 【转】Android 添加系统服务
Android系统本身提供了很多系统服务,如WindowManagerService,PowerManagerService等.下面描述一下添加一个系统服务的具体步骤. 1. 撰写一个aidl文件, ...
- 在Android 源码中添加系统服务
Android系统本身提供了很多系统服务,如WindowManagerService,PowerManagerService等.下面描述一下添加一个系统服务的具体步骤. 1.定义自定义系统服务接口 撰 ...
- 添加 Android Framework 到 Adt
Android Framework jar 包: class4.0.3 1.项目属性中的-Java Build Path,选择 Libraries,点击 “Add Library...”,添加 2.选 ...
- [Android FrameWork 6.0源码学习] View的重绘过程之WindowManager的addView方法
博客首页:http://www.cnblogs.com/kezhuang/p/关于Activity的contentView的构建过程,我在我的博客中已经分析过了,不了解的可以去看一下<[Andr ...
- Android按键添加和处理的方案
Android按键添加和处理的方案 版本号 说明 作者 日期 1.0 Android按键添加和处理的方案 Sky Wang 2013/06/18 需求:Android机器上有个W ...
- Android按键添加和处理的方案【转】
本文转载自:http://www.cnblogs.com/skywang12345/p/3142851.html Android按键添加和处理的方案 版本号 说明 作者 日期 1.0 Andro ...
- 解析android framework下利用app_process来调用java写的命令及示例
解析android framework下利用app_process来调用java写的命令及示例 在android SDK的framework/base/cmds目录下了,有不少目录,这些目的最终都是b ...
随机推荐
- yarn组件通信协议简介
ResourceManager与NodeManager通过ResourceTracker协议通信. NodeManager通过NodeStatusUpdaterImpl中的ResourceTracke ...
- socket 实现单一串口共享读写操作
前提:物理串口连接到PC上,通过串口号被PC唯一识别. 此时,物理串口通过该串口号仅能被单一线程或进程实例并占用,其他线程或进程不能再通过该串口号与物理串口通信.这个暂称为串口独占性. 解决思路:核心 ...
- python 安装numpy遇到无法卸载的解决办法
python 安装模块numpy遇到无法卸载的情况的解决办法 python在安装seaborn的时候,需要更新numpy模块,但是更新失败,输出下面的错误: Cannot uninstall 'num ...
- springBoot(5)---单元测试,全局异常
单元测试,全局异常 一.单元测试 1.基础版 1.引入相关依赖 <!--springboot程序测试依赖,如果是自动创建项目默认添加--> <dependency> <g ...
- 通过Microsoft Learn进行学习以提升技能
通过 Microsoft Learn,可以免费而且轻松有趣地学习 Microsoft 技术. Microsoft Learn的与众不同 借助 Microsoft Learn,任何人都能按自己的学习计划 ...
- 11张PPT介绍Paxos协议
之前翻译了<The Part-Time Parliament>一文,论文非常经常,强烈推荐读一读原文.翻译完论文后,希望自己能用简单的描述来整理自己的理解,所以花了一些时间通过PPT的形式 ...
- 从面试连跪到收割offer,回顾我的春招面试历程(研发岗位)
本文首发于自微信公众号[程序员江湖] 作者How 2 Play Life,985 软件硕士,阿里 Java 研发工程师,在技术校园招聘.自学编程.计算机考研等方面有丰富经验和独到见解,目前致力于分享程 ...
- 解决AssetBundle包加载预制体时,Shader显示异常的问题
现象: 预制体上的粒子效果显示为紫色方块. 原因:shader在打成AB包后与指定平台产生相关性,Editor中无法正常读取. 解决办法: 遍历所有加载的对象,重新赋值Shader 代码: //修正s ...
- solr(五): centos中, 整合 tomcat&solr
前言 虽然windows下, tomcat和solr整合起来灰常的方便, 但是, 一般像这种东西, 都很少部署在windows中, 更多的是部署到linux中去. 其实, 步骤是一样的, 这里, 我在 ...
- 【Vue.js】vue引入组件报错:该组件未注册?
[Vue warn]: Unknown custom element: <QuestionnaireOption> - did you register the component cor ...