framework中添加自己的aidl

Android  小知识  2024年3月27日 am8:58发布6个月前更新 91es.com站长
71 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、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

圆形顺时针滚动ImageView

前言记录一下项目中用的圆形顺时针滚动的自定义ImageView,当然也可以顺时针滚动。主要是代码片段。正文记录于此,方便自己查阅。隐藏内容!付费阅读后才能查看!¥2 ¥3多个隐藏块只需支付一次付费阅读参考文章

拷贝文件时异常断电导致文件拷贝失败

前言测试反馈如果断电前点击收藏歌曲(也就是拷贝到内置存储卡,有提示拷贝成功)后,开机起来后小概率出现部分收藏的歌曲消失了。原因大概知道,但讲得不够清晰,因此看到网友文章,摘抄于此,方便自己查阅。真正原因:拷贝文件是写入缓冲区内,调用的flush()也无法保证文件写入到了物理存储设备上。PS...

Android触摸事件简单分析

这篇文章以前写的,后来博客清空重新开始了。最近看到,因此摘抄于此,以便查阅。在开始分析之前,大家可以先记几个结论,这样便于理解。  结论1:事件一定是先到达父控件上。  结论2:事件简单来说可以分为三种:Down事件、Move事件、Up事件。PS:(1) 为了让读者看得更清晰,在代码中只打...

Android的LevelListDrawable简单使用

前言LevelListDrawable是通过改变层级值来显示对应的图片,除了下面的开关灯,还有WiFi的状态显示,电池状态的显示也可以用这种。在公司好像没发现有人使用过LevelListDrawable(或者我看代码太少了哈)。自己懒得写了,摘抄一些网友写的,以便自己学习。以下内容都是摘抄...

顾城:门前

我多么希望,有一个门口早晨,阳光照在草上 我们站着扶着自己的门扇门很低,但太阳是明亮的 草在结它的种子风在摇它的叶子我们站着,不说话就十分美好 有门,不用开开是我们的,就十分美好

Git tag 简单使用

前言打标签像其他版本控制系统(VCS)一样,Git可以给仓库历史中的某一个提交打上标签,以示重要。比较有代表性的是人们会使用这个功能来标记发布结点( v1.0 、 v2.0 等等)。在项目中,为了区分SOP的版本代码,常要求打标签。正文下面简单的介绍一下TAG的使用.列出标签git...