本文将介绍如何在Android P上简单增加绑定式的HAL Service,然后编写一个App直接调用HAL的接口,并使用 aosp_car_x86_64-userdebug 模拟器进行验证。
一 编写.hal文件
.hal的语言格式是C++和Java的结合体。
以 hardware/interfaces 为根目录,在这个目录下创建 test/1.0 作为我们编写的服务的工作目录。
1.1 新建types.hal(定义结构体,复杂变量可在此定义)
//types.hal
package android.hardware.test@1.0;
struct TestEvent{
int32_t what;
string msg;
};
1.2 新建ITestCallback.hal (用于回调使用)
//ITestCallback.hal
package android.hardware.test@1.0;
interface ITestCallback{
//oneway 异步操作且无返回值
oneway onTestEvent(TestEvent event);
};
1.3 新建ITest.hal (主接口)
//ITest.hal
package android.hardware.test@1.0;
//需要导入其他的接口,types.hal中的结构体不需要手动导入
import android.hardware.test@1.0::ITestCallback;
interface ITest{
init();
//generates 代表返回的数据类型
helloworld(string name) generates (string result);
setCallback(ITestCallback callback) generates (bool res);
release();
};
二 使用 hidl-gen 生成*.h、*.cpp、Android.bp等模板文件
2.1 hidl-gen 是AOSP中编译生成的工具,因此在之前全编一次,若已经全编,那么只用source和lunch加载一下环境变量。
source build/envsetup.sh
lunch aosp_car_x86_64_userdebug
make -j12
2.2 切换至项目目录 hardware/interfaces/test/1.0 ,并创建hal服务端代码存放的目录 default
2.3 使用 hidl-gen 生成服务端的.cpp和.h文件。 具体hidl-gen 使用方法可参见 hidl-gen --help
hidl-gen -o . -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport default
2.4 使用hidl-gen 生成Android.bp文件。
hidl-gen -o . -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport default
2.5 使用 update-makefile.sh 生成1.0目录下的Android.bp 文件。
//该sh文件在 /hardware/interfaces目录下
sh ../update-makefiles.sh
2.6 因为服务端不需要ITestCallback的具体实现,故删除2.3步生成的TestCallback.cpp和TestCallback.h。
三 实现hal 服务端
3.1 编辑Test.h文件,为了方便打印Log,我们需要在这里include Log 头文件以及定义TAG。
#ifndef ANDROID_HARDWARE_TEST_V1_0_TEST_H
#define ANDROID_HARDWARE_TEST_V1_0_TEST_H
#include <android/hardware/test/1.0/ITest.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
//增加的部分开始
#includ