新博客地址
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 ...
随机推荐
-
java异常
java之异常 认识java中的异常: 有过编程经历的人都会知道,出错在编写程序时,是再正常不过的事,当运行程序时,每次看到那个程序出错时,都会觉得心塞,但是最让人心塞的事情往往是——程序运行的结果和 ...
-
N个节点的二叉树有多少种形态
来源:http://www.cnblogs.com/ShaneZhang/p/4102581.html 这是一道阿里的面试题.其实算不上新鲜,但是我之前没关注过,如今碰到了,就顺便探讨下这个问题吧:) ...
-
关于tcpdump抓包一个很详细的介绍
http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html
-
MongoDB Map Reduce
介绍 Map-Reduce是一种计算模型,简单的说就是将大批量的工作分解(MAP)执行,然后再将结果合并成最终结果(REDUCE). MongoDB提供的Map-Reduce非常灵活,对于大规模数据分 ...
-
openwrt无线中继教程
1.设置自己路由lan口的IP地址,网段不能跟上级路由的一样. 2.在无线标签下点击"扫描网络". 3.在新出现的界面中,会列出你附近的无线网络.点击你需要中继的网络右边的&quo ...
-
css3实现手机菜单展开收起动画
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
-
关于ssh登录出现异常警告:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
提示警告信息如下: arnold@WSN:~$ ssh 10.18.46.111 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
-
django的models模型类的常用数据类型和选项
django框架的models模块ORM框架,能够让我们通过编写类的方式,帮助我们自动生成数据库表. 生成的数据库表名为 应用模块名称_类名 数据库表中字段名 如果我们没有在参数中指定,就是我们写的类 ...
-
【转】python之random模块分析(一)
[转]python之random模块分析(一) random是python产生伪随机数的模块,随机种子默认为系统时钟.下面分析模块中的方法: 1.random.randint(start,stop): ...
-
scikit-learn数据集下载太慢的问题
有时候用scikit-learn在线下载数据时太慢,因为网络或者其他原因,这时候我们可以先把数据集下载到本地,然后再把这个数据集放到scikit-learn的data中,首先我们需要找到 scikit ...