Androd开机时挂载大容量硬盘导致系统异常

问题现象

当开机接入小容量U盘或者移动硬盘时,该问题不会显现。但当容量超过1TB且开机时候负载过高,有可能会触发watchdong,导致system_server重启,从而引发系统操作异常。
先把Solution放上:

--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -174,6 +174,9 @@ class StorageManagerService extends IStorageManager.Stub
     [Issue Description] - delay mount USB/HHD when booting.
     // Static direct instance pointer for the tightly-coupled idle service to use
     static StorageManagerService sSelf = null;
 
+    // to resolve system_server crash when booting with 2TB HHD plugged.
+    private boolean bIsUserUnlocked = false;
+
     /* Read during boot to decide whether to enable zram when available */
     private static final String ZRAM_ENABLED_PROPERTY =
         "persist.sys.zram_enabled";
@@ -209,11 +212,13 @@ class StorageManagerService extends IStorageManager.Stub
         @Override
         public void onUnlockUser(int userHandle) {
   
             mStorageManagerService.onUnlockUser(userHandle);
+            mStorageManagerService.bIsUserUnlocked = true;
         }
 
         @Override
         public void onCleanupUser(int userHandle) {
   
             mStorageManagerService.onCleanupUser(userHandle);
+            mStorageManagerService.bIsUserUnlocked = false;
         }
     }
 
@@ -617,6 +622,13 @@ class StorageManagerService extends IStorageManager.Stub
                         Slog.i(TAG, "Ignoring mount " + vol.getId() + " due to policy");
                         break;
                     }
+                    if (!bIsUserUnlocked) {
   
+                        if (vol.type == VolumeInfo.TYPE_PUBLIC) {
   
+                            Log.d(TAG, "delay to mount:" + vol);
+                            sendMessageDelayed(Message.obtain(msg), 1000);
+                            break;
+                        }
+                    }
                     try {
   
                         mVold.mount(vol.id, vol.mountFlags, vol.mountUserId);
                     } catch (Exception e) {
   

问题分析

通过(debuggerd pidof vold)打印vold的backtrace可以发现会有两段关键的讯息;

pid: 2332, tid: 2340, name: Binder:2332_1  >>> /system/bin/vold <<<
    r0  b0b52008  r1  00000089  r2  00000002  r3  00000000
    r4  00000000  r5  ffffffff  r6  b090172c  r7  000000f0
    r8  00000002  r9  00000000  r10 00000002  r11 b1563d69
    ip  b09016e8  sp  b09016d8  lr  b0ea6239  pc  b0ea2d74

backtrace:
    #00 pc 00019d74  /system/lib/libc.so (syscall+28)
    #01 pc 0001d235  /system/lib/libc
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值