Android L版本上指南针apk读取不到sensor数据的原因分析
时间:10-02
整理:3721RD
点击:
[DESCRIPTION]
在android L版本上对于msensor来说,常见的不良现象有下面两种:
(1)msensor无数据;
(2)指南针apk读取不到sensor数据.
下面给出这两种现象的可能的主要原因分析。
[SOLUTION]
原因一:gsensor工作不正常
(1)check 方法:通过sensor 相关apk查看是否能读取到gsensor数据,数据是否正常;
原因二:msensor 驱动加载失败
(1)check方法:通过adb 命令访问文件夹 /sys/bus/platform/drivers/msensor ,看其中是否有节点存在,并且有数据能够cat到;
ex:adb shell cat /sys/bus/platform/drivers/msensor/daemon
原因三:selinux权限的原因导致msensor daemon启动失败
(1)check方法:
a)在adb 中通过ps命令查看daemon 进程是否在运行
b)在开机的UART log和mtklog中搜索selinux的log,关键字“avc: denied” ;
ex: w<12>[ 28.713710].(1)[1:init]avc: denied { set } for property=ctl.akmd09911 scontext=u:r:msensord:s0 tcontext=ubject_r:ctl_default_prop:s0 tclass=property_service
(2)selinux权限问题的解决方法:
请参考:
[FAQ11484] [SELinux] 如何设置确认selinux 模式
[FAQ11486] [SELinux Policy] 如何设置SELinux 策略规则 ? 在Kernel Log 中出现"avc: denied" 要如何处理?
[FAQ11483] 如何快速Debug SELinux Policy 问题
[FAQ11297] 【SELinux】如何添加SELinux策略规则?
ex:上面的log对应的solution为:
a)在alps/device/mediatek/common/sepolicy/property.te文件中增加语句:
type ctl_akmd09911_prop, property_type;
b)在alps/device/mediatek/common/sepolicy/property_contexts文件中增加语句:
ctl.akmd09911 u:object_r:ctl_akmd09911_prop:s0
c)在alps/device/mediatek/common/sepolicy/msensord.te 文件中增加语句:
allow msensord ctl_akmd09911_prop:property_service set;
原因四:msensor daemon是32bit,但kernel是64bit,导致daemon启动失败或者无法读取数据
(1)check 方法:
a)查看daemon是不是32bit
在ubuntu中通过命令: file out/target/product/$(proj)/system/bin/$(daemon_name) 查看daemon是否是32bit
ex:
b)查看kernel是不是64bit
在ubuntu中通过命令: file out/target/product/$(proj)/root/init 查看kernel是否是64bit
ex:
(2)解决方法:
请参考:
[FAQ13298] Android L版本中实现32bit userspace程序能通过ioctl()系统调用与64bit的kernel driver通信的方法
原因五:硬件device上没有gyro sensor,但是系统中配置了gyro sensor
(1)check方法:
a)检查系统是否配置了gyro sensor:
通过sensorList等apk去查看系统是否支持gyro sensor
b)检查device是否有gyro sensor
通过adb 命令访问文件夹 /sys/bus/platform/drivers/gyroscope,看其中是否有节点存在,并且有数据能够cat到;
ex:adb shell cat /sys/bus/platform/drivers/gyroscope/chipinfo
(2)解决方法:
a)保证让 alps/vendor/mediatek/proprietary/hardware/sensor/hwmsen_chip_info.c文件中gyrosensor的信息被宏包起来:
b) 根据实际的硬件是否支持gyrosensor的情况在文件:
alps/device/mediatek/$(proj)/ProjectConfig.mk中正确配置宏:CUSTOM_KERNEL_GYROSCOPE;
ex: CUSTOM_KERNEL_GYROSCOPE = yes #support gyrosensor
CUSTOM_KERNEL_GYROSCOPE = #not support gyrosensor
原因六:project支持gyrosensor,msensor也有数据,但是msensor的数据是错误的
(1)check方法:
通过sensor相关的apk查看msensor的数据平方和是否在(100~10000)之间,若数据和不在这个范围内,则msensor数据是错误的。
(2)解决方法:
通过画“8”字校准后再测试
备注:
文档中的
$(proj):表示所用的project
$(daemon_name):表示msensor的daemon 名字
在android L版本上对于msensor来说,常见的不良现象有下面两种:
(1)msensor无数据;
(2)指南针apk读取不到sensor数据.
下面给出这两种现象的可能的主要原因分析。
[SOLUTION]
原因一:gsensor工作不正常
(1)check 方法:通过sensor 相关apk查看是否能读取到gsensor数据,数据是否正常;
原因二:msensor 驱动加载失败
(1)check方法:通过adb 命令访问文件夹 /sys/bus/platform/drivers/msensor ,看其中是否有节点存在,并且有数据能够cat到;
ex:adb shell cat /sys/bus/platform/drivers/msensor/daemon
原因三:selinux权限的原因导致msensor daemon启动失败
(1)check方法:
a)在adb 中通过ps命令查看daemon 进程是否在运行
b)在开机的UART log和mtklog中搜索selinux的log,关键字“avc: denied” ;
ex: w<12>[ 28.713710].(1)[1:init]avc: denied { set } for property=ctl.akmd09911 scontext=u:r:msensord:s0 tcontext=ubject_r:ctl_default_prop:s0 tclass=property_service
(2)selinux权限问题的解决方法:
请参考:
[FAQ11484] [SELinux] 如何设置确认selinux 模式
[FAQ11486] [SELinux Policy] 如何设置SELinux 策略规则 ? 在Kernel Log 中出现"avc: denied" 要如何处理?
[FAQ11483] 如何快速Debug SELinux Policy 问题
[FAQ11297] 【SELinux】如何添加SELinux策略规则?
ex:上面的log对应的solution为:
a)在alps/device/mediatek/common/sepolicy/property.te文件中增加语句:
type ctl_akmd09911_prop, property_type;
b)在alps/device/mediatek/common/sepolicy/property_contexts文件中增加语句:
ctl.akmd09911 u:object_r:ctl_akmd09911_prop:s0
c)在alps/device/mediatek/common/sepolicy/msensord.te 文件中增加语句:
allow msensord ctl_akmd09911_prop:property_service set;
原因四:msensor daemon是32bit,但kernel是64bit,导致daemon启动失败或者无法读取数据
(1)check 方法:
a)查看daemon是不是32bit
在ubuntu中通过命令: file out/target/product/$(proj)/system/bin/$(daemon_name) 查看daemon是否是32bit
ex:
b)查看kernel是不是64bit
在ubuntu中通过命令: file out/target/product/$(proj)/root/init 查看kernel是否是64bit
ex:
(2)解决方法:
请参考:
[FAQ13298] Android L版本中实现32bit userspace程序能通过ioctl()系统调用与64bit的kernel driver通信的方法
原因五:硬件device上没有gyro sensor,但是系统中配置了gyro sensor
(1)check方法:
a)检查系统是否配置了gyro sensor:
通过sensorList等apk去查看系统是否支持gyro sensor
b)检查device是否有gyro sensor
通过adb 命令访问文件夹 /sys/bus/platform/drivers/gyroscope,看其中是否有节点存在,并且有数据能够cat到;
ex:adb shell cat /sys/bus/platform/drivers/gyroscope/chipinfo
(2)解决方法:
a)保证让 alps/vendor/mediatek/proprietary/hardware/sensor/hwmsen_chip_info.c文件中gyrosensor的信息被宏包起来:
b) 根据实际的硬件是否支持gyrosensor的情况在文件:
alps/device/mediatek/$(proj)/ProjectConfig.mk中正确配置宏:CUSTOM_KERNEL_GYROSCOPE;
ex: CUSTOM_KERNEL_GYROSCOPE = yes #support gyrosensor
CUSTOM_KERNEL_GYROSCOPE = #not support gyrosensor
原因六:project支持gyrosensor,msensor也有数据,但是msensor的数据是错误的
(1)check方法:
通过sensor相关的apk查看msensor的数据平方和是否在(100~10000)之间,若数据和不在这个范围内,则msensor数据是错误的。
(2)解决方法:
通过画“8”字校准后再测试
备注:
文档中的
$(proj):表示所用的project
$(daemon_name):表示msensor的daemon 名字
挺好的,我顶
这个FAQ上有的
今天我在MT6735 android5.1 版本上调试A+M,现在发现driver层,重力,磁力都有数据,但是orientation没有数据,用sensorlist.apk 测试,重力,磁力也都有数据,就是orientation没有数据,导致指南针apk不工作。这个估计是什么原因呀?
请问你现在解决了吗?我也是遇到同样的问题
回复,解决了,原来是因为原先有设计硬件陀螺仪,但主板没有贴,而软件上却开启了陀螺仪的宏,导致Msensor的数据异常,去掉陀螺仪的宏就好了