Android R(11) HIDL 服务添加

Android R(11) HIDL 服务添加,第1张

	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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992869.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存