diff options
| -rw-r--r-- | services/core/Android.mk | 1 | ||||
| -rw-r--r-- | services/core/java/com/android/server/StorageManagerService.java | 43 |
2 files changed, 41 insertions, 3 deletions
diff --git a/services/core/Android.mk b/services/core/Android.mk index 5ec537045237..8b162aecf0f4 100644 --- a/services/core/Android.mk +++ b/services/core/Android.mk @@ -15,6 +15,7 @@ LOCAL_SRC_FILES += \ java/com/android/server/am/EventLogTags.logtags \ ../../../../system/netd/server/binder/android/net/INetd.aidl \ ../../../../system/netd/server/binder/android/net/metrics/INetdEventListener.aidl \ + ../../../../system/vold/binder/android/os/IVold.aidl \ ../../../native/cmds/installd/binder/android/os/IInstalld.aidl \ LOCAL_AIDL_INCLUDES += \ diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 1ca0112cb4f3..b0528dc99632 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -56,6 +56,7 @@ import android.os.FileUtils; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; +import android.os.IVold; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; @@ -96,6 +97,7 @@ import android.util.Xml; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.IMediaContainerService; import com.android.internal.os.AppFuseMount; +import com.android.internal.os.BackgroundThread; import com.android.internal.os.FuseUnavailableMountException; import com.android.internal.os.SomeArgs; import com.android.internal.os.Zygote; @@ -108,7 +110,6 @@ import com.android.internal.util.Preconditions; import com.android.internal.widget.LockPatternUtils; import com.android.server.NativeDaemonConnector.Command; import com.android.server.NativeDaemonConnector.SensitiveArg; -import com.android.server.pm.PackageManagerException; import com.android.server.pm.PackageManagerService; import com.android.server.storage.AppFuseBridge; @@ -201,6 +202,9 @@ class StorageManagerService extends IStorageManager.Stub } } + /** Flag to enable binder-based interface to vold */ + private static final boolean ENABLE_BINDER = true; + private static final boolean DEBUG_EVENTS = false; private static final boolean DEBUG_OBB = false; @@ -471,6 +475,8 @@ class StorageManagerService extends IStorageManager.Stub private final Thread mConnectorThread; private final Thread mCryptConnectorThread; + private volatile IVold mVold; + private volatile boolean mSystemReady = false; private volatile boolean mBootCompleted = false; private volatile boolean mDaemonConnected = false; @@ -916,7 +922,11 @@ class StorageManagerService extends IStorageManager.Stub } try { - mConnector.execute("volume", "reset"); + if (ENABLE_BINDER) { + mVold.reset(); + } else { + mConnector.execute("volume", "reset"); + } // Tell vold about all existing and started users for (UserInfo user : users) { @@ -925,7 +935,7 @@ class StorageManagerService extends IStorageManager.Stub for (int userId : systemUnlockedUsers) { mConnector.execute("volume", "user_started", userId); } - } catch (NativeDaemonConnectorException e) { + } catch (RemoteException | NativeDaemonConnectorException e) { Slog.w(TAG, "Failed to reset vold", e); } } @@ -1574,10 +1584,37 @@ class StorageManagerService extends IStorageManager.Stub } private void start() { + connect(); mConnectorThread.start(); mCryptConnectorThread.start(); } + private void connect() { + IBinder binder = ServiceManager.getService("vold"); + if (binder != null) { + try { + binder.linkToDeath(new DeathRecipient() { + @Override + public void binderDied() { + Slog.w(TAG, "vold died; reconnecting"); + connect(); + } + }, 0); + } catch (RemoteException e) { + binder = null; + } + } + + if (binder != null) { + mVold = IVold.Stub.asInterface(binder); + } else { + Slog.w(TAG, "vold not found; trying again"); + BackgroundThread.getHandler().postDelayed(() -> { + connect(); + }, DateUtils.SECOND_IN_MILLIS); + } + } + private void systemReady() { mSystemReady = true; mHandler.obtainMessage(H_SYSTEM_READY).sendToTarget(); |