aidl android 怎么mk编译,使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序

本文详细介绍了如何在Android系统中使用HIDL(A Hardware Interface Definition Language)和AIDL(Android Interface Definition Language)进行跨层通信。从创建HIDL接口开始,包括编写HIDL文件、生成Android.bp、C++实现、服务启动、权限配置,到编写APP层的AIDL接口,最后展示了如何在应用中调用HAL层的服务并测试。通过这个过程,读者将深入理解Android系统中硬件抽象层到应用程序层的交互机制。
摘要由CSDN通过智能技术生成

先实现HIDL,打通从HAL到framework层

可以把自己的HIDL模块建立在hardware/interfaces/、frameworks/hardware/interfaces/、 system/hardware/interfaces/、 system/libhidl/transport/ 或者是vendor//proprietary/hardware/interfaces/等目录下。

建立HIDL目录:

$ mkdir -p hardware/interfaces/hidl_test/submodule_1/1.0/

那么这个HIDL的package name 应该是 android.hardware.hidl_test.submodule_1@1.0

建立HIDL方式的核心hal文件:

$ vi hardware/interfaces/hidl_test/submodule_1/1.0/IHidlTest.hal

package android.hardware.hidl_test.submodule_1@1.0;

interface IHidlTest {

justTest(string name) generates (string result, EnumHidlTest value);

justTest1(EnumHidlTest name);

};

$ vi hardware/interfaces/hidl_test/submodule_1/1.0/types.hal

package android.hardware.hidl_test.submodule_1@1.0;

@export(name=”EnumHidlTest”, value_prefix=””)

enum EnumHidlTest : uint8_t {

V_TEST1 = 0,

V_TEST2 = 1,

};

利用hidl-gen工具生成Android.bp、源代码等文件:

先编译一次全部的源码,然后hidl-gen就可以用了(生成在 out/host/linux-x86/bin/hidl-gen):

$ source build/envsetup.sh

$ lunch full_ac8257_demo-userdebug

$ hidl-gen -h

生成顶级目录下的Android.bp:

$ hardware/interfaces/update-makefiles.sh

其实调用的就是hidl-gen这个命令来执行的(-Landroidbp表示Generates Soong bp files for -Lc++-headers, -Lc++-sources, -Ljava, -Ljava-constants, and -Lc++-adapter) :

$ hidl-gen -O “” -Landroidbp   -r android.hardware:hardware/interfaces   -r android.hidl:system/libhidl/transport   android.hardware.hidl_test.submodule_1@1.0;

查看下(因为上面hal里面有@export修饰符,所以这里gen_java_constants为true):

$ cat hardware/interfaces/hidl_test/submodule_1/1.0/Android.bp

// This file is autogenerated by hidl-gen -Landroidbp.

hidl_interface {

name: “android.hardware.hidl_test.submodule_1@1.0”,

root: “android.hardware”,

vndk: {

enabled: true,

},

srcs: [

“types.hal”,

“IHidlTest.hal”,

],

interfaces: [

“android.hidl.base@1.0”,

],

types: [

“EnumHidlTest”,

],

gen_java: true,

gen_java_constants: true,

}

在default子目录生成C++实现文件:

$ hidl-gen -O “” -Lc++-impl -o $ANDROID_BUILD_TOP/hardware/interfaces/hidl_test/submodule_1/1.0/default/  -r android.hardware:hardware/interfaces   -r android.hidl:system/libhidl/transport   android.hardware.hidl_test.submodule_1@1.0;

在default子目录生成Android.bp文件,以便后面对impl源文件编译:

$ hidl-gen -O “” -Landroidbp-impl -o $ANDROID_BUILD_TOP/hardware/interfaces/hidl_test/submodule_1/1.0/default/  -r android.hardware:hardware/interfaces   -r android.hidl:system/libhidl/transport   android.hardware.hidl_test.submodule_1@1.0;

$ ll hardware/interfaces/hidl_test/submodule_1/1.0/default/

-rw-r–r– 1 shuzhiang development  993  3月 25 10:35 Android.bp

-rw-r–r– 1 shuzhiang development  826  3月 25 10:34 HidlTest.cpp

-rw-r–r– 1 shuzhiang development 1376  3月 25 10:34 HidlTest.h

添加接口哈希值到current.txt:

$ hidl-gen -L hash -r android.hardware:hardware/interfaces   -r android.hidl:system/libhidl/transport    android.hardware.hidl_test.submodule_1@1.0::types

4b8c76bc9f7dbe48c357ad5b838dbf497bd0af9c3c0ee5a557b947794abe1cd7 android.hardware.hidl_test.submodule_1@1.0::types

把上面的输出结果添加到current.txt,加到最后即可:

$ vi hardware/interfaces/current.txt

4b8c76bc9f7dbe48c357ad5b838dbf497bd0af9c3c0ee5a557b947794abe1cd7 android.hardware.hidl_test.submodule_1@1.0::types

然后可以修改HidlTest.cpp来实现接口的函数:

切记:如果hal文件变更了,重新生成该代码时,会被覆盖掉,所以每次hal变更前把default目录mv一下,换个名字,等生成完了,再把老的代码手工移到新生成的文件里面。

$ vi hardware/interfaces/hidl_test/submodule_1/1.0/default/HidlTest.cpp

#define LOG_TAG “HidlTestImpl”

#include

#include “HidlTest.h”

namespace android {

namespace hardware {

namespace hidl_test {

namespace submodule_1 {

namespace V1_0 {

namespace implementation {

// Methods from ::android::hardware::hidl_test::submodule_1::V1_0::IHidlTest follow.

Return HidlTest::justTest(const hidl_string& name, justTest_cb _hidl_cb) {

// TODO implement

ALOGD(“justTest, name = %s”, name.c_str());

_hidl_cb(name, EnumHidlTest::V_TEST2);

ALOGD(“justTest end.”);

return Void();

}

Return HidlTest::justTest1(::android::hardware::hidl_test::

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值