HIDL实战开发-千里马android framework车载车技手机系统开发

平台 aosp8.1

1、创建hal文件

hardware/interfaces/hidltest/1.0/ITest.hal

package android.hardware.hidltest@1.0;
interface ITest {
	hello(string key) generates (int32_t result,string value);
};

2、生成对应的cpp文件

使用如下hidl命令:

hidl-gen -o hardware/interfaces/hidltest/1.0/default -Lc++-impl    -randroid.hardware:hardware/interfaces  android.hardware.hidltest@1.0

执行后生成如下Test.cpp,Test.h文件了

test@test:~/aosp/hardware/interfaces/hidltest$ tree
.
`-- 1.0
    |-- ITest.hal
    `-- default
        |-- Test.cpp
        `-- Test.h

2 directories, 3 files

3、生成编译hal实现代码 的Android.bp

命令:

hidl-gen -o hardware/interfaces/hidltest/1.0/default -Landroidbp-impl    -randroid.hardware:hardware/interfaces  android.hardware.hidltest@1.0

生成对于Android.bp

.
`-- 1.0
    |-- ITest.hal
    `-- default
        |-- Android.bp
        |-- Test.cpp
        `-- Test.h

// FIXME: your file license if you have one

cc_library_shared {
    name: "android.hardware.hidltest@1.0-impl",
    relative_install_path: "hw",
    // FIXME: this should be 'vendor: true' for modules that will eventually be
    // on AOSP.
    proprietary: true,
    srcs: [
        "Test.cpp",
    ],
    shared_libs: [
        "libhidlbase",
        "libutils",
        "android.hardware.hidltest@1.0",
    ],
}

4、生成一个自动生成 hal 接口的 Android.bp

(注意update-makefiles.sh 这个高版本谨慎使用,使用后注意git status看看,不要其他模块的Android.bp也修改,如果会修改其他的则不要使用,建议参考其他模块原生hidl手动加入既可以)
.
只需要在hardware/interfaces执行如下命令既可以

test@test:~/aosp/hardware/interfaces$ ./update-makefiles.sh 

`-- 1.0
    |-- Android.bp  ---自动生成的,目的是编译时候会自动把ITest.hal生成cpp
    |-- ITest.hal
    `-- default
        |-- Android.bp  ----编译cpp文件的bp
        |-- Test.cpp
        `-- Test.h

2 directories, 5 files

5、添加service.cpp,自启动rc,修改Android.bp

一般hal服务都需要开机自启动,需要有rc

service hidltest /vendor/bin/hw/android.hardware.hidltest@1.0-service
    class hal
    user  system
    group  system

上面default默认生成的bp是so,这里要把他变成可执行的服务,需要增加一个service.cpp作为main方法载体
hardware/interfaces/hidltest/1.0/default/service.cpp

#define LOG_TAG "android.hardware.hidltest@1.0-service"

#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportSupport.h>

#include "Test.h"

using ::android::OK;
using ::android::sp;
using ::android::hardware::configureRpcThreadpool;
using ::android::hardware::joinRpcThreadpool;
using ::android::hardware::hidltest::V1_0::ITest;
using ::android::hardware::hidltest::V1_0::implementation::Test;


int main(int /* argc */, char* /* argv */ []) {
    sp<ITest> hidltest = new Test;
    configureRpcThreadpool(1, true /* will join */);
    if (hidltest->registerAsService() != OK) {//注册为hwbinder的服务
        ALOGE("Could not register service.");
        return 1;
    }
    joinRpcThreadpool();

    ALOGE("Service exited!");
    return 1;
}

同时Test.cpp也要进行简单实现:
在这里插入图片描述

同时修改对于的bp文件如下:
hardware/interfaces/hidltest/1.0/default/Android.bp

cc_binary {
    name: "android.hardware.hidltest@1.0-service",
    relative_install_path: "hw",
    proprietary: true,
    init_rc: ["android.hardware.hidltest@1.0-service.rc"],
    srcs: [
        "Test.cpp",
        "service.cpp"
    ],  
    shared_libs: [
        "libhidlbase",
        "libhidltransport",
        "libutils",
	    "liblog",
        "android.hardware.hidltest@1.0",
    ],
}

6、需要搞个test,来测试一下服务是否ok,这个时候需要

在1.0 目录创建test文件夹
分别创建如下文件:

`-- test
    |-- Android.bp
    `-- HidlTest.cpp

Android.bp内容如下:

cc_binary {
    name: "HidlTestClient",
    //vendor: true,
    srcs: ["HidlTest.cpp"],

    shared_libs: [
        "liblog",
        "libhardware",
        "libhidlbase",
        "libhidltransport",
        "libutils",
        "android.hardware.hidltest@1.0",
    ],

}

HidlTest.cpp内容如下:

#include <android/hardware/hidltest/1.0/ITest.h>
#include <hidl/Status.h>
#include <utils/misc.h>
#include <hidl/HidlSupport.h>
#include <stdio.h>
#include <string>

using namespace std;

using ::android::hardware::hidl_string;
using ::android::sp;
using ::android::hardware::hidltest::V1_0::ITest;

int main(){
    android::sp<ITest> service = ITest::getService();
    if (service == nullptr){
        printf("Failed to get service\n");
        return -1;
    }
    service->hello("hello", [&](int32_t result,string value){
        printf("result %d %s\n",result, value.c_str());
    });

    return 0;
}


7.再次执行hardware/interfaces/update-makefiles.sh

只需要在hardware/interfaces执行如下命令既可以(注意这个高版本谨慎使用,使用后注意git status看看,不要其他模块的Android.bp也修改,如果会修改其他的则不要使用,建议手动加入既可以)

test@test:~/aosp/hardware/interfaces$ ./update-makefiles.sh 

主要目的是把test目录的Android.bp可以加入编译

test@test:/media/test/49a0eb6b-f410-4eed-9e0a-952e3c75d2b2/home/test/android-8.1.0_r1$ cat hardware/interfaces/hidltest/Android.bp 
// This is an autogenerated file, do not edit.
subdirs = [
    "1.0",
    "1.0/default",
    "1.0/test",
]

"1.0/test"就是新加入的,不加入编译会报错始终找不到目标

8、配置注册到manifest.xml中

需要在自己设备目录找到自己的manifest.xml然后加入自己的hidl
device/generic/goldfish/manifest.xml

      <hal format="hidl">
        <name>android.hardware.hidltest</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ITest</name>
            <instance>default</instance>
        </interface>

9、selinux相关适配

这个相对比较复杂一点
在这里插入图片描述

10、测试验证

检查是否hidltest服务自启动进程运行着

generic_x86_64:/ # ps -A | grep hidltest
system        1381     1   12276   4152 binder_thread_read 7eab08d0c2b7 S android.hardware.hidltest@1.0-service

检测到确实有运hidltest行

检测一下是否有system可以与其正常通讯

generic_x86_64:/ # /system/bin/HidlTestClient                                                                                                                                                             
result 1 test ok

可以看到有正常返回正确的值

本文章对应视频手把手教你学framework:
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
获取优惠,私聊作者公众号文章获取方式
点击这里 https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频:https://www.bilibili.com/video/BV1Jg4y1C7fw/
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值