2. 实现传感器列表查询

任务目标

在Android传感器HAL层实现get_sensors_list函数,返回预定义的传感器列表(加速度计、陀螺仪、磁力计),并通过上层Service调用验证列表内容与数量正确。

实现方案

本案例采用标准Android Sensors HAL 1.0接口规范,实现sensors_module_t结构体中的get_sensors_list回调。该函数通过输出参数返回静态定义的传感器数组及数量。上层通过SensorManager.getSensorList()调用,经JNI与HAL层交互完成验证。

关键完整代码

// sensors_hal.c - 传感器HAL层实现
#include <hardware/hardware.h>
#include <hardware/sensors.h>

// 定义三个预置传感器:加速度计、陀螺仪、磁力计
static struct sensor_t sensor_list[] = {
    {
        .name = "ACCELEROMETER",
        .vendor = "AOSP",
        .version = 1,
        .handle = SENSORS_ACCELERATION_HANDLE,
        .type = SENSOR_TYPE_ACCELEROMETER,
        .maxRange = 39.24f,
        .resolution = 0.01f,
        .power = 0.5f,
        .minDelay = 5000,
        .fifoReservedEventCount = 0,
        .fifoMaxEventCount = 0,
        .stringType = SENSOR_STRING_TYPE_ACCELEROMETER,
        .requiredPermission = "",
        .maxDelay = 200000,
        .flags = SENSOR_FLAG_CONTINUOUS_MODE,
    },
    {
        .name = "GYROSCOPE",
        .vendor = "AOSP",
        .version = 1,
        .handle = SENSORS_GYROSCOPE_HANDLE,
        .type = SENSOR_TYPE_GYROSCOPE,
        .maxRange = 34.91f,
        .resolution = 0.001f,
        .power = 0.6f,
        .minDelay = 5000,
        .fifoReservedEventCount = 0,
        .fifoMaxEventCount = 0,
        .stringType = SENSOR_STRING_TYPE_GYROSCOPE,
        .requiredPermission = "",
        .maxDelay = 200000,
        .flags = SENSOR_FLAG_CONTINUOUS_MODE,
    },
    {
        .name = "MAGNETIC_FIELD",
        .vendor = "AOSP",
        .version = 1,
        .handle = SENSORS_MAGNETIC_FIELD_HANDLE,
        .type = SENSOR_TYPE_MAGNETIC_FIELD,
        .maxRange = 2000.0f,
        .resolution = 0.01f,
        .power = 0.5f,
        .minDelay = 5000,
        .fifoReservedEventCount = 0,
        .fifoMaxEventCount = 0,
        .stringType = SENSOR_STRING_TYPE_MAGNETIC_FIELD,
        .requiredPermission = "",
        .maxDelay = 200000,
        .flags = SENSOR_FLAG_CONTINUOUS_MODE,
    }
};

static int get_sensors_list(struct sensors_module_t *module,
                            struct sensor_t const **list) {
    *list = sensor_list;
    return sizeof(sensor_list) / sizeof(sensor_list[0]);
}

static struct hw_module_methods_t sensors_methods = {
    .open = NULL  // 本案例仅验证列表查询,open不涉及
};

struct sensors_module_t HAL_MODULE_INFO_SYM = {
    .common = {
        .tag = HARDWARE_MODULE_TAG,
        .module_api_version = SENSORS_MODULE_API_VERSION_1_0,
        .hal_api_version = HARDWARE_HAL_API_VERSION,
        .id = SENSORS_HARDWARE_MODULE_ID,
        .name = "AOSP Sensors HAL",
        .author = "AOSP",
        .methods = &sensors_methods,
    },
    .get_sensors_list = get_sensors_list,
};

编译与部署

# 在Android源码树中编译HAL模块
mmm hardware/libhardware/modules/sensors/

# 将生成的so文件推送到设备
adb root
adb remount
adb push out/target/product/<device>/system/lib/hw/sensors.<device>.so /system/lib/hw/
adb reboot

上层验证方法

编写一个简单的Android应用或使用adb shell命令验证传感器列表:

// 在应用或测试代码中执行
SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ALL);
for (Sensor s : sensors) {
    Log.d("SensorTest", "name=" + s.getName() + ", type=" + s.getType());
}

验证判定标准

  • 日志中输出3条传感器记录,名称分别为ACCELEROMETER、GYROSCOPE、MAGNETIC_FIELD
  • 每个传感器的type值分别为1(加速度计)、4(陀螺仪)、2(磁力计)
  • 使用adb shell dumpsys sensorservice可看到对应传感器注册信息

预期输出

D/SensorTest: name=ACCELEROMETER, type=1
D/SensorTest: name=GYROSCOPE, type=4
D/SensorTest: name=MAGNETIC_FIELD, type=2
说明:上述输出为代码逻辑直接推出的确定性结果,非实测数据。实际运行需在真实设备或模拟器上执行验证。