分享一个android手机开不了机的问题
2015-04-29 11:57
232 查看
前段时间开发了一个小屏的功能(效果图如下:),果了一段时间,测试的人员说我们的手机有时开机不了:一直停止在开机的界面.刚开始都不知道什么原因.查了各种代码都没有发现问题.到后来感觉问题越来越严重了.
到后来感觉问题越来越严重了.重要的是这个时低概率事件,很难复现一次,所以有点难.好不容易出现,通过data/anr/traces.txt找到问题,下面来看看关键信息:
上面两段信息的关键是:waiting to lock 看来貌似是进入一个死锁.两个锁等待都在这个文件出现:DisplayManagerGlobal.java,所以看看DisplayManagerGlobal就会发现问题:
而我开发的小屏功能在DisplayManagerService里面register小屏的DisplayAdapter的时候已经获取了mSyncRoot锁,所以如果在这同时(register小屏的DisplayAdapter的时候)调用下面的代码:
到后来感觉问题越来越严重了.重要的是这个时低概率事件,很难复现一次,所以有点难.好不容易出现,通过data/anr/traces.txt找到问题,下面来看看关键信息:
"WindowManag4 MONITOR | group="main" sCount=1 dsCount=0 obj=0x4275d4d8 self=0x57929cb0 | sysTid=732 nice=-4 sched=0/0 cgrp=apps handle=1469227632 | schedstat=( 1563495873 1380427864 20236 ) - waiting to lock <0x427e72d8> (a Ljava/lang/Object; ) held by tid=1 (main) | [0]:<0006> Landroid/hardware/display/DisplayManagerGlobal;.getDisplayInfo(I)Landroid/view/DisplayInfo; (<span style="color:#FF0000;">DisplayManagerGlobal.java:108</span>) | [1]:<0008> Landroid/view/Display;.updateDisplayInfoLocked()V (Display.java:657) | [2]:<0002> Landroid/view/Display;.getMetrics(Landroid/util/DisplayMetrics;)V (Display.java:585) | [3]:<0104> Lcom/android/server/display/xunhuOverlayDisplayAdapter;.<init>(Lcom/android/server/display/DisplayManagerService$SyncRoot;Lan (<span style="color:#FF0000;">xunhuOverlayDisplayAdapter.java:104</span>) | [4]:<0030> Lcom/android/server/display/DisplayManagerService;.register_xunhuOverlayDisplayAdapterLocked()V (DisplayManagerService.java:994)
"main" prio=5 tid=1 MONITOR | group="main" sCount=1 dsCount=0 obj=0x422c6cf8 self=0x4182e500 | sysTid=715 nice=-2 sched=0/0 cgrp=apps handle=1074631044 | schedstat=( 7254851604 2756007452 25767 ) - waiting to lock <0x4277acc8> (a Lcom/android/server/display/DisplayManagerService$SyncRoot; ) held by tid=14 (WindowManager) | [0]:<0020> Lcom/android/server/display/DisplayManagerService;.getDisplayInfo(I)Landroid/view/DisplayInfo; (<span style="color:#FF0000;">DisplayManagerService.java:449</span>) | [1]:<0012> Landroid/hardware/display/DisplayManagerGlobal;.getDisplayInfo(I)Landroid/view/DisplayInfo; (<span style="color:#FF0000;">DisplayManagerGlobal.java:117</span>) | [2]:<0000> Landroid/hardware/display/DisplayManagerGlobal;.getCompatibleDisplay(ILandroid/view/DisplayAdjustments;)Landroid/view/Display; (DisplayManagerGlobal.java:176)
上面两段信息的关键是:waiting to lock 看来貌似是进入一个死锁.两个锁等待都在这个文件出现:DisplayManagerGlobal.java,所以看看DisplayManagerGlobal就会发现问题:
public DisplayInfo getDisplayInfo(int displayId) { try { synchronized (mLock) {<span style="color:#FF0000;">//108</span> DisplayInfo info; if (USE_CACHE) { info = mDisplayInfoCache.get(displayId); if (info != null) { return info; } } info = mDm.getDisplayInfo(displayId);<span style="color:#FF0000;">//117</span> if (info == null) { return null; }首先是这里mLock锁竞争.在这个锁里调用mDm.getDisplayInfo(displayId)的时候会回调到DisplayManagerService里面,如下代码:
public DisplayInfo getDisplayInfo(int displayId) { final int callingUid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); try { synchronized (mSyncRoot) {<span style="color:#FF0000;">//449</span> /// M:[SmartBook]Ignore extra display devicee info if (FeatureOption.MTK_SMARTBOOK_SUPPORT) { if (displayId == mExtraDisplayId) { return null; } }很显然,在获取了 DisplayManagerGlobal里面的锁:mLock,还需要DisplayManagerService里面的锁mSyncRoot.
而我开发的小屏功能在DisplayManagerService里面register小屏的DisplayAdapter的时候已经获取了mSyncRoot锁,所以如果在这同时(register小屏的DisplayAdapter的时候)调用下面的代码:
WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getMetrics(metric);就容易出现死锁. 因为在调用getDefaultDisplay()的时候最后会调用DisplayManagerGlobal的getDisplayInfo这个方法.而在开机的时候有大量其他地方调用DisplayManagerGlobal的getDisplayInfo这个方法.
相关文章推荐
- 好久没更新博客了,今天给大家分享一下Android中的资源与国际化的问题,通常我们新建一个Android工程,目录结构如下图所示: 我们主要看一下layout与values目录,layou
- 51-android.rules -- 一个文件搞定Ubuntu上Eclipse不识别Android手机的问题
- android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题
- android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题
- 【android】给大家分享个小功能,关于低版本安卓手机拍照找不到图片的问题
- 为Unity开发的android手机游戏添加一个社会化分享功能
- android开发之一个手机重启问题引发的思考
- 解决了一个cocos2dx 在部分 android手机上模板测试错误的问题
- Android手机监视网络状态的变化--关于权限的一个小问题
- Android 获取屏幕尺寸与密度 遇到一个问题,我的地图浮标图片在WVGA手机上正好,在QVGA上就显的太大,所以我要根据屏幕的不同调整浮标的大小使其在QVGA大小合适。有的同事提出了依据
- Android WebView或手机浏览器打开连接问题解决办法总结
- Android 微博分享失败问题
- android 关于状态栏的设置,修改,适配的问题包括:4.x,5.x,6.x的手机的适配
- Android内存泄露问题分享
- android 微信分享问题
- 请教一个问题,Android应用运行时在调用某个API(比如相机)时,系统如何判断这个应用是否具备相应的权限?
- HTML5 完美解决javascript中iphone手机和android手机复制文本到剪切板问题
- android webView 每次开启一个新的页面(重定向问题)
- android 通知的一个问题
- android使用AIDL进程间通信遇到的一个小问题