Android HAL官方文档:
https://source.android.com/devices/architecture/configstore/interface?hl=zh-cn
请阅读该文章:
https://blog.csdn.net/qq_19923217/article/details/88398660
谷歌Android开源源码:
https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/master/
下表列出了 Android 所有软件包前缀和位置:
软件包前缀 | 位置 |
android.hardware.* | hardware/interfaces/* |
android.frameworks.* | frameworks/hardware/interfaces/* |
android.system.* | system/hardware/interfaces/* |
android.hidl.* | system/libhidl/transport/* |
hal语法:
https://blog4jimmy.com/2018/03/442.html
源码结构:
makefile配置:
-
android/hardware/interfaces/Android.bp
hidl_package_root {
name: "android.hardware" # 软件包前缀
use_current: true,
}
可见,软件包前缀是由Android.bp或Android.mk定义的。
Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。
- android/hardware/interfaces/graphics/composer/2.1/Android.bp
// This file is autogenerated by hidl-gen -Landroidbp.
package {
// See: http://go/android-license-faq
// A large-scale-change added 'default_applicable_licenses' to import
// all of the 'license_kinds' from "hardware_interfaces_license"
// to get the below license kinds:
// SPDX-license-identifier-Apache-2.0
default_applicable_licenses: ["hardware_interfaces_license"],
}
hidl_interface {
name: "android.hardware.graphics.composer@2.1",
root: "android.hardware",
srcs: [
"types.hal",
"IComposer.hal",
"IComposerCallback.hal",
"IComposerClient.hal",
],
interfaces: [
"android.hardware.graphics.common@1.0",
"android.hidl.base@1.0",
],
gen_java: false,
}
创建 HAL 接口
- android/hardware/interfaces/graphics/composer/2.1/IComposer.hal
package android.hardware.graphics.composer@2.1;
interface IComposer {
createClient() generates (Error error, IComposerClient client);
}
可见,包名是在hal文件中定义的。
- android/system/libhidl/update-makefiles.sh
#!/bin/bash
set -e
if [ -z "ANDROID_BUILD_TOP" ]; then
echo "Missing ANDOIRD_BUILD_TOP env variables. Run 'launch' first."
exit 1
fi
source $ANDROID_BUILD_TOP/system/tools/hidl/update-makefiles-helper.sh
do_makefiles_update \
"android.hidl:system/libhidl/transport"
创建 .hal
文件后,请运行 hardware/interfaces/update-makefiles.sh
,将新的 .hal
文件添加到 Android.bp
和 Android.mk
文件中。
实现服务
生成接口代码
如需为接口生成样板代码,请运行 hidl-gen
。 例如,如需为 surfaceflinger
生成代码,请运行以下命令:
hidl-gen -o hardware/interfaces/configstore/1.0/default \
-Lc++-impl \
-randroid.hardware:hardware/interfaces \
-randroid.hidl:system/libhidl/transport \
android.hardware.config@1.0::ISurfaceFlingerConfigs
hidl-gen 编译器会将 .hal 文件编译成一组 .h 和 .cpp 文件,这些自动生成的文件用于编译客户端/服务端实现链接到的共享库,用于编译此共享库的 Android.bp 文件由 hardware/interfaces/update-makefiles.sh 脚本自动生成。每次将新软件包添加到 hardware/interfaces 或在现有软件包中添加/移除 .hal 文件时,都必须重新运行该脚本,以确保生成的共享库是最新的。
修改 Android.mk
接下来,请修改 Android.mk
文件,以便将实现文件 (<modulename>Configs.cpp
) 添加到 LOCAL_SRC_FILES
,并将构建标记映射到宏定义中。例如,您可以在 hardware/interface/configstore/1.0/default/Android.mk
中修改 surfaceflinger
:
LOCAL_SRC_FILES += SurfaceFlingerConfigs.cpp
ifneq ($(NUM_FRAMEBUFFER_SURFACE_BUFFERS),)
LOCAL_CFLAGS += -DNUM_FRAMEBUFFER_SURFACE_BUFFERS=$(NUM_FRAMEBUFFER_SURFACE_BUFFERS)
endif
ifeq ($(TARGET_RUNNING_WITHOUT_SYNC_FRAMEWORK),true)
LOCAL_CFLAGS += -DRUNNING_WITHOUT_SYNC_FRAMEWORK
endif
实现函数
如需填充函数以实现 HAL,请以不同的值回调 _hidl_cb
函数(以构建标记为条件)。例如,您可以在 hardware/interfaces/configstore/1.0/default/SurfaceFlingerConfigs.cpp
中填充 surfaceflinger
的函数:
Return<void> SurfaceFlingerConfigs::numFramebufferSurfaceBuffers(
numFramebufferSurfaceBuffers_cb _hidl_cb) {
#if NUM_FRAMEBUFFER_SURFACE_BUFFERS 2
_hidl_cb(NumBuffers.TWO);
#else if NUM_FRAMEBUFFER_SURFACE_BUFFERS 3
_hidl_cb(NumBuffers.THREE);
#else
_hidl_cb(NumBuffers.USE_DEFAULT);
#endif
}
Return<void> SurfaceFlingerConfigs::runWithoutSyncFramework(
runWithoutSyncFramework_cb _hidl_cb) {
#ifdef RUNNING_WITHOUT_SYNC_FRAMEWORK
_hidl_cb({true /* specified */, true /* value */});
#else
// when macro not defined, we can give any value to the second argument.
// It will simply be ignored in the framework side.
_hidl_cb({false /* specified */, false /* value */});
#endif
}
请确保该实现不包含名为 HIDL_FETCH_interface-name
的函数(例如 HIDL_FETCH_ISurfaceFlingerConfigs
)。这是 HIDL 直通模式所需的函数,configstore
不使用(且被禁止使用)该函数。ConfigStore 必须始终在绑定模式下运行。
注册为服务
最后,将所有接口实现注册为 configstore
服务。例如,您可以在 hardware/interfaces/configstore/1.0/default/service.cpp
中注册 surfaceflinger
实现:
configureRpcThreadpool(maxThreads, true);
sp<ISurfaceFlingerConfigs> surfaceFlingerConfigs = new SurfaceFlingerConfigs;
status_t status = surfaceFlingerConfigs->registerAsService();
sp<IBluetoothConfigs> bluetoothConfigs = new BluetoothConfigs;
status = bluetoothConfigs->registerAsService();
// register more interfaces here
joinRpcThreadpool();