android 添加系统服务

xiaoxiao2021-02-28  129

本文基于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 就大功告成了。
转载请注明原文地址: https://www.6miu.com/read-65350.html

最新回复(0)