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 添加系统服务的主要内容,如果未能解决你的问题,请参考以下文章

[Android][Framework] 添加系统服务

Android源码添加自定义系统服务

Android : 为系统服务添加 SELinux 权限 (Android 9.0)

添加一个Android框架层的系统服务与实现服务的回调

基于安卓Android手机微博系统客户端app

Android Framework 之 使用系统编译的文件 添加到 SDK 的源码