修改提前挂载sdcard并解锁
前言
android7.0以后推出了DirectBootAware模式,同时也有了用户空间的概念,在用户解锁前,有些内存空间是使用不了,有一些要在DirectBootAware模式下的应用,如果要用到sdcard下的空间, 直接就会报找不到的错误,比如为了加快开机速度,会在launcher中加入DirectBootAware=true的属性,这时候,如果在application中用到了sdcard的路径,那就会直接报找不到文件
一、怎么解决
提前挂载sdcard, 不用等到用户解锁之后再挂载
二、修改
1.StorageManagerService层修改sdcard挂载时间
代码如下(示例):
diff --git a/alps/frameworks/base/services/core/java/com/android/server/StorageManagerService.java b/alps/frameworks/base/services/core/java/com/android/server/StorageManagerService.java
index dd190d31b2..cbec9a03f3 100644
--- a/alps/frameworks/base/services/core/java/com/android/server/StorageManagerService.java
+++ b/alps/frameworks/base/services/core/java/com/android/server/StorageManagerService.java
@@ -224,8 +224,9 @@ public class StorageManagerService extends IStorageManager.Stub
mStorageManagerService.servicesReady();
} else if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
mStorageManagerService.systemReady();
+ mStorageManagerService.bootCompleted();
} else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
- mStorageManagerService.bootCompleted();
+ //mStorageManagerService.bootCompleted();
}
}
@@ -916,7 +917,9 @@ public class StorageManagerService extends IStorageManager.Stub
private void initIfBootedAndConnected() {
Slog.d(TAG, "Thinking about init, mBootCompleted=" + mBootCompleted
+ ", mDaemonConnected=" + mDaemonConnected);
- if (mBootCompleted && mDaemonConnected
+ if (
+ //mBootCompleted &&
+ mDaemonConnected
&& !StorageManager.isFileEncryptedNativeOnly()) {
// When booting a device without native support, make sure that our
// user directories are locked or unlocked based on the current
@@ -942,9 +945,12 @@ public class StorageManagerService extends IStorageManager.Stub
private void resetIfBootedAndConnected() {
Slog.d(TAG, "Thinking about reset, mBootCompleted=" + mBootCompleted
+ ", mDaemonConnected=" + mDaemonConnected);
- if (mBootCompleted && mDaemonConnected) {
+ if (
+ //mBootCompleted &&
+ mDaemonConnected) {
final List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
- killMediaProvider(users);
+ if(mBootCompleted)
+ killMediaProvider(users);
final int[] systemUnlockedUsers;
synchronized (mLock) {
@@ -1254,7 +1260,7 @@ public class StorageManagerService extends IStorageManager.Stub
@GuardedBy("mLock")
private void onVolumeCreatedLocked(VolumeInfo vol) {
- if (mPmInternal.isOnlyCoreApps()) {
+ if (null!=mPmInternal && mPmInternal.isOnlyCoreApps()) {
Slog.d(TAG, "System booted in core-only mode; ignoring volume " + vol.getId());
return;
}
@@ -1668,6 +1674,9 @@ public class StorageManagerService extends IStorageManager.Stub
private void handleBootCompleted() {
initIfBootedAndConnected();
resetIfBootedAndConnected();
+ UserInfo userinfo=mContext.getSystemService(UserManager.class).getUserInfo(0);;
+ unlockUserKey(0,userinfo.serialNumber,null,null);
+ onUnlockUser(0);
}
这里
} else if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
mStorageManagerService.systemReady();
-
mStorageManagerService.bootCompleted(); } else if (phase == SystemService.PHASE_BOOT_COMPLETED) {
我们需要修改的是,不等到系统完成再挂载, systemready的时候就开始挂载,这样launcher就能读取到sdcard的路径了,
handleBootCompleted这个里面的操作就是挂载sdcard,通过vold,自己去看看vold的源码就行
下面就是调用用户默认的, 开始解锁用户空间,
总结
DirectBootAware模式下,是只能访问特定使用空间的,用户空间解锁之后才能使用
vold挂载的流程可以熟悉一下