本文基于android 6.0,添加了一个自定义的系统服务,并且可以获取使用该服务。
目标:
1,创建一个系统服务, MyService
2,在android系统中使用getSystemService方法获取该服务并调用里面的方法。
在frameworks/base/core/java/android/os/
文件下面新增 一个 IMyService.aidl 文件,内容如下,
package android.os; interface IMyService { void setName(String mname); String getName(); }包含2个简单的方法。
将此aidl文件加入编译列表frameworks/base/Android.mk:
LOCAL_SRC_FILES += \ ••• core/java/android/os/IMyService.aidl \在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; } }在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; } }首先给服务命名,在在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); }});在/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一定要对上号。
这一步骤如果未添加,获取服务时会有空指针错误。
首先需要make update-api,然后编译。