前言

简单记录一下在Framework中新增一个服务接口,方便应用调用,类似于获取AudioManager一样。

AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

Android P

正文

面我们一步一步进行创建,我这里以创建一个XMediaManager为例。

Context新增服务名

参考系统服务的定义,

在Context.java中定义一个唯一的服务名。

\frameworks\base\core\java\android\content\Context.java

添加如下内容,具体位置随意。

这里放在AUDIO_SERVICE定义的附近。

public static final String X_MEDIA_SERVICE = "x_media";

创建IMedia.aidl

在创建AIDL文件前,需要创建存放的目录。

参考Android创建接口的规则,我们在创建自己的目录(新增\biumall\media)

\frameworks\base\core\java\android\biumall\media

这样包名就是

android.biumall.media

在目录中创建IMedia.aidl

//IXMedia.aidl
package android.biumall.media;

interface IXMedia{
    void setPath(String path);
    String getPath();
}

暂时功能简单点。创建了,就需要添加编译。

添加编译

\frameworks\base\

目录下,找到Android.bp

Android P开始都放bp了,之前的版本放mk

java_library {
    name: "framework",
    srcs: [
        //略
        //末尾添加我们新增的IXMedia.aidl
        "core/java/android/biumall/media/IXMedia.aidl",
    ],
    
    //略
}

创建XMediaService

为了方便管理和查询,放在同一个目录中

//XMediaService.java
package android.biumall.media;
import android.os.RemoteException;

public class XMediaService extends IXMedia.Stub {
    private String mPath = "XMediaService";

    @Override
    public void setPath(String path) throws RemoteException {
        mPath = path;
    }

    @Override
    public String getPath() throws RemoteException {
        return mPath;
    }
}

创建XMediaManager

//XMediaManager.java
package android.biumall.media;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.content.Context;

public class XMediaManager {
    private IXMedia iXMedia;

    public XMediaManager() {
        iXMedia = IXMedia.Stub.asInterface(ServiceManager.getService(Context.X_MEDIA_SERVICE));
    }

    public void setPath(String path) {
        try {
            iXMedia.setPath(path);
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    public String getPath() {
        try {
            return iXMedia.getPath();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
        return "";
    }
}

注册服务

\frameworks\base\core\java\android\app\SystemServiceRegistry.java

注册XMediaManager。应用中可以通过getSystemService()获取XMediaManager对象。

//导入包名
import android.biumall.media.XMediaManager;

//参考AUDIO_SERVICE,放在这附近即可
registerService(Context.X_MEDIA_SERVICE, XMediaManager.class,
        new CachedServiceFetcher<XMediaManager>() {
    @Override
    public XMediaManager createService(ContextImpl ctx) throws ServiceNotFoundException {
        return new XMediaManager();
    }});

启动服务

服务的启动在SystemServer.java中,

\frameworks\base\services\java\com\android\server\SystemServer.java

这里启动服务分三步:

  1. 引导服务

  2. 核心服务

  3. 其他服务

自己新增的服务放[其他服务]中,具体位置如下。

//导入包名
import android.biumall.media.XMediaService;

//找到startOtherServices在systemReady()语块的最末尾添加即可
private void startOtherServices() {
 	//略
 	try{
        ServiceManager.addService(Context.X_MEDIA_SERVICE,  new XMediaService());
    }catch(Throwable e){
        Slog.e(TAG, "Failure starting XMediaService", e);
    }
}

SEPolicy权限修改

由于我当前平台不改下面的配置,也是可以正常访问。这部分暂时没有严重。

我们在Context.java中添加

public static final String X_MEDIA_SERVICE = "x_media";

下面两个文件修改需要用到。

service.te
device\mediatek\mt2712\sepolicy\plat_public

新增内容如下

type x_media_service,system_api_service, system_server_service, service_manager_type;

这里只需要添加替换成为自己的X_MEDIA_SERVICE即可。

服务名 :x_media_service类型 :system_api_service, system_server_service, service_manager_type

service_contexts
\device\mediatek\mt2712\sepolicy\plat_private

新增内容如下

x_media    u:object_r:x_media_service:s0

x_media_service服务设置类型为: u:object_r:demo_service:s0

x_media是对应Context.java新增的服务名值

x_media_service为在 service.te 定义的类型, 必须一一对应,否则无效!!!!

update-api

上新增了,接口和变量值,还需要update-api

//源码目录
source ./build/envsetup.sh
lunch
make update-api

更新完之后,可单独编译更新部分或完整编译。

参考文章

  1. Android 系统开发提供Api供三方应用(二、实现系统添加接口)

  2. Android Framework 添加新的 系统服务

 历史上的今天

  1. 全球行
  2. 知百科
  3. 在线工具网
  4. 拼域名
  5. 万动力
  6. 特网科技
  7. 聚巧网
  8. 思酷SIKU
  9. 金锐网346.com

相关文章

暂无评论

none
暂无评论...