Android HAL 接口定义语言

 

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/

https://android.googlesource.com/platform/hardware/interfaces/+/refs/heads/master/graphics/composer/2.1/

下表列出了 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();

参考

https://blog.csdn.net/qq_19923217/article/details/88398660

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值