Android HIDL接口添加

一.HIDL介绍

HIDL的全称是HAL interface definition language(硬件抽象层接口定义语言),是Android

Framework 与Android HAL之间的接口。HIDL 旨在用于进程间通信 (IPC),进程之间的通信

采用 Binder 机制。

二.HIDL 与AIDL 的对比

三.HIDL接口添加

HIDL接口路径:

复制代码
hardware\interfaces\imw\1.0\

路径下有两个文件:

复制代码
Android.bp

IImwManager.hal

Android.bp:

复制代码
hidl_interface {
    name: "[email protected]",  //FQName 的全名
    root: "vendor.isolution.hardware",  //定义好的 package root name
    //system_ext_specific: true,
    srcs: [
        "IImwManager.hal",
       
    ],
    interfaces: [
        "[email protected]", //编译过程中依赖的接口名称
    ],
    gen_java: true,  //是否编译为 Java 使用的接口
}

IImwManager.hal文件:

复制代码
package [email protected]; // 当前package包名
 
import IImwManagerClientCallback;  // 导入其它package包
import IUpdateEngineClientCallback;

interface IImwManager   // 定义一个interface
{
	onCreate();
	onInitStart();
	onInitCompleted();
	onStart();
	onSystemAppStart();
	onBootanimationExit();
	onBootCompleted();
	onReboot();
	onRecovery();
	onSleep();
	onShutdown();

};

HIDL生成的文件路径:

复制代码
/out/soong/.intermediates/vendor/isolution/hardware/interfaces/imw/1.0/[email protected]

编译后模块对应的文件:

复制代码
[email protected]

当 IHelloworld.hal 创建完成就可以创建对应的 HIDL 实现代码(Hidl Interface 和 service):

service.端java代码:

复制代码
import vendor.isolution.hardware.imw.V1_0.IImwManager; // 导入package包

private IImwManager halManager = null;

halManager.onCreate();
halManager.onInitStart();
halManager.onInitCompleted();
halManager.onStart();
halManager.onSystemAppStart();
halManager.onBootanimationExit();
halManager.onBootCompleted();
halManager.onReboot();
halManager.onRecovery();
halManager.onSleep();
halManager.onShutdown();

实现Hidl Interface:

hardware\interfaces\imw\1.0\default\ImwManager.h

复制代码
#ifndef VENDOR_ISOLUTION_HARDWARE_IMW_V1_0_IMWMANAGER_H_
#define VENDOR_ISOLUTION_HARDWARE_IMW_V1_0_IMWMANAGER_H_

#include <log/log.h>
#include <android/log.h>
#include <hardware/hardware.h>
#include <hardware/fingerprint.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>

#include <vendor/isolution/hardware/imw/1.0/IImwManager.h>

using ::vendor::isolution::hardware::imw::V1_0::IImwManager;
using ::android::hardware::Return;
using ::android::hardware::Void;
using ::android::hardware::hidl_vec;
using ::android::hardware::hidl_string;
using ::android::sp;

namespace vendor {
namespace isolution {
namespace hardware {
namespace imw {
namespace V1_0 {
namespace implementation {

struct ImwManager : public IImwManager {

public:
    ImwManager();
    ~ImwManager();
	
    static IImwManager* getInstance();
	Return<void> setNotify(const sp<IImwManagerClientCallback>& clientCallback) override;
	Return<void> setNotifyUpdateEngine(const sp<IUpdateEngineClientCallback>& clientCallback) override;

	Return<void> onCreate() override;
    Return<void> onInitStart() override;
    Return<void> onInitCompleted() override;
    Return<void> onStart() override;
	Return<void> onSystemAppStart() override;
	Return<void> onBootanimationExit() override;
    Return<void> onBootCompleted() override;
	Return<void> onReboot() override;
	Return<void> onRecovery() override;
	Return<void> onSleep() override;
    Return<void> onShutdown() override;
};

}  // namespace implementation
}  // namespace V1_0
}  // namespace imw
}  // namespace hardware
}  // namespace isolution
}  // namespace vendor

hardware\interfaces\imw\1.0\default\ImwManager.cpp

复制代码
#include <utils/Log.h>

#include <log/log.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>
#include <cutils/atomic.h>
#include <cutils/properties.h> // for property_get
#include <utils/misc.h>
#include <stdio.h>
#include <utils/threads.h>

#include <fcntl.h>
#include <dlfcn.h>
#include <sys/shm.h>
#include <signal.h>

#include "ImwManager.h"

namespace vendor {
namespace isolution {
namespace hardware {
namespace imw {
namespace V1_0 {
namespace implementation {

ImwManager::ImwManager() : mClientCallback(nullptr) {
    sInstance = this; // keep track of the most recent instance
	onCreate();
}


ImwManager::~ImwManager()
{
    ALOGW("~ImwManager\n");
}

IImwManager* ImwManager::getInstance() {
    if (!sInstance) {
      sInstance = new ImwManager();
    }
    return sInstance;
}

Return<void> ImwManager::onCreate()
{
    ALOGW("onCreate\n");
	
	return Void();
}

Return<void> ImwManager::onInitStart()
{
    ALOGW("onInitStart\n");
	return Void();
}

Return<void> ImwManager::onInitCompleted()
{
    ALOGW("onInitCompleted\n");
	return Void();
}

Return<void> ImwManager::onStart()
{
    ALOGW("onStart\n");
	return Void();
}

Return<void> ImwManager::onSystemAppStart()
{
    ALOGW("onSystemAppStart\n");
	return Void();
}

Return<void> ImwManager::onBootanimationExit()
{
    ALOGW("onBootanimationExit\n");
	return Void();
}

Return<void> ImwManager::onBootCompleted()
{
    ALOGW("onBootCompleted\n");
	return Void();
}

Return<void> ImwManager::onReboot()
{
    ALOGW("onReboot\n");
	return Void();
}

Return<void> ImwManager::onRecovery()
{
    ALOGW("onRecovery\n");
	return Void();
}

Return<void> ImwManager::onSleep()
{
    ALOGW("onSleep\n");
	return Void();
}

Return<void> ImwManager::onShutdown()
{
    ALOGW("onShutdown\n");
	return Void();
}

ImwManager *ImwManager::sInstance = nullptr;

}  // namespace implementation
}  // namespace V1_0
}  // namespace imw
}  // namespace hardware
}  // namespace isolution
}  // namespace vendor

添加rc文件:

rc 是 "runcom" 的缩写,这个术语最初来源于 Unix 系统,在早期的系统中使用了一个叫做 "runcom" 的目录,用于存放启动时需要运行的一些脚本和配置文件。

在实现了 serivce 和 impl 代码后需要添加 rc 文件,文件名为 [email protected]

复制代码
service imw-hal-1-0 /vendor/bin/hw/[email protected]
    class hal
    user root
    group root media system graphics input bluetooth shell drmrpc media_rw audio
相关推荐
居然是阿宋17 分钟前
Kotlin高阶函数 vs Lambda表达式:关键区别与协作关系
android·开发语言·kotlin
凉、介30 分钟前
PCI 总线学习笔记(五)
android·linux·笔记·学习·pcie·pci
小贾要学习2 小时前
【C++】继承----下篇
android·java·c++
投笔丶从戎3 小时前
Kotlin Multiplatform--01:项目结构基础
android·开发语言·kotlin
Lary_Rock4 小时前
Android 编译问题 prebuilts/clang/host/linux-x86
android·linux·运维
王江奎5 小时前
Android FFmpeg 交叉编译全指南:NDK编译 + CMake 集成
android·ffmpeg
limingade5 小时前
手机打电话通话时如何向对方播放录制的IVR引导词声音
android·智能手机·蓝牙电话·手机提取通话声音
hepherd6 小时前
Flutter 环境搭建 (Android)
android·flutter·visual studio code
_一条咸鱼_7 小时前
揭秘 Android ListView:从源码深度剖析其使用原理
android·面试·android jetpack