Android P HAL层添加HIDL实例

简介: Android P HAL层添加HIDL实例

从 Android 10 开始,HIDL 已废弃,Android 将在所有位置改用 AIDL。

一、准备工作

  1. 整套源码,Android S的
  2. 保证全套代码已经全编译,原生代码全编译命令
  • source build/envset.sh
  • lunch
  • make

  3、hidl-gen工具已经安装,安装命令

  • make hidl-gen

二、项目实例

1、在hardware/interfaces/目录下新建 test/1.0目录,并在1.0目录中创建接口ITest.hal。目录结构如下

ITest.hal文件里面只有一个接口ITest和一个方法helloWorld(string name),具体实现如下:

package android.hardware.test@1.0;
 
interface ITest{
  helloWorld(string name) generates (string result);
};

2、在源码根路径执行下面三条命令会自动生成对应的c++文件;

PACKAGE=android.hardware.test@1.0

LOC=hardware/interfaces/test/1.0/default/

hidl-gen -o $LOC -Lc++-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

对应的 目录结构如下

default 是新生成的目录,Test.cpp和Test.h是新生成的两个文件,打开Test.h文件,去掉// extern "C" IGunder* HIDL_FETCH_ITest(const char* name);前面的注释,使用直通式HAL(Passthrough 模式)来通信

Test.cpp文件也要进行对应的修改,修改后如图所示

3、执行下面命令

hidl-gen -o $LOC -Landroidbp-impl -randroid.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport $PACKAGE

会在hardware/interfaces/test/1.0/default目录生成Android.bp文件。

4、然后使用脚本update-makefiles.sh来更新Makefile,自动在hardware/interfaces/test/1.0目录生成 Android.bp。命令如下

./hardware/interfaces/update-makefiles.sh

5.在hardware/interfaces/test/1.0/default目录下新建service.cpp跟android.hardware.test@1.0-service.rc,其中android.hardware.test@1.0-service.rc是程序的入口函数

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

6.新建service.cpp 这里使用绑定式 直通式为注释部分

#define LOG_TAG "android.hardware.test@1.0-service"
#include <android-base/logging.h>
#include <hidl/HidlTransportSupport.h>
#include <android/hardware/test/1.0/ITest.h>
 
#include <hidl/LegacySupport.h>
#include "Test.h"
using android::hardware::configureRpcThreadpool;
using android::hardware::joinRpcThreadpool;
using android::hardware::test::V1_0::implementation::Test;
//using android::hardware::defaultPassthroughServiceImplementation;
//passthrough mode
 
int main() {
  configureRpcThreadpool(4, true);
 
    Test test;
    auto status = test.registerAsService();
    CHECK_EQ(status, android::OK) << "Failed to register test HAL implementation";
 
    joinRpcThreadpool();
    return 0;  // joinRpcThreadpool shouldn't exit
 //   return defaultPassthroughServiceImplementation<ITest>();
 //passthrough mode
}

7.修改default下的Android.bp,添加 service的编译规则

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

调用 update-makefiles.sh更新一下然后单编测试一下

mmm ./hardware/interfaces/test/1.0

Android


目录
相关文章
|
6月前
|
Android开发
Android应用实例(一)之---有道辞典VZ.0
Android应用实例(一)之---有道辞典VZ.0
42 2
|
4月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
5月前
|
安全 Java Android开发
使用Unidbg进行安卓逆向实例讲解
使用Unidbg进行安卓逆向实例讲解
130 2
|
6月前
|
安全 Android开发
Android HAL 层
Android HAL 层
52 1
|
6月前
|
编解码 调度 Android开发
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置
627 0
|
6月前
|
Android开发
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。 【5月更文挑战第2天】
287 0
|
6月前
|
Android开发 C++
Android S HAL库的编译
Android S HAL库的编译
72 0
|
6月前
|
Java Android开发
Android HIDL客户端构建
Android HIDL客户端构建
46 0
|
6月前
|
前端开发 Java 编译器
Android HAL深入探索(7)hidl-gen和hidl2aidl的使用详解
Android HAL深入探索(7)hidl-gen和hidl2aidl的使用详解
910 0
|
6月前
|
编解码 监控 API
Android HAL深入探索(6): HIDL 添加SELinux 完整调试过程
Android HAL深入探索(6): HIDL 添加SELinux 完整调试过程
938 0