天天看點

android sensor 指令,解析 Android 5.1 Sensor HAL

by WEN Pingbo of TinyLab.org

2015/03/11

預熱

前幾天研究了 Android 5.1 相對于 Android 4.4,Sensor HAL 做了什麼改動。然後就有了這篇文章。

首先,怎麼知道 Android 5.1 對 Sensor HAL 改了什麼東西呢?其實隻要運作了一下如下指令:diff -u /path/to/android_5.1/hardware/libhardware/include/hardware/sensors.h \

/path/to/android_4.4/hardware/libhardware/include/hardware/sensors.h

估計都懂了。

Android 5.1 Sensor HAL

好!進入正題!

一起來看看 Android 5.1 Sensor HAL 到底 引入了哪些變更?

更新 API Version 到 1.3

這次 Android 5.1 的更新,首先帶來的就是 API Version 的更新。Anroid 4.4 用的是 1.1 的 API,到了 Android 5.1,改用 1.3 了。

新增 Flag:SENSOR_FLAG_WAKE_UP

其次,是增加了 SENSOR_FLAG_WAKE_UP 這個FLAG。帶有 Wake Up Flag 的 Sensor,在有事件上報,或者 FIFO 滿了的時候,都需要喚醒 AP。而非 Wake Up Sensor,則隻能把資料存在 FIFO 中,而不能喚醒 AP,若 FIFO 滿了,則覆寫。根據 Android 的描述,帶有這個 Flag 的 Sensor,在資料上報時,驅動中需要保持一個 wake_lock。等 SensorService 把資料讀回後,驅動釋放 wake_lock,SensorService 會保持一個 wake_lock,讓上層 APP 有時間處理這個事件。

同時在 Sensor HAL 這邊,對于一個 Sensor 來說,它可以同時聲明兩個 Sensor Type,一個帶 WAKE FLAG,另外一個不帶。比如我們可以在寫 Sensor List 的時候,做如下定義:static struct sensor_t baseSensorList[] = {

{

"XXX Gyroscope", "XXX", 1,

SENSORS_GYROSCOPE_HANDLE,

SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, 0, 62,

"android.sensor.gyroscope", "", 10000, SENSOR_FLAG_CONTINUOUS_MODE, {}

},

{

"XXX Gyroscope - Wakeup", "XXX", 1,

SENSORS_GYROSCOPE_WAKEUP_HANDLE,

SENSOR_TYPE_GYROSCOPE, 2000.0f, 1.0f, 0.5f, 10000, 0, 62,

"android.sensor.gyroscope", "", 10000, SENSOR_FLAG_CONTINUOUS_MODE | SENSOR_FLAG_WAKE_UP, {}

},

};

然後把這兩個 Sensor 當做兩個不同的 Sensor 去實作其 handler。這樣,上層 APP 在用 SensorManger::getDefaultSensor (int type, boolean wakeUp) 來擷取 Sensor 時,就可以指定是否帶 Wake Up Flag。

這裡要注意的是,一定要慎重選擇是否帶 Wake Up Flag,因為這對手機功耗有很大的影響。估計很多 OEM 廠商會在這個地方優化,不會任由上層 APP 去擷取帶 Wake Up Flag 的 Sensor。

struct sensor_t 新增三字段

第三,Android 5.1 在 struct sensor_t 添加了3個新的字段:const char* stringType;

const char* requiredPermission;

uint64_t flags;

Android 規定,若 Sensor 的 Type 不是 Android 所支援的類型,則 stringType 不能是 "android.sensor.*",這個字段應該是由于 Wake Up Flag 的加入,才添加進來,用來表示一個類的 Sensor。而對于 requiredPermission,暫時還沒搞清楚這麼個用法。flags 字段當然是用來放 Sensor 的 Mode 啦。

新增了 9 個 Sensor Type

最後一個改動,Android 5.1 添加了很多新類型的 Sensor:SENSOR_TYPE_HEART_RATE

SENSOR_TYPE_TILT_DETECTOR

SENSOR_TYPE_WAKE_GESTURE

SENSOR_TYPE_GLANCE_GESTURE

SENSOR_TYPE_PICK_UP_GESTURE

SENSOR_TYPE_IN_POCKET

SENSOR_TYPE_ACTIVITY

SENSOR_TYPE_FACE_DOWN

SENSOR_TYPE_SHAKE

每個 Sensor 具體的實作就不說了。但有一點疑問,就是完全不懂 Android 到底要幹嘛。有些 Sensor,完全可以合并在一起,像 TILT, GLANCE, PICK_UP 和 SHAKE完全屬于 GESTURE 範疇,IN_POCKET,FACE_DOWN,ACTIVITY 也是手機 STATE 範疇。而 WAKE_GESTURE 更加模糊,把很多 Sensor 廠商都搞懵了,這個 WAKE_GESUTRE 好像包含了其他那些 GESTURE。按這種邏輯,估計要不了多久,Android 的 Sensor 類型就會爆炸了。