framework中添加自己的aidl

Android  小知识  2024年3月27日 am8:58发布8个月前更新 城堡大人
106 0 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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

[摘]PCM文件转WAV文件

一、WAV和PCM的区别和联系在Android平台上要进行音频编辑操作(比如裁剪,插入,合成等),通常都是需要将音频文件解码为WAV格式的音频文件或者PCM文件。那么WAV和PCM之间有什么关系,这里有必要了解一下。PCM(Pulse Code Modulation—-脉码调制录音)。所谓PC...

Zygote的启动之二ZygoteInit

前言Android系统中,所有的应用程序以及SystemServer都是由Zygote进程孕育(fork)出来的。接上文,上文介绍从Native世界进入了Java世界。而且java世界的大门就是ZygtoeInit.java。这次我们看ZygtoeInit中处理了哪些功能。Android P...

博尔赫斯:我用什么才能留住你

我用什么才能留住你?我给你瘦落的街道、绝望的落日、荒郊的月亮。我给你一个久久地望着孤月的人的悲哀。 我给你我已死去的祖辈,后人们用大理石祭奠的先魂:我父亲的父亲,阵亡于布宜诺斯艾利斯的边境,两颗子弹射穿了他的胸膛,死的时候蓄着胡子,尸体被士兵们用牛皮裹起; ...

TextView设置倾斜右边显示不全

直接上布局代码 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@an...

SQLiteBlobTooBigException

前言记录一下查询数据库时的异常Caused by: android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=0, totalRows=1at and...

Thread.join()简单介绍

前言简单记录一下Thread.join()的作用。这里只是简单记录一下,方便自己回顾而已。正文join()是在Thread.java中定义join源码/** * Waits for this thread to die.[等待这个线程死亡] * @throws Interrupt...