framework中添加自己的aidl

Android 91es.com站长2024年3月27日 am8:58发布3个月前更新
0
导航号,我的单页导航
目录

前言

简单记录一下在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、 本站名称 91易搜
2、 本站网址 https://www.91es.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权请留言
4、 本站禁止发布或转载任何违法的相关信息,如有发现请向站长举报
导航号,我的单页导航

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

暂无评论...