完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
添加服务流程
一。hardware1.11 编写的。hal 目录新建他的文件夹,他下新建了 1 个文件夹。 新建 types.hal (非必要,用于定义结构体,复杂可在此定义) //types.halpackage ;struct DeviceType{ int32_t 类型; 字符串状态;};struct DeviceEvent{ int32_t 什么;字符串味精;}; 新建IHet.hal (主接口) package ;import IDeviceCallback;interface IHet { setState(DeviceType type) generate (string result); getState(int32_t type) 生成(字符串结果);// 变量类型string 不是String setCallback(IDeviceCallback callback) generate (bool res); // 变量类型 bool 不是boolean release();};1.2 使用hidl-gen 生成生成 source ./build/envsetup.shlunch aosp_car_x86_64-engmake -j4make hidl-gen -j4 设置临时变量 PACKAGE=android.hardware.het@1.0LOC=hardware/interfaces/het/1.0/default 使用hidl -gen 生成default目录里的C++文件 hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE 使用hidl-gen生成default目录里的Android .bp文件 hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE 使用update-makefiles.sh 生成1.0目录下的Android.bp ./ hardware/interfaces/update-makefiles.sh此时的目录结构为 +-- 1.0¦ +-- Android.bp¦ +-- Android.mk¦ +-- default¦ ¦ +-- Android.bp¦ +- -¦ ¦ +-- Het.cpp¦ ¦ +-- Het.h¦ ¦ +-- service.cpp¦ +-- IDeviceCallback.hal¦ +-- IHet.hal¦ +-- types.hal+-- Android.bp DeviceCallback.cpp和DeviceCallback.h没用删掉,并修改默认的Android.bp删掉DeviceCallback.cpp 1.3实现.cpp 实现hidl-gen生成的het.cpp 添加启动服务 新建启动脚本 //types.hal package android.hardware.het@1.0; struct DeviceType{ int32_t type; string state; }; struct DeviceEvent{ int32_t what; string msg; }; 新建 IHet.hal (主接口) package android.hardware.het@1.0; import IDeviceCallback; interface IHet { setState(DeviceType type) generates (string result); getState(int32_t type) generates (string result); //变量类型string 不是String setCallback(IDeviceCallback callback) generates (bool res); //变量类型bool 不是boolean release(); }; 1.2 使用hidl-gen生成变量 source ./build/envsetup.sh lunch aosp_car_x86_64-eng make -j4 make hidl-gen -j4 设置临时变量 PACKAGE=android.hardware.het@1.0 LOC=hardware/interfaces/het/1.0/default 使用hidl-gen生成default目录 里的C++文件 hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE 使用hidl-gen生成default目录 里的Android.bp文件 hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE 使用update-makefiles.sh生成1.0目录下的Android.bp ./hardware/interfaces/update-makefiles.sh 此时的目录结构为 +-- 1.0 ¦ +-- Android.bp ¦ +-- Android.mk ¦ +-- default ¦ ¦ +-- Android.bp ¦ ¦ +-- android.hardware.het@1.0-service.rc ¦ ¦ +-- Het.cpp ¦ ¦ +-- Het.h ¦ ¦ +-- service.cpp ¦ +-- IDeviceCallback.hal ¦ +-- IHet.hal ¦ +-- types.hal +-- Android.bp DeviceCallback.cpp和 DeviceCallback.h没用删掉,并修改default里的Android.bp 删掉DeviceCallback.cpp 1.3 实现.cpp 实现由hidl-gen生成的het.cpp 添加启动service 新建android.hardware.het@1.0-service.rc 启动脚本 service het-hal-1-0 /vendor/bin/hw/android.hardware.het@1.0-service class hal user system group system 新建service.cpp 这里使用绑定式 直通式为注释部分 #define LOG_TAG "android.hardware.het@1.0-service" #include #include #include #include #include "Het.h" using android::hardware::configureRpcThreadpool; using android::hardware::joinRpcThreadpool; using android::hardware::het::V1_0::IHet; using android::hardware::het::V1_0::implementation::Het; //using android::hardware::defaultPassthroughServiceImplementation; //passthrough mode using android::sp; int main() { #if 0 return defaultPassthroughServiceImplementation //passthrough mode #else configureRpcThreadpool(4, true); sp auto status = het->registerAsService(); CHECK_EQ(status, android::OK) << "Failed to register het HAL implementation"; joinRpcThreadpool(); return 0; // joinRpcThreadpool shouldn't exit #endif } 修改Android.bp cc_library_shared { name: "android.hardware.het@1.0-impl", defaults: ["hidl_defaults"], srcs: ["Het.cpp",], shared_libs: [ "libbase", "liblog", "libdl", "libutils", "libhardware", "libhidlbase", "libhidltransport", "android.hardware.het@1.0", ], } cc_binary { vendor: true, relative_install_path: "hw", defaults: ["hidl_defaults"], name: "android.hardware.het@1.0-service", init_rc: ["android.hardware.het@1.0-service.rc"], srcs: ["Het.cpp", "service.cpp",], shared_libs: [ "libbase", "liblog", "libdl", "libutils", "libhardware", "libhidlbase", "libhidltransport", "android.hardware.het@1.0", ], } 调用 update-makefiles.sh更新一下。 编译 mmm ./hardware/interfaces/test/1.0 编译输出 vendor/lib/hw/android.hardware.het@1.0-impl.so vendor/bin/hw/android.hardware.het@1.0-service vendor/etc/init/android.hardware.het@1.0-service.rc system/lib/android.hardware.het@1.0.so 二. device部分 在aospdevicerockchipcommonmanifest.xml文件中添加het服务 在aospdevicerockchiprk3288device.mk中添加het service PRODUCT_PACKAGES += android.hardware.het@1.0-impl android.hardware.het@1.0-service [/email][email=android.hardware.het@1.0]三. SELinux 部分---- halo 也设置了不同的sepoli 目录,以供Google 进行区分。/system/sepolicy public: android 共享和供应商的sepolicy 定义,通常情况下,意味着供应商或开发者可能会增加一些权限。系统/供应商通用的一般用途和属性的定义,绝不允许限制等一些类型的会。 私有:通常用于系统映像的内部使用,不正确或开放。这个编译到系统映像中。 它可以引用公共下的相关定义,将这个目录编译到vendor image中。但它仍然可以对系统映像里面的模块sepolicy(module 在public下进行声明); 在约束约束了Google GTS 测试。 映射版本的sepolicy并导入,才可能在老版本的系统上使用。即包括两方面的类型,新增加版本的类型,以及旧版本设置的新私有版本,公共版本,新版本更新版本。 本例修改为aospsystemsepolicy,该目录下有vendor public private(注意public下的同样要修改到prebuiltsapi26.0下的文件,否则编译会报错) 3.1 vendorfile_contexts 添加 /(vendor|system/vendor)/bin/hw/android.hardware.het@1.0-service u:object_r:hal_het_default_exec:s0 /(vendor|system/vendor)/lib(64)?/hw/android.hardware.het@1.0-impl.so u:object_r:same_process_hal_file:s0 #file_contexts文件保存系统中所有文件的安全上下文定义,每行前半部分是文件的路径,后面是它的安全上下文的定义(hal_test_default_exec) 新建hal_het_default.te #定义一个 名字为 hal_het_default 的type #TYPE是定义主体和客体所属的类型,对于进程而言,它的类型也称为domian。 #通常主体的type具有domian属性,因此,我们也把主体的type称为domain,将domain设置为hal_het_default的属性,表明zygote是用来描述进程的安全上下文的。 type hal_het_default, domain; hal_server_domain(hal_het_default, hal_het); type hal_het_default_exec, exec_type, file_type, vendor_file_type; init_daemon_domain(hal_het_default) allow hal_het_default hwservicemanager_prop:file r_file_perms; allow hal_het_default hal_het_hwservice:hwservice_manager { add find }; allow hal_het_default ttyS_device:chr_file rw_file_perms; allow hal_het_default input_device:chr_file rw_file_perms; allow hal_het_default input_device:dir { search }; allow hal_het_default hidl_base_hwservice:hwservice_manager add; 3.2 public目录 attributes 添加 attribute hal_het; expandattribute hal_het true; attribute hal_het_client; expandattribute hal_het_client true; attribute hal_het_server; expandattribute hal_het_server false; #hal_attribute(het); hwservice.te 添加 type hal_het_hwservice, hwservice_manager_type; 新建 hal_het.te # HwBinder IPC from client to server, and callbacks binder_call(hal_het_client, hal_het_server) binder_call(hal_het_server, hal_het_client) add_hwservice(hal_het_server, hal_het_hwservice) allow hal_het_client hal_het_hwservice:hwservice_manager find; 将以上修改同步到aospsystemsepolicyprebuiltsapi26.0public 3.3 private目录 hwservice_contexts 添加 android.hardware.het::IHet u:object_r:hal_het_hwservice:s0 private/compat/26.0/26.0.ignore.cil 添加 hal_het_hwservice 将以上修改同步到aospsystemsepolicyprebuiltsapi26.0private 四. 客户端实现 4.1 system_service实现 4.1.1 HetManager端 在目录aospframeworksbasecorejavaandroidos里 新建het目录 创建IHetService.aidl 对应hal层 四个功能 package android.os.het; import android.os.het.IDeviceEventListener; // Declare any non-default types here with import statements interface IHetService { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ String setState(int type, String state); String getState(int type); boolean setDeviceEventListener(IDeviceEventListener listener); void release(); } 创建IDeviceEventListener.aidl, IHetService.aidl 里传递的自定类 package android.os.het; import android.os.het.DeviceListenerEvent; // Declare any non-default types here with import statements interface IDeviceEventListener { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ void onEvent (inout DeviceListenerEvent event); } 创建DeviceListenerEvent.aidl, IDeviceEventListener.aidl 里传递的 event 类型变量 package android.os.het; // Declare any non-default types here with import statements parcelable DeviceListenerEvent; 创建DeviceListerEvent.java package android.os.het; import android.os.Parcel; import android.os.Parcelable; /** * android.os.het.DeviceListenerEvent */ public class DeviceListenerEvent implements Parcelable { private int what; private String msg; public DeviceListenerEvent(int what, String msg) { this.what = what; this.msg = msg; } public DeviceListenerEvent(Parcel in) { what = in.readInt(); msg = in.readString(); } public void setWhat(int what) { this.what = what; } public void setMsg(String msg) { this.msg = msg; } public int getWhat() { return what; } public String getMsg() { return msg; } public static final Creator @Override public DeviceListenerEvent createFromParcel(Parcel in) { return new DeviceListenerEvent(in); } @Override public DeviceListenerEvent[] newArray(int size) { return new DeviceListenerEvent[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeInt(what); dest.writeString(msg); } /** * 从parcel中读取,从parcel中读取,顺序与write一致 * 如果要支持为 out 或者 inout 的定向 tag 的话,需要实现 readFromParcel() 方法 * @param dest */ public void readFromParcel(Parcel dest) { what = dest.readInt(); msg = dest.readString(); } } |
|
|
|
创建HetManager.java 供上层APP调用
package android.os.het; /** * ---------------------------------------------------------------- * Copyright (C) 2014-2020, by het, Shenzhen, All rights reserved. * ---------------------------------------------------------------- *
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
基于米尔瑞芯微RK3576核心板/开发板的人脸疲劳检测应用方案
569 浏览 0 评论
839 浏览 1 评论
737 浏览 1 评论
1957 浏览 1 评论
3204 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 10:40 , Processed in 0.546183 second(s), Total 45, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号