android 添加系统服务
Posted Achillisjack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 添加系统服务相关的知识,希望对你有一定的参考价值。
本文基于android 6.0,添加了一个自定义的系统服务,并且可以获取使用该服务。
目标:
1,创建一个系统服务, MyService
2,在android系统中使用getSystemService方法获取该服务并调用里面的方法。
1,创建aidl文件
在frameworks/base/core/java/android/os/
文件下面新增 一个 IMyService.aidl 文件,内容如下,
package android.os;
interface IMyService
void setName(String mname);
String getName();
包含2个简单的方法。
2,aidl文件编译
将此aidl文件加入编译列表frameworks/base/Android.mk:
LOCAL_SRC_FILES += \\
•••
core/java/android/os/IMyService.aidl \\
3,创建Service文件
在frameworks/base/services/core/java/com/android/server/ 路径下新增一个 MyService.java 来实现aidl文件定义的接口。
内容如下,
package com.android.server;
import android.os.IMyService;
class MyService extends IMyService.Stub
private String myName ;
public MyService()
@Override
public void setName(String mname)
myName = mname;
@Override
public String getName()
return myName;
4,添加管理类MyServiceManager
在frameworks/base/core/java/android/app/ 下创建MyServiceManager.java,
内容如下,
package android.app;
import android.os.IMyService;
import android.content.Context;
import android.os.RemoteException;
import android.util.Log;
public class MyServiceManager
IMyService mmyService;
public MyServiceManager(Context mContext, IMyService service)
mmyService = service;
public void setName(String mname)
try
mmyService.setName(mname);
catch(Exception e)
Log.e("MyService",e.toString());
public String getName()
try
return mmyService.getName();
catch(Exception e)
Log.e("MyService",e.toString());
return null;
5,服务注册
首先给服务命名,在在frameworks/base/core/java/android/content/Context.java 中添加
public static final String MY_SERVICE="my_service";
然后在frameworks/base/services/java/com/android/server/SystemServer.java的startOtherServices方法的try模块中添加
ServiceManager.addService(Context.MY_SERVICE, new MyService());
最后在frameworks/base/core/java/android/app/SystemServiceRegistry.java中的静态代码块中添加
registerService(Context.MY_SERVICE, MyServiceManager.class,
new CachedServiceFetcher<MyServiceManager>()
@Override
public MyServiceManager createService(ContextImpl ctx)
IBinder b = ServiceManager.getService(Context.MY_SERVICE);
IMyService service = IMyService.Stub.asInterface(b);
return new MyServiceManager(ctx, service);
);
6,启动服务
在/external/sepolicy/service.te中添加
type my_system_service, system_api_service, system_server_service, service_manager_type;
在/external/sepolicy/service_contexts 中添加
my_service u:object_r: my_system_service:s0
注意:服务的命名my_service一定要对上号。
这一步骤如果未添加,获取服务时会有空指针错误。
7,编译
首先需要make update-api,然后编译。
8,获取使用服务
mMyServiceManager = (MyServiceManager)getSystemService(Context.MY_SERVICE);
mMyServiceManager.setName("my_stystem_service");
Log.d(TAG , mMyServiceManager.getName()); //输出 my_stystem_service 就大功告成了。
以上是关于android 添加系统服务的主要内容,如果未能解决你的问题,请参考以下文章