Android R(11) HIDL 服务添加

3 篇文章 8 订阅
	HIDL 原本是android9.0 以上版本都具有的特性,主要用于java 层和C/C++ 层功能的连接,简言之,一句话通过hwbinder 与 HAL 进行IPC 通信。 通过hidl-gen工具可以将框架搭建好,有效地将业务层,驱动层隔离开。下面以T9630为例,分享一下touch 模块HIDL 搭建。

一. 创建hal 文件

我们创建Itouch.hal, types.hal 放到指定目录
在这里插入图片描述

二. HIDL 生成Android.bp, .cpp, .h 文件

首先系统必须完整编译通过了确保hidl-gen 已经生成

PKG_ROOT=vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces
PACKAGE=vendor.mediatek.vstTouch@1.0
HIDL_GEN_OUT=$PKG_ROOT/vstTouch/1.0/default
IMPL_GEN_OUT=$PKG_ROOT/vstTouch/1.0/impl

PACKAGE 为hidl 服务的名称。
PKG_ROOT 为存放hidl 服务的目录。
HIDL_GEN_OUT 服务的实现目录。
IMPL_GEN_OUT为 hidl 服务依赖的厂商实现目录。

执行指令

hidl-gen -L androidbp -rvendor.mediatek:$PKG_ROOT -randroid.hidl:system/libhidl/transport $PACKAGE

可以生成vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces/vstTouch/1.0/Android.bp 文件,如下:
在这里插入图片描述

执行指令

hidl-gen -o $HIDL_GEN_OUT -Lc++-impl -r vendor.mediatek:$PKG_ROOT -r android.hidl:system/libhidl/transport $PACKAGE

生成touch.cpp,touch.h
在这里插入图片描述

执行指令

hidl-gen -o $HIDL_GEN_OUT -L androidbp-impl -r vendor.mediatek:$PKG_ROOT -r android.hidl:system/libhidl/transport $PACKAGE

可以生成default/Android.bp
在这里插入图片描述
执行指令

hidl-gen -o $IMPL_GEN_OUT -L androidbp-impl -r vendor.mediatek:$PKG_ROOT -r android.hidl:system/libhidl/transport $PACKAGE

生成impl 目录及Androd.bp,如下:
在这里插入图片描述
手动创建service.cpp,rc 文件
在这里插入图片描述

三. 编辑中间文件

vstTouch/1.0/Android.bp 文件如下:

// This file is autogenerated by hidl-gen -Landroidbp.

hidl_interface {
    name: "vendor.mediatek.vstTouch@1.0",
    root: "vendor.mediatek",
    system_ext_specific: true,
    srcs: [
        "types.hal",
        "Itouch.hal",
    ],
    interfaces: [
        "android.hidl.base@1.0",
    ],
    gen_java: true,
}

subdirs = [
    "default",
    "impl",
]

说明几点:
该bp 指定输出vendor.mediatek.vstTouch@1.0
subdirs 添加需要遍历的子目录impl,default
root 必须是上hidl 服务所在的root 目录中有定义,如
vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces/android.bp中定义的hidl_package_root 中有定义

hidl_package_root {
    name: "vendor.mediatek",
    path: "vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces",
}

subdirs = [
    "wifi/supplicant/1.0",
    "tv",
    "wifidisplay/1.0",
    "graphics",
    "vstTouch" ,
]

其中vstTouch 为我们需要的工作目录,加上之后整编就可以编到该模块

vstTouch/1.0/default/Android.bp 文件

// FIXME: your file license if you have one

cc_binary {
    name: "vendor.mediatek.vstTouch@1.0-service",
    
    defaults: ["hidl_mstar"],
    
    proprietary: true,
    
    compile_multilib: "32",

    relative_install_path: "hw",

    srcs: [
        "service.cpp",
        "touch.cpp",
    ],

    init_rc: [
        "vendor.mediatek.vstTouch@1.0-service.rc"
    ],

    shared_libs: [
        "libhidlbase",
        "libutils",
        "liblog",
        "vendor.mediatek.vstTouch@1.0",
        "vendor.mediatek.vstTouch@1.0-impl",
        "libcutils",
    ],

    cppflags: [
    ],
}

输出hidl 服务的二进制文件vendor.mediatek.vstTouch@1.0-service 及rc 文件vendor.mediatek.vstTouch@1.0-service.rc
注意relative_install_path 为hw 时,文件会输出到/vendor/bin/hw/目录下,否则rc 文件中指定失败无法自启动,另外还依赖vendor.mediatek.vstTouch@1.0,vendor.mediatek.vstTouch@1.0-impl。

vstTouch/1.0/impl/Android.bp 如下:

cc_library_shared {
    name: "vendor.mediatek.vstTouch@1.0-impl",
    // relative_install_path: "hw",
    proprietary: true,
    srcs: [
        "VstTpVendorFromFctImpl.cpp",
        "VstTpVendorFromHuaXinImpl.cpp",
        "VstTpVendorFromSongLiImpl.cpp",
        "VstTpVendorFromYiLiImpl.cpp",
    ],

    shared_libs: [
        "libhidlbase",
        "libutils",
        "vendor.mediatek.vstTouch@1.0",
    ],
}

输出vendor.mediatek.vstTouch@1.0-impl的动态库srcs 指定个厂商的代码实现逻辑,此处relative_install_path 去掉这样库默认输出到/vendor/lib 下,否则vendor.mediatek.vstTouch@1.0-service 找不到改库也会启动失败。
vendor.mediatek.vstTouch@1.0-service.rc 文件如下:

service Vst_tp /vendor/bin/hw/vendor.mediatek.vstTouch@1.0-service
    class hal
    user system
    group system

vstTouch 下面几个目录的依赖关系如下:
在这里插入图片描述

四. 编译

单编可以生成对应库和依赖文件

croot
mmm vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces/vstTouch/1.0/

五. 安装

主要是修改mk ,xml 文件
vendor/mediatek/common-tv/common.mk 添加

PRODUCT_PACKAGES += \
    vendor.mediatek.vstTouch@1.0 \
    vendor.mediatek.vstTouch@1.0-service \
    vendor.mediatek.vstTouch@1.0-impl \

device/mediatek/m7332/common/configs/manifest.xml 添加:

    <hal format="hidl">
        <name>vendor.mediatek.vstTouch</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>Itouch</name>
            <instance>default</instance>
        </interface>
    </hal>

另外一个vendor/mediatek/proprietary_tv/open/hardware/mtk_interfaces/current.txt添加hash code

1c0383b25e0ba623f7216243477f00636c2225afe892f1dc11dee77ee5ddf1d6 vendor.mediatek.vstTouch@1.0::types
89e611490954b2b7097d6e25ad1719266e20903a18a5a7f8aff34978d349484e vendor.mediatek.vstTouch@1.0::Itouch

通过指令

hidl-gen -L hash -r vendor.mediatek:$PKG_ROOT -randroid.hidl:system/libhidl/transport $PACKAGE >> $PKG_ROOT/current.txt

添加。

六. 权限设置

在vendor/mediatek/proprietary_tv/open/system/sepolicy 目录下
新增文件hal_vstTouch.te

binder_call(hal_vstTouch_client, hal_vstTouch_server)
binder_call(hal_vstTouch_server, hal_vstTouch_client)

add_hwservice(hal_vstTouch_server, hal_vstTouch_hwservice)


allow hal_vstTouch_client hal_vstTouch_hwservice:hwservice_manager find;

新增文件hal_vstTouch_default.te

type hal_vstTouch_default, domain;
hal_server_domain(hal_vstTouch_default, hal_vstTouch)

type hal_vstTouch_default_exec, exec_type, vendor_file_type, file_type;
init_daemon_domain(hal_vstTouch_default)

vndbinder_use(hal_vstTouch_default)

set_prop(hal_vstTouch_default, mtk_core_property_type)


allow hal_vstTouch_default AIPQService:binder call;
allow hal_vstTouch_default hal_allocator:fd { use };
allow hal_vstTouch_default hal_allocator_server:fd { use };
allow hal_vstTouch_default hal_allocator:binder { call };
allow hal_vstTouch_default hal_allocator_server:binder { call };
allow hal_vstTouch_default hidl_memory_hwservice:hwservice_manager { find };
allow hal_vstTouch_default mstar_system_vndservice:service_manager { add find };
allow hal_vstTouch_default self:binder { transfer call };

attributes文件添加如下内容:

attribute hal_vstTouch;
attribute hal_vstTouch_client;
attribute hal_vstTouch_server;

platform_app.te 新增内容:

hal_client_domain(platform_app, hal_vstTouch);

system_app.te新增内容:

hal_client_domain(system_app, hal_vstTouch);

file_contexts 新增内容:

/vendor/bin/hw/vendor\.mediatek\.vstTouch@1\.0-service                              u:object_r:hal_vstTouch_default_exec:s0

hwservice.te 新增内容:

type hal_vstTouch_hwservice, hwservice_manager_type;

priv_app.te 新增内容:

hal_client_domain(priv_app, hal_vstTouch);

hwservice_contexts 新增内容:

# hal vstTouch
vendor.mediatek.vstTouch::Itouch                                    u:object_r:hal_vstTouch_hwservice:s0

然后全编,升级后可以看到
在这里插入图片描述

七. APP 调用

Androd.mk 中添加

LOCAL_STATIC_JAVA_LIBRARIES += \
    vendor.mediatek.vstTouch-V1.0-java

test.java 中

import vendor.mediatek.vstTouch.V1_0.Itouch;

public void test(){
	Itouch touch = Itouch.getService();
    touch.setTheLimitedRect(0,0,3840,2160);
}

在这里插入图片描述

归纳一下修改的文件:

.
├── device
│   └── mediatek
│       └── m7332
│           └── common
│               └── configs
│                   └── manifest.xml
└── vendor
    └── mediatek
        ├── common-tv
        │   └── common.mk
        └── proprietary_tv
            └── open
                ├── hardware
                │   └── mtk_interfaces
                │       ├── Android.bp
                │       ├── current.txt
                │       └── vstTouch
                │           └── 1.0
                │               ├── Android.bp
                │               ├── default
                │               │   ├── Android.bp
                │               │   ├── service.cpp
                │               │   ├── touch.cpp
                │               │   ├── touch.h
                │               │   └── vendor.mediatek.vstTouch@1.0-service.rc
                │               ├── impl
                │               │   ├── Android.bp
                │               │   ├── VstTpVendorBase.cpp
                │               │   ├── VstTpVendorBase.h
                │               │   ├── VstTpVendorFromFctImpl.cpp
                │               │   ├── VstTpVendorFromFctImpl.h
                │               │   ├── VstTpVendorFromHuaXinImpl.cpp
                │               │   ├── VstTpVendorFromHuaXinImpl.h
                │               │   ├── VstTpVendorFromSongLiImpl.cpp
                │               │   ├── VstTpVendorFromSongLiImpl.h
                │               │   ├── VstTpVendorFromYiLiImpl.cpp
                │               │   └── VstTpVendorFromYiLiImpl.h
                │               ├── Itouch.hal
                │               └── types.hal
                └── system
                    └── sepolicy
                        ├── attributes
                        ├── file_contexts
                        ├── hal_vstTouch_default.te
                        ├── hal_vstTouch.te
                        ├── hwservice_contexts
                        ├── hwservice.te
                        ├── platform_app.te
                        ├── priv_app.te
                        └── system_app.te
  • 13
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
添加HIDL接口,你需要按照以下步骤进行操作: 1. 创建一个新的HIDL接口文件,它应该包含你想要添加的新接口的定义。例如,如果你想添加一个名为“IMyInterface”的新接口,则应该创建一个名为“IMyInterface.hidl”的文件。 2. 在该文件中定义你的接口方法,例如: ``` interface IMyInterface { void myMethod(int32_t arg1, int32_t arg2); }; ``` 这将定义一个名为“myMethod”的方法,它接受两个整数参数。 3. 在你的HIDL服务中实现新接口方法。这通常涉及创建一个新的C++类来实现你的接口,并将其添加到你的服务中。 4. 在你的服务的main函数中注册新的接口。这可以通过调用registerAsService函数来完成,例如: ``` sp<IMyInterface> myInterface = new MyInterfaceImpl(); status_t status = myInterface->registerAsService(); if (status != OK) { ALOGE("Could not register MyInterface service (%d).", status); return -1; } ``` 这将创建一个名为“MyInterface”的服务,并将其注册到系统服务管理器中。 5. 在你的客户端应用程序中使用新接口。这通常涉及使用getService函数获取对接口的引用,并调用其方法。例如: ``` sp<IMyInterface> myInterface = IMyInterface::getService(); if (myInterface == nullptr) { ALOGE("Could not get MyInterface service."); return -1; } myInterface->myMethod(42, 24); ``` 这将获取名为“MyInterface”的服务的引用,并调用其“myMethod”方法,将42和24作为参数传递。 以上是添加HIDL接口的基本步骤,你可以根据你的具体需求进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值