命令:
dumpsys sensorservice
1.dumpsys sensorservice查看最近申请记录
dumpsys sensorservice命令输出Previous Registrations.
Previous Registrations:
23:07:43 + 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity samplingPeriod=66667us batchingPeriod=0us
23:07:41 - 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity
23:07:01 + 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity samplingPeriod=66667us batchingPeriod=0us
23:06:48 - 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity
23:06:47 + 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity samplingPeriod=66667us batchingPeriod=0us
23:06:15 - 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity
23:06:13 + 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity samplingPeriod=66667us batchingPeriod=0us
23:06:11 - 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity
23:06:11 + 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity samplingPeriod=66667us batchingPeriod=0us
21:19:08 - 0x00000001 pid= 3725 uid=10372 package=org.qiyi.basecore.widget.shakeguide.b
21:19:05 - 0x00000001 pid= 3725 uid=10372 package=org.qiyi.basecore.widget.shakeguide.b
21:19:05 + 0x00000001 pid= 3725 uid=10372 package=org.qiyi.basecore.widget.shakeguide.b samplingPeriod=200000us batchingPeriod=0us
21:19:03 + 0x00000001 pid= 3725 uid=10372 package=org.qiyi.basecore.widget.shakeguide.b samplingPeriod=200000us batchingPeriod=0us
21:18:28 - 0x00000001 pid=22095 uid=10339 package=dib.a
以上输出可以看出最近申请sensor的记录的PID, UID, 以及访问的组件package, 以及访问的sensor handle.
2.dumpsys sensorservice查看设备中所有的sensor信息
Sensor Device:
Total 6 h/w sensors, 6 running 0 disabled clients:
0x00000001) active-count = 1; sampling_period(ms) = {200.0}, selected = 200.00 ms; batching_period(ms) = {2000.0}, selected = 2000.00 ms
0x00000005) active-count = 2; sampling_period(ms) = {1000.0, 200.0}, selected = 200.00 ms; batching_period(ms) = {0.0, 0.0}, selected = 0.00 ms
0x00000008) active-count = 1; sampling_period(ms) = {66.7}, selected = 66.67 ms; batching_period(ms) = {0.0}, selected = 0.00 ms
Sensor List:
0x00000001) ACCELEROMETER | stk8ba58 | ver: 1 | type: android.sensor.accelerometer(1) | perm: n/a | flags: 0x00000000
continuous | minRate=1.00Hz | maxRate=100.00Hz | no batching | non-wakeUp |
0x00000002) MAGNETOMETER | MTK | ver: 1 | type: android.sensor.magnetic_field(2) | perm: n/a | flags: 0x00000000
continuous | minRate=5.00Hz | maxRate=50.00Hz | FIFO (max,reserved) = (4500, 600) events | non-wakeUp |
0x00000003) ORIENTATION | MTK | ver: 1 | type: android.sensor.orientation(3) | perm: n/a | flags: 0x00000000
continuous | minRate=50.00Hz | maxRate=200.00Hz | no batching | non-wakeUp |
0x00000005) LIGHT | MTK | ver: 1 | type: android.sensor.light(5) | perm: n/a | flags: 0x00000002
on-change | minRate=1.00Hz | minDelay=0us | no batching | non-wakeUp |
0x00000008) PROXIMITY | MTK | ver: 1 | type: android.sensor.proximity(8) | perm: n/a | flags: 0x00000003
on-change | minRate=1.00Hz | minDelay=0us | FIFO (max,reserved) = (4500, 100) events | wakeUp |
0x0000001b) DEVICE_ORIENTATION | MTK | ver: 1 | type: android.sensor.device_orientation(27) | perm: n/a | flags: 0x00000002
on-change | minRate=1.00Hz | minDelay=0us | no batching | non-wakeUp |
0x5f67656f) GeoMag Rotation Vector Sensor | AOSP | ver: 3 | type: android.sensor.geomagnetic_rotation_vector(20) | perm: n/a | flags: 0x00000000
continuous | maxDelay=0us | maxRate=100.00Hz | no batching | non-wakeUp |
Fusion States:
从以上可知,本机一共有6个sensor, 被禁的为0.
Total 6 h/w sensors, 6 running 0 disabled clients:
其中每条输出内容如下:
以light-sensor为例,
0x00000005) LIGHT | MTK | ver: 1 | type: android.sensor.light(5) | perm: n/a | flags: 0x00000002
on-change | minRate=1.00Hz | minDelay=0us | no batching | non-wakeUp |
其输出的对应的各个字段声明如下:
- 0x00000005 // handle that identifies this sensors. 唯一标识符.
- MTK // sensor制造商Mediatek
- ver:1 //表示版本号
- type:android.sensor.light(5) // 表示light type sensor
- perm:n/a // 需要的访问权限,n/a表示无.
- flags:0x00000002 // 2表示上报方式是on_change.
- on-change //表示sensor数据发生变化才触发listener回调.
- non-wakeUp // 表示此sensor非wake up型sensor. 即light-sensor不会因为光线变化数据变化而主动唤醒屏幕.
http://aospxref.com/android-14.0.0_r2/xref/hardware/libhardware/include/hardware/sensors.h
文件中的sensor_t 结构体.
struct sensor_t {
/* Name of this sensor.
* All sensors of the same "type" must have a different "name".
*/
const char* name;
/* vendor of the hardware part */
const char* vendor;
/* version of the hardware part + driver. The value of this field
* must increase when the driver is updated in a way that changes the
* output of this sensor. This is important for fused sensors when the
* fusion algorithm is updated.
*/
int version;
/* handle that identifies this sensors. This handle is used to reference
* this sensor throughout the HAL API.
*/
int handle;
/* this sensor's type. */
int type;
/* maximum range of this sensor's value in SI units */
float maxRange;
/* smallest difference between two values reported by this sensor */
float resolution;
/* rough estimate of this sensor's power consumption in mA */
float power;
/* this value depends on the reporting mode:
*
* continuous: minimum sample period allowed in microseconds
* on-change : 0
* one-shot :-1
* special : 0, unless otherwise noted
*/
int32_t minDelay;
/* number of events reserved for this sensor in the batch mode FIFO.
* If there is a dedicated FIFO for this sensor, then this is the
* size of this FIFO. If the FIFO is shared with other sensors,
* this is the size reserved for that sensor and it can be zero.
*/
uint32_t fifoReservedEventCount;
/* maximum number of events of this sensor that could be batched.
* This is especially relevant when the FIFO is shared between
* several sensors; this value is then set to the size of that FIFO.
*/
uint32_t fifoMaxEventCount;
/* type of this sensor as a string.
*
* If type is OEM specific or sensor manufacturer specific type
* (>=SENSOR_TYPE_DEVICE_PRIVATE_BASE), this string must be defined with reserved domain of
* vendor/OEM as a prefix, e.g. com.google.glass.onheaddetector
*
* For sensors of Android defined types, Android framework will override this value. It is ok to
* leave it pointing to an empty string.
*/
const char* stringType;
/* permission required to see this sensor, register to it and receive data.
* Set to "" if no permission is required. Some sensor types like the
* heart rate monitor have a mandatory require_permission.
* For sensors that always require a specific permission, like the heart
* rate monitor, the android framework might overwrite this string
* automatically.
*/
const char* requiredPermission;
/* This value is defined only for continuous mode and on-change sensors. It is the delay between
* two sensor events corresponding to the lowest frequency that this sensor supports. When lower
* frequencies are requested through batch()/setDelay() the events will be generated at this
* frequency instead. It can be used by the framework or applications to estimate when the batch
* FIFO may be full.
*
* NOTE: 1) period_ns is in nanoseconds where as maxDelay/minDelay are in microseconds.
* continuous, on-change: maximum sampling period allowed in microseconds.
* one-shot, special : 0
* 2) maxDelay should always fit within a 32 bit signed integer. It is declared as 64 bit
* on 64 bit architectures only for binary compatibility reasons.
* Availability: SENSORS_DEVICE_API_VERSION_1_3
*/
#ifdef __LP64__
int64_t maxDelay;
#else
int32_t maxDelay;
#endif
/* Flags for sensor. See SENSOR_FLAG_* above. Only the least significant 32 bits are used here.
* It is declared as 64 bit on 64 bit architectures only for binary compatibility reasons.
* Availability: SENSORS_DEVICE_API_VERSION_1_3
*/
#ifdef __LP64__
uint64_t flags;
#else
uint32_t flags;
#endif
/* reserved fields, must be zero */
void* reserved[2];
};
struct sensor_t结构体的数据对接HAL层的SensorInfo的结构体, 数据来源于HAL层的注册.
http://aospxref.com/android-14.0.0_r2/xref/hardware/interfaces/sensors/1.0/types.hal
struct SensorInfo {
/**
* handle that identifies this sensors. This handle is used to reference
* this sensor throughout the HAL API.
*/
int32_t sensorHandle;
/**
* Name of this sensor.
* All sensors of the same "type" must have a different "name".
*/
string name;
/** vendor of the hardware part */
string vendor;
/**
* version of the hardware part + driver. The value of this field
* must increase when the driver is updated in a way that changes the
* output of this sensor. This is important for fused sensors when the
* fusion algorithm is updated.
*/
int32_t version;
/** this sensor's type. */
SensorType type;
/**
* type of this sensor as a string.
*
* When defining an OEM specific sensor or sensor manufacturer specific
* sensor, use your reserve domain name as a prefix.
* e.g. com.google.glass.onheaddetector
*
* For sensors of known type defined in SensorType (value <
* SensorType::DEVICE_PRIVATE_BASE), this can be an empty string.
*/
string typeAsString;
/** maximum range of this sensor's value in SI units */
float maxRange;
/** smallest difference between two values reported by this sensor */
float resolution;
/** rough estimate of this sensor's power consumption in mA */
float power;
/**
* this value depends on the reporting mode:
*
* continuous: minimum sample period allowed in microseconds
* on-change : 0
* one-shot :-1
* special : 0, unless otherwise noted
*/
int32_t minDelay;
/**
* number of events reserved for this sensor in the batch mode FIFO.
* If there is a dedicated FIFO for this sensor, then this is the
* size of this FIFO. If the FIFO is shared with other sensors,
* this is the size reserved for that sensor and it can be zero.
*/
uint32_t fifoReservedEventCount;
/**
* maximum number of events of this sensor that could be batched.
* This is especially relevant when the FIFO is shared between
* several sensors; this value is then set to the size of that FIFO.
*/
uint32_t fifoMaxEventCount;
/**
* permission required to see this sensor, register to it and receive data.
* Set to "" if no permission is required. Some sensor types like the
* heart rate monitor have a mandatory require_permission.
* For sensors that always require a specific permission, like the heart
* rate monitor, the android framework might overwrite this string
* automatically.
*/
string requiredPermission;
/**
* This value is defined only for continuous mode and on-change sensors.
* It is the delay between two sensor events corresponding to the lowest
* frequency that this sensor supports. When lower frequencies are requested
* through batch()/setDelay() the events will be generated at this frequency
* instead.
* It can be used by the framework or applications to estimate when the
* batch FIFO may be full.
*
* NOTE: periodNs is in nanoseconds where as maxDelay/minDelay are in
* microseconds.
*
* continuous, on-change: maximum sampling period allowed in
* microseconds.
*
* one-shot, special : 0
*/
int32_t maxDelay;
/** Bitmask of SensorFlagBits */
bitfield<SensorFlagBits> flags;
};
以上dump输出对应代码:
/android-14.0.0_r2/xref/frameworks/native/services/sensorservice/SensorList.cpp
3.当前正在被访问的sensor
Active sensors:
ACCELEROMETER (handle=0x00000001, connections=1)
LIGHT (handle=0x00000005, connections=2)
PROXIMITY (handle=0x00000008, connections=1)
Socket Buffer size = 984 events
WakeLock Status: not held
Mode : NORMAL
Sensor Privacy: disabled
4 active connections
Connection Number: 0
Operating Mode: NORMAL
c.d.a.b.b | WakeLockRefCount 0 | uid 1000 | cache size 0 | max cache size 0
LIGHT 0x00000005 | status: active | pending flush events 0
Connection Number: 1
Operating Mode: NORMAL
com.android.server.power.FaceDownDetector | WakeLockRefCount 0 | uid 1000 | cache size 0 | max cache size 0
ACCELEROMETER 0x00000001 | status: active | pending flush events 0
Connection Number: 2
Operating Mode: NORMAL
com.xsq.server.display.XsqWidgetObserver | WakeLockRefCount 0 | uid 1000 | cache size 0 | max cache size 0
LIGHT 0x00000005 | status: active | pending flush events 0
Connection Number: 3
Operating Mode: NORMAL
com.start.testdemo.ui.udfp.fql.XsqFQLActivity | WakeLockRefCount 0 | uid 10397 | cache size 0 | max cache size 0
PROXIMITY 0x00000008 | status: active | pending flush events 0
0 direct connections
从以上可知,在执行dumpsys sensorservice时刻,有三个sensor正在被监听工作状态.
其中Proximity-sensor正在被自写的测试APP(com.start.testdemo)持有.
4.Psensor PROXIMITY_SCREEN_OFF_WAKE_LOCK用法
自研程序可以通过申请PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK来实现亮灭屏.
demo
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.udfp_quick_launch_layout);
PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (powerManager.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK)) {
// 可以控制屏幕亮灭,只是关闭屏幕背光,不会导致PowerManagerService和通知PhoneWindowManager进行锁屏通知
mProximitySensorWakeLock = powerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "SensorTestActivity:mProximitySensorWakeLock");
}
}
private PowerManager.WakeLock mProximitySensorWakeLock;
private void enableProximitySensor() {
if (null == mProximitySensorWakeLock) {
return;
}
if (!mProximitySensorWakeLock.isHeld()) {
Log.d(TAG, "enableProximitySensor: acquiring proximity wake lock");
mProximitySensorWakeLock.acquire();
} else {
Log.d(TAG, "enableProximitySensor: proximity sensor is held.");
}
}
private void disableProximitySensor() {
if (null == mProximitySensorWakeLock) {
return;
}
if (mProximitySensorWakeLock.isHeld()) {
Log.d(TAG, "disableProximitySensor: release proximity wake lock");
mProximitySensorWakeLock.release(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK);
}
}
这里需要注意,申请该WAKE_LOCK的黑屏仅仅是关闭屏幕背光,并不会直接通知PowerManager和Keyguard去上锁屏幕.
其申请sensor的角色也变成了System_server中的DisplayPowerController.
Previous Registrations:
00:11:02 + 0x00000008 pid= 1351 uid= 1000 package=com.android.server.display.DisplayPowerController samplingPeriod=200000us batchingPeriod=0us
00:09:15 - 0x00000008 pid=16587 uid=10397 package=com.start.testdemo.ui.udfp.fql.XsqFQLActivity
4 active connections
Connection Number: 0
Operating Mode: NORMAL
com.android.server.display.DisplayPowerController | WakeLockRefCount 0 | uid 1000 | cache size 0 | max cache size 0
PROXIMITY 0x00000008 | status: active | pending flush events 0