问题现象
当开机接入小容量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