Android5.0L中SensorService crash导致的systemserver重启问题分析

简介: 一、初步分析结论sensorservice多线程机制存在问题,导致在disable accel sensor并释放相应内存和数据之后,有很小的概率发生继续读取到未处理完的sensor事件,从而继续使用相应的内存和数据,并且没有做相应的防御保护措施,最终引起指针地址操作错误。

一、初步分析结论

sensorservice多线程机制存在问题,导致在disable accel sensor并释放相应内存和数据之后,

有很小的概率发生继续读取到未处理完的sensor事件,从而继续使用相应的内存和数据,

并且没有做相应的防御保护措施,最终引起指针地址操作错误。


二、解决方案

1、首先在可能发生错误的地方做好防御保护措施

2、对多线程进行同步,对于临界变量的操作都放置到临界区中,使用锁来保护。


三、具体分析过程

log中显示打出accel sensordisable的信息,然后接着1ms sensorservicecrash

Disable accel sensor会先注销listener并释放相应内存,然后再调用具体的sensorhaldisable,具体代码如下:

注销listener时会释放内存和数据:

真正发生地址操作失败的代码并没有进行相应的判空保护,如果781行得到的是0,那么783item也是0,它的成员ctx相对偏移是8,在对8进行寻址和成员操作时就出现了内存错误,因为8不是一个有效的数据对象地址,具体如下:

目录
相关文章
|
4月前
|
安全 Android开发
Android 预置可卸载分区接收不到任何广播问题分析和解决
Android 预置可卸载分区接收不到任何广播问题分析和解决
144 0
|
2月前
|
缓存 安全 Java
Android深入Binder拦截问题分析
【7月更文挑战第1天】Android Binder 拦截可实现虚拟化、测试、SDK检测、逆向分析及ROM扩展。通过Java层aidl代理,利用IBinder接口规范来拦截通信。拦截步骤包括:替换Binder服务缓存对象,如ActivityManagerService;代理ServiceManager以控制服务获取。此操作需系统权限,可能涉及安全风险和版本差异,非必要时应谨慎。
|
4月前
|
调度 Android开发
Android9底部导航栏出现空白按钮问题分析
Android9底部导航栏出现空白按钮问题分析
34 0
|
Shell Android开发
Magisk模块:优化安卓碎片化2.0(循环版)fstrim-模块调用magisk自带的busybox.sh(重启生效)
Magisk模块:优化安卓碎片化2.0(循环版)fstrim-模块调用magisk自带的busybox.sh(重启生效)
929 1
Magisk模块:优化安卓碎片化2.0(循环版)fstrim-模块调用magisk自带的busybox.sh(重启生效)
|
Java Android开发 开发者
Android Studio Profiler Memory (内存分析工具)的简单使用及问题分析
Android Studio Profiler Memory (内存分析工具)的简单使用及问题分析
2810 0
Android Studio Profiler Memory (内存分析工具)的简单使用及问题分析
|
API Android开发
使用Android的Service实现后台定时检测并重启应用
使用Android的Service实现后台定时检测并重启应用
|
Java Android开发
Android 7.1 多次重启后BOOT_COMPLETED广播接收变慢
Android 7.1 多次重启后BOOT_COMPLETED广播接收变慢
298 0
|
Java Android开发
Android 7.1设置默认Launcher重启后失效(需手动选择)
Android 7.1设置默认Launcher重启后失效(需手动选择)
406 0
|
机器人 开发工具 Android开发
eclipse 安装安卓ADT成功,也提示重启了,但是就是没有应该有的小机器人标志
eclipse 安装安卓ADT成功,也提示重启了,但是就是没有应该有的小机器人标志
201 0
|
算法 Android开发
Android Service重启恢复(Service进程重启)原理解析(二)
Android Service重启恢复(Service进程重启)原理解析(二)
1553 0
Android Service重启恢复(Service进程重启)原理解析(二)