Android 8 的HIDL 学习 之 Code demo
当学习到一定程度的时候,发现helloworld 也越来越复杂了。
今天就来讲讲 HIDL 的一些内容吧
直接上
首先,这个是HIDL话说是在 Android 8 才开始引用进来的。而具体啥是HIDL,这个去搜搜吧。不在这里展开了。
首先Android 源码一套,是整编译完毕的,无误的之后的。
然后你得有块板子,将编译后的文件烧录到板子上能正常跑的。我的板子系统是64位的
代码路径主要是在
下面就开始真正的HIDL编辑过程了。
确保是已经执行了以下命令了
source build/envsetup.sh
lunch xxxx-userdebug
第一步:创建文件夹
mkdir -p hardware/interfaces/ddemo/1.0/default
第二步:创建 IDdemo.hal 文件
在 hardware/interfaces/ddemo/1.0/ 该路径下,创建一个 IDdemo.hal 文件
package android.hardware.ddemo@1.0;interface IDdemo {helloWorld(string name) generates (string result);getAge(string name) generates (string result);
};
第三步:使用 hidl-gen工具 生成文件
如果没有该工具,应该先生成
make hidl-gen -j24
如果有,那就直接敲以下命令
PACKAGE=android.hardware.ddemo@1.0
LOC=hardware/interfaces/ddemo/1.0/default/hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE
如果执行以上命令没有报错,那就是没问题,然后执行以下指令
执行 ./hardware/interfaces/update-makefiles.sh
如果不报错
那么执行 tree hardware/interfaces/ddemo/
可以看到该树hardware/interfaces/ddemo/
├── 1.0
│ ├── Android.bp
│ ├── Android.mk
│ ├── default
│ │ ├── Android.bp
│ │ ├── Ddemo.cpp
│ │ └── Ddemo.h
│ └── IDdemo.hal
└── Android.bp
此时查看一下 defalult 目录下的 Android.bp 里面到底是个啥
cc_library_shared {name: "android.hardware.ddemo@1.0-impl",relative_install_path: "hw",proprietary: true,srcs: ["Ddemo.cpp",],shared_libs: ["libhidlbase","libhidltransport","libutils","android.hardware.ddemo@1.0",],
}
此时执行以下命令,可以看到变异成功。这说明创建该接口没什么问题了
mmm hardware/interfaces/ddemo/1.0/default/
不要着急,继续一步一步来
第四步:修改生成的文件
Ddemo.h 将 extern 那行的注释打开
/*file name: Ddemo.h*/#ifndef ANDROID_HARDWARE_DDEMO_V1_0_DDEMO_H
#define ANDROID_HARDWARE_DDEMO_V1_0_DDEMO_H#include <android/hardware/ddemo/1.0/IDdemo.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>namespace android {
namespace hardware {
namespace ddemo {
namespace V1_0 {
namespace implementation {using ::android::hardware::hidl_array;
using ::android::hardware::hidl_memory;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::sp;struct Ddemo : public IDdemo {// Methods from IDdemo follow.Return<void> helloWorld(const hidl_string& name, helloWorld_cb _hidl_cb) override;Return<void> getAge(const hidl_string& name, getAge_cb _hidl_cb) override;// Methods from ::android::hidl::base::V1_0::IBase follow.};// FIXME: most likely delete, this is only for passthrough implementations
extern "C" IDdemo* HIDL_FETCH_IDdemo(const char* name);} // namespace implementation
} // namespace V1_0
} // namespace ddemo
} // namespace hardware
} // namespace android#endif // ANDROID_HARDWARE_DDEMO_V1_0_DDEMO_H
Ddemo.cpp 将 HIDL_FETCH_IDdemo 那行的注释打开
#include <iostream>
#include "Ddemo.h"namespace android {
namespace hardware {
namespace ddemo {
namespace V1_0 {
namespace implementation {// Methods from IDdemo follow.
Return<void> Ddemo::helloWorld(const hidl_string& name, helloWorld_cb _hidl_cb) {// TODO implementchar buf[128];::memset(buf,0,sizeof(buf));::snprintf(buf,100,"Ddemo hello world ,%s",name.c_str());hidl_string result(buf);_hidl_cb(result);return Void();
}Return<void> Ddemo::getAge(const hidl_string& name, getAge_cb _hidl_cb) {// TODO implementchar buf[128];::memset(buf,0,sizeof(buf));if(name == "zhangsan"){std::string age("24");::snprintf(buf,100,"Ddemo hello world getAge:%s->%s",name.c_str(),age.c_str());}else{std::string age("15");::snprintf(buf,100,"Ddemo hello world getAge:%s->%s",name.c_str(),age.c_str());}hidl_string result(buf);_hidl_cb(result);return Void();
}// Methods from ::android::hidl::base::V1_0::IBase follow.IDdemo* HIDL_FETCH_IDdemo(const char* /* name */) {return new Ddemo();
}} // namespace implementation
} // namespace V1_0
} // namespace ddemo
} // namespace hardware
} // namespace android
第五步:执行编译
mmm hardware/interfaces/ddemo/1.0/default/
成功编译之后可以看到生成
out/target/product/xxx/vendor/lib64/hw 目录下
android.hardware.ddemo@1.0-impl.so
以及
out/target/product/xxx/system/lib64 目录下的
android.hardware.ddemo@1.0.so
(可能不同的工程、平台会有所不同,看编译打印的log 找吧)
第六步:建立两个空文件并写入内容
touch hardware/interfaces/ddemo/1.0/default/android.hardware.ddemo@1.0-service.rc
touch hardware/interfaces/ddemo/1.0/default/service.cpp
写入内容:android.hardware.ddemo@1.0-service.rc
service ddemo_hal_service /vendor/bin/hw/android.hardware.ddemo@1.0-serviceclass haluser systemgroup system
编写 service.cpp
#define LOG_TAG "android.hardware.ddemo@1.0-service"#include <android/hardware/ddemo/1.0/IDdemo.h>
# include <hidl/LegacySupport.h>using android::hardware::ddemo::V1_0::IDdemo;
using android::hardware::defaultPassthroughServiceImplementation;int main(){printf("ddemo start...\n");return defaultPassthroughServiceImplementation<IDdemo>();
}
在 hardware/interfaces/ddemo/1.0/default 目录下的 Android.bp 文件加入以下【cc_binary 】内容。总文件也就是如下:
cc_library_shared {name: "android.hardware.ddemo@1.0-impl",relative_install_path: "hw",proprietary: true,srcs: ["Ddemo.cpp",],shared_libs: ["libhidlbase","libhidltransport","libutils","android.hardware.ddemo@1.0",],
}cc_binary {name: "android.hardware.ddemo@1.0-service",defaults: ["hidl_defaults"],proprietary: true,relative_install_path: "hw",srcs: ["service.cpp",],init_rc: ["android.hardware.ddemo@1.0-service.rc"],shared_libs: ["libhidlbase","libhidltransport","libutils","liblog","android.hardware.ddemo@1.0","android.hardware.ddemo@1.0-impl",],
}
此时再次编译,
mmm hardware/interfaces/ddemo/1.0/default/
如果没有报错的话(有报错看错在哪里再修改),那就可以在 out/target/product/xxx/vendor/bin/hw
看到该文件 android.hardware.ddemo@1.0-service
至此,编译工作就基本上完工了。
第七步: 将变异生成的文件 push 到 板子中
(如果遇到是Read-Only ,可以先adb root , adb remount 再试试。如果是user版本,那可能adb也没用。所以一开始为啥说是要userdebug版本)
adb push android.hardware.ddemo@1.0-service /vendor/bin/hwadb push android.hardware.ddemo@1.0-impl.so /system/lib64/
adb push android.hardware.ddemo@1.0-impl.so /system/lib64/hw/adb push android.hardware.ddemo@1.0.so /system/lib64/
adb push android.hardware.ddemo@1.0.so /system/lib64/hw/
然后试试执行 是否报错 android.hardware.ddemo@1.0-service
adb shell/vendor/bin/hw/android.hardware.ddemo@1.0-service
没有报错,那就是OK,如果报
CANNOT LINK EXECUTABLE "./functions_test": library "android.hardware.ddemo@1.0.so" not found
那可能是push进去的路径不对。修改到其他路径试试看。
接口写好了。那要写个客户端来进行验证了
在 tools目录下创建文件夹 ddemo
然后创建 Andorid.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE := ddemo_test
LOCAL_SRC_FILES := \client.cpp \LOCAL_SHARED_LIBRARIES := \liblog \libhidlbase \libutils \android.hardware.ddemo@1.0 \include $(BUILD_EXECUTABLE)
同目录创建 client.cpp 并写入
# include <android/hardware/ddemo/1.0/IDdemo.h># include <hidl/Status.h># include <hidl/LegacySupport.h># include <utils/misc.h># include <hidl/HidlSupport.h># include <stdio.h>
#include <cstdlib>using android::hardware::ddemo::V1_0::IDdemo;
using android::sp;
using android::hardware::hidl_string;int main()
{int ret;android::sp<IDdemo> service = IDdemo::getService();if(service == nullptr) {printf("Failed to get service\n");return -1;}service->helloWorld("Ddemo", [&](hidl_string result) {printf("%s\n", result.c_str());});service->getAge("zhangsan",[&](hidl_string age) {printf("age = %s \n",age.c_str());});service->getAge("lisi",[&](hidl_string age) {printf("age = %s \n",age.c_str());});return 0;
}
然后 在同一个的命令编译框内执行以下命令
mmm tools/ddemo/
就可以看到
ddemo_test 该执行文件了
将该可执行文件push 到 /data/目录下
然后执行
adb shell
chmod 777 /data/ddemo_test
/data/ddemo_test
至此,验证OK
可能遇到的问题
CANNOT LINK EXECUTABLE "./functions_test": library "android.hardware.ddemo@1.0.so" not found
在 执行 android.hardware.functions@1.0-service 的时候遇到
那就将 Android.bp 中的 cc_binary 中的 srcs 修改成如下,也就是将接口增加过来。
srcs: ["service.cpp","Ddemo.cpp",],
如果是在执行 ddemo_test 的时候遇到该报错,那可能是编译 ddemo_test 的时候使用的窗口和 编译 android.hardware.functions@1.0.so 的窗口不一致。都用同一个窗口编译,再将该窗口编译的生成的 ddemo_test 推进板子再试试看。
参考链接:Android HIDL学习(2) ---- HelloWorld - 简书
Android hidl开发简单教程 - 灰信网(软件开发博客聚合)
Android 8 的HIDL 学习 之 Code demo相关推荐
- android treble项目HIDL学习总结
文章目录 概念介绍 Treble项目---HIDL产生背景,独立升级framework需求 HIDL概念---HAL 接口定义语言,目标framework和HAL解耦 HIDL的两种模式---Pass ...
- Android HIDL学习 - HelloWord入门(整理1)
Android HIDL学习(整理1) 概述 入手准备 实例应用 1.HIDL接口文件定义 2. 生成HAL相关文件 3. 实现HAL服务端的共享库 4. Hal server端启动注册程序 5.HI ...
- [Android]Android P(9) WIFI学习笔记 - HAL (1)
目录 前文回顾 前言 入口 WifiNative 初始化 打开WIFI IWifiChip IWifiCond ISupplicant 前文回顾 WIFI学习笔记 - Framework (1) WI ...
- Android中的ShareSDK学习
Android中的ShareSDK学习 一. 什么是ShareSDK ShareSDK是一种社会化分享组件,为iOS.Android.WP8 的APP提供社会化功能,集成了一些常用的类库和接口,缩短开 ...
- Android Qcom USB Driver学习(四)
该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零) VID/PID识别USB设备 CDC-ACM驱动介绍 CDC-ACM(Communication De ...
- Android第一行代码学习思考笔记(碎片、广播、持久化技术和Android数据库)
Android第一行代码学习思考笔记(碎片.广播.持久化技术和Android数据库 第四章 手机平板要兼顾--探究碎片 4.1碎片是什么(Fragment) 4.2碎片的使用方式 4.2.1碎片的简单 ...
- Android Qcom Audio架构学习
总结: Android Audio不简单呀,一个人摸索入门不容易的,研究了一段时间,感觉还不是很懂,但以下的知识对入门还是有帮助的. Audio架构中的名词 FE(Front End) 提供pcm的设 ...
- Android(4.2) Sensors 学习——G-sensor,Gyroscope驱动移植
Android(4.2) Sensors 学习--G-sensor,Gyroscope驱动移植 目录(?)[-] Sensors 种类和功能 G-sensor驱动code G-sensor HAL 注 ...
- Android折叠屏开发学习(三)---使用MotionLayout实现折叠屏分屏效果
学更好的别人, 做更好的自己. --<微卡智享> 本文长度为6259字,预计阅读11分钟 前言 今天是折叠屏开发的第三篇,前面已经介绍了铰链的角度监听和Jetpack Window实现监听 ...
最新文章
- 无法消除恐惧?Nature发现肠道菌与大脑间更多的神秘联系...
- Session分布式共享 = Session + Redis + Nginx
- mybatis配置时出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)...
- 数据结构与算法09 之图
- php定时发送生日模块消息_Swoft 2.0.5 更新,新增高效秒级定时任务、异常管理组件...
- HDU多校10 - 6886 Tic-Tac-Toe-Nim(尼姆博奕)
- 读取/书写Java的XML格式properties文件
- 6月份美国域名总量新增近5.4万个 环比减少51%
- git push命令_Git Push命令解释
- java实践项目_Java项目开发实践
- 【CSS】CSS 的优先级总结
- 拳王虚拟项目公社:怎么找低价电影票,低价电影票怎样赚钱,低价电影票实操赚钱方法?
- java方法重载两个数相加_java方法重载实验:判断键盘输入的两个数据的类型后进行比较...
- 0-9 倒计时 8x8 点阵 实现
- win7(SP1 64位)升级IE浏览器升级到IE11
- mysql 2037年,正确的方法来存储2037年之后的MySQL日期
- IRPT_TAS简介
- 无限循环小数四则运算_无限循环小数能做加减乘除四则运算吗?无限不循环小数能做吗??...
- 易福门电感式接近开关IGS200
- 大三期末网页设计作业 以旅游景点风景主题介绍网站设计与实现 (广东名胜古迹)
热门文章
- 为什么会感冒之中西医解释
- 复习总结:数据挖掘(挖掘)
- 刷题周记(九)——#状压DP:最短Hamilton路径、小国王(互不侵犯)、玉米田(Corn Fields G)、愤怒的小鸟、吃奶酪、炮兵阵地、宝藏 #区间DP:清空字符串#DP:关灯问题II
- ubuntu18 遇到libc6 版本冲突问题
- 干货 | 答编辑/审稿人问之样本量大关
- Redis学习笔记( 入门篇)
- style.zIndex
- C语言二级公共基础知识选择题高频考点**粗略~粗略~粗略个人笔记**
- 救援(YZOJ-1073)
- linux数组shell操作,shell数组操作简明总结