Android R(11) HIDL 服务添加"/>
Android R(11) HIDL 服务添加
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 onecc_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-serviceclass haluser systemgroup 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
更多推荐
Android R(11) HIDL 服务添加
发布评论