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

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

.
只需要在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;//注意这些导入的都是靠hal文件编译自动生成的


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;
}

同时修改对于的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执行如下命令既可以

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相关适配

这个相对比较复杂一点


1.png

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
私聊作者+v(androidframework007)
点击这里 https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw
视频:https://www.bilibili.com/video/BV1Jg4y1C7fw/

6.png

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容