Android8.1 HAL层内容解析

1.简述

Android的HAL层解析,HAL层主要作用,承上启下。

1.1 向上提供标准接口(给Framework调用)

代码路径:hardware/interfaces/sensors/1.0/ISensors.hal

package android.hardware.sensors@1.0;
interface ISensors {
    getSensorsList() generates (vec<SensorInfo> list);
    setOperationMode(OperationMode mode) generates (Result result);
    activate(int32_t sensorHandle, bool enabled) generates (Result result);
    poll(int32_t maxCount) generates (
                Result result,
                vec<Event> data,
                vec<SensorInfo> dynamicSensorsAdded);
    batch(int32_t sensorHandle,
          int64_t samplingPeriodNs,
          int64_t maxReportLatencyNs) generates (Result result);
    flush(int32_t sensorHandle) generates (Result result);
    injectSensorData(Event event) generates (Result result);
    registerDirectChannel(SharedMemInfo mem)
            generates (Result result, int32_t channelHandle);
    unregisterDirectChannel(int32_t channelHandle) generates (Result result);
    configDirectReport(
            int32_t sensorHandle, int32_t channelHandle, RateLevel rate)
            generates (Result result, int32_t reportToken);
};

以上部分为固定内容。要遵循AOSP标准。 这个文件会被编译成 C++接口类 java接口类 Binder通信代码(跨进程通信)

1.2 向下对接驱动(读/dev/input/eventX)

打开设备节点 读取数据 转换单位 封装成Android需要的格式 这个部分就是厂商需要实现,放在了vendor分区。

2.整体流程

上层APP(顶层,应用使用) Framework(SensorManger、 SensorService) HAL接口层(标准、不能改) HAL实现层(Vendor分区,厂商实现) 内核驱动(/dev/input/eventX) 硬件芯片

HAL服务=将接口和实现绑定起来,供系统调用 开机后有init进程启动,运行在vendor分区。 有独立的进程:android.hardware.sensors@1.0-service

上层jave---HAL层C++---驱动c

【上层Framework
    SensorService(JAVA/C++)
        调用标准接口
HAL 接口层 *.hal
    activate()
    setCallback()
    flush()
HAL 实现层 vendor分区
    打开驱动
    读取数据
    回调给上层
【内核驱动】
    /dev/input/eventX

Framework里面的关键服务SensorService(native层C++) 代码路径:frameworks/native/services/sensorservice/SensorService.cpp 注意:旧版的Legacy HAL,和新版本的ISensors