diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index 77b582e968999..486e99a175955 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -49,7 +49,6 @@ import static com.android.internal.util.XmlUtils.writeStringAttribute; import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.START_TAG; -import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -64,7 +63,6 @@ import android.app.PendingIntent; import android.app.admin.SecurityLog; import android.app.usage.StorageStatsManager; import android.content.BroadcastReceiver; -import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -134,6 +132,7 @@ import android.util.Log; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseIntArray; import android.util.TimeUtils; import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; @@ -147,7 +146,6 @@ import com.android.internal.os.BackgroundThread; import com.android.internal.os.FuseUnavailableMountException; import com.android.internal.os.SomeArgs; import com.android.internal.util.ArrayUtils; -import com.android.internal.util.CollectionUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.HexDump; import com.android.internal.util.IndentingPrintWriter; @@ -179,7 +177,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; -import java.util.LinkedList; import java.util.List; import java.util.Locale; import java.util.Map; @@ -285,7 +282,6 @@ class StorageManagerService extends IStorageManager.Stub } } - private static final boolean DEBUG_EVENTS = false; private static final boolean DEBUG_OBB = false; /** @@ -331,11 +327,6 @@ class StorageManagerService extends IStorageManager.Stub private static final String ATTR_LAST_TRIM_MILLIS = "lastTrimMillis"; private static final String ATTR_LAST_BENCH_MILLIS = "lastBenchMillis"; - private static final String[] ALL_STORAGE_PERMISSIONS = { - Manifest.permission.READ_EXTERNAL_STORAGE, - Manifest.permission.WRITE_EXTERNAL_STORAGE - }; - @Nullable public static String sMediaStoreAuthorityProcessName; // Smart idle maintenance running period in minute @@ -389,18 +380,6 @@ class StorageManagerService extends IStorageManager.Stub */ private final Object mLock = LockGuard.installNewLock(LockGuard.INDEX_STORAGE); - /** - * Similar to {@link #mLock}, never hold this lock while performing downcalls into vold. - * Also, never hold this while calling into PackageManagerService since it is used in callbacks - * from PackageManagerService. - * - * If both {@link #mLock} and this lock need to be held, {@link #mLock} should be acquired - * before this. - * - * Use -PL suffix for methods that need to called with this lock held. - */ - private final Object mPackagesLock = new Object(); - /** * mLocalUnlockedUsers affects the return value of isUserUnlocked. If * any value in the array changes, then the binder cache for @@ -408,7 +387,7 @@ class StorageManagerService extends IStorageManager.Stub * WatchedLockedUsers, be sure to invalidate the cache in the new * methods. */ - private class WatchedLockedUsers { + private static class WatchedLockedUsers { private int[] users = EmptyArray.INT; public WatchedLockedUsers() { invalidateIsUserUnlockedCache(); @@ -495,7 +474,7 @@ class StorageManagerService extends IStorageManager.Stub @GuardedBy("mAppFuseLock") private AppFuseBridge mAppFuseBridge = null; - private HashMap mUserSharesMediaWith = new HashMap<>(); + private final SparseIntArray mUserSharesMediaWith = new SparseIntArray(); /** Matches known application dir paths. The first group contains the generic part of the path, * the second group contains the user id (or null if it's a public volume without users), the @@ -515,18 +494,6 @@ class StorageManagerService extends IStorageManager.Stub throw new IllegalArgumentException("No volume found for ID " + id); } - private String findVolumeIdForPathOrThrow(String path) { - synchronized (mLock) { - for (int i = 0; i < mVolumes.size(); i++) { - final VolumeInfo vol = mVolumes.valueAt(i); - if (vol.path != null && path.startsWith(vol.path)) { - return vol.id; - } - } - } - throw new IllegalArgumentException("No volume found for path " + path); - } - private VolumeRecord findRecordForPath(String path) { synchronized (mLock) { for (int i = 0; i < mVolumes.size(); i++) { @@ -570,30 +537,6 @@ class StorageManagerService extends IStorageManager.Stub } } - private boolean shouldBenchmark() { - final long benchInterval = Settings.Global.getLong(mContext.getContentResolver(), - Settings.Global.STORAGE_BENCHMARK_INTERVAL, DateUtils.WEEK_IN_MILLIS); - if (benchInterval == -1) { - return false; - } else if (benchInterval == 0) { - return true; - } - - synchronized (mLock) { - for (int i = 0; i < mVolumes.size(); i++) { - final VolumeInfo vol = mVolumes.valueAt(i); - final VolumeRecord rec = mRecords.get(vol.fsUuid); - if (vol.isMountedWritable() && rec != null) { - final long benchAge = System.currentTimeMillis() - rec.lastBenchMillis; - if (benchAge >= benchInterval) { - return true; - } - } - } - return false; - } - } - private CountDownLatch findOrCreateDiskScanLatch(String diskId) { synchronized (mLock) { CountDownLatch latch = mDiskScanLatches.get(diskId); @@ -606,7 +549,6 @@ class StorageManagerService extends IStorageManager.Stub } private final Context mContext; - private final ContentResolver mResolver; private volatile IVold mVold; private volatile IStoraged mStoraged; @@ -650,7 +592,7 @@ class StorageManagerService extends IStorageManager.Stub @GuardedBy("mLock") private final Set mUidsWithLegacyExternalStorage = new ArraySet<>(); // Not guarded by lock, always used on the ActivityManager thread - private final Map mPackageMonitorsForUser = new ArrayMap<>(); + private final SparseArray mPackageMonitorsForUser = new SparseArray<>(); class ObbState implements IBinder.DeathRecipient { @@ -896,7 +838,7 @@ class StorageManagerService extends IStorageManager.Stub final int userSerialNumber = um.getUserSerialNumber(userId); mVold.onUserAdded(userId, userSerialNumber); } else if (Intent.ACTION_USER_REMOVED.equals(action)) { - synchronized (mVolumes) { + synchronized (mLock) { final int size = mVolumes.size(); for (int i = 0; i < size; i++) { final VolumeInfo vol = mVolumes.valueAt(i); @@ -1063,41 +1005,6 @@ class StorageManagerService extends IStorageManager.Stub } } - /** - * MediaProvider has a ton of code that makes assumptions about storage - * paths never changing, so we outright kill them to pick up new state. - */ - @Deprecated - private void killMediaProvider(List users) { - if (users == null) return; - - final long token = Binder.clearCallingIdentity(); - try { - for (UserInfo user : users) { - // System user does not have media provider, so skip. - if (user.isSystemOnly()) continue; - - final ProviderInfo provider = mPmInternal.resolveContentProvider( - MediaStore.AUTHORITY, PackageManager.MATCH_DIRECT_BOOT_AWARE - | PackageManager.MATCH_DIRECT_BOOT_UNAWARE, - user.id, Process.SYSTEM_UID); - if (provider != null) { - final IActivityManager am = ActivityManager.getService(); - try { - am.killApplication(provider.applicationInfo.packageName, - UserHandle.getAppId(provider.applicationInfo.uid), - UserHandle.USER_ALL, "vold reset"); - // We only need to run this once. It will kill all users' media processes. - break; - } catch (RemoteException e) { - } - } - } - } finally { - Binder.restoreCallingIdentity(token); - } - } - @GuardedBy("mLock") private void addInternalVolumeLocked() { // Create a stub volume that represents internal storage @@ -1318,14 +1225,13 @@ class StorageManagerService extends IStorageManager.Stub } catch (Exception e) { Slog.wtf(TAG, e); } - PackageMonitor monitor = mPackageMonitorsForUser.remove(userId); + PackageMonitor monitor = mPackageMonitorsForUser.removeReturnOld(userId); if (monitor != null) { monitor.unregister(); } } private void maybeRemountVolumes(int userId) { - boolean reset = false; List volumesToRemount = new ArrayList<>(); synchronized (mLock) { for (int i = 0; i < mVolumes.size(); i++) { @@ -1471,7 +1377,7 @@ class StorageManagerService extends IStorageManager.Stub args.argi1 = oldState; args.argi2 = newState; mHandler.obtainMessage(H_VOLUME_STATE_CHANGED, args).sendToTarget(); - onVolumeStateChangedLocked(vInfo, oldState, newState); + onVolumeStateChangedLocked(vInfo, newState); } } } @@ -1657,7 +1563,8 @@ class StorageManagerService extends IStorageManager.Stub return true; } - private void onVolumeStateChangedLocked(VolumeInfo vol, int oldState, int newState) { + @GuardedBy("mLock") + private void onVolumeStateChangedLocked(VolumeInfo vol, int newState) { if (vol.type == VolumeInfo.TYPE_EMULATED) { if (newState != VolumeInfo.STATE_MOUNTED) { mFuseMountedUser.remove(vol.getMountUserId()); @@ -1677,7 +1584,9 @@ class StorageManagerService extends IStorageManager.Stub // Add fuse mounted user after migration to prevent ProcessList tries to // create obb directory before migration is done. - mFuseMountedUser.add(userId); + synchronized (mLock) { + mFuseMountedUser.add(userId); + } Map pidPkgMap = null; // getProcessesWithPendingBindMounts() could fail when a new app process is @@ -1920,7 +1829,6 @@ class StorageManagerService extends IStorageManager.Stub mVoldAppDataIsolationEnabled = SystemProperties.getBoolean( ANDROID_VOLD_APP_DATA_ISOLATION_ENABLED_PROPERTY, false); mContext = context; - mResolver = mContext.getContentResolver(); mCallbacks = new Callbacks(FgThread.get().getLooper()); mLockPatternUtils = new LockPatternUtils(mContext); @@ -2144,19 +2052,6 @@ class StorageManagerService extends IStorageManager.Stub } } - private static long getLastAccessTime(AppOpsManager manager, - int uid, String packageName, int[] ops) { - long maxTime = 0; - final List pkgs = manager.getOpsForPackage(uid, packageName, ops); - for (AppOpsManager.PackageOps pkg : CollectionUtils.emptyIfNull(pkgs)) { - for (AppOpsManager.OpEntry op : CollectionUtils.emptyIfNull(pkg.getOps())) { - maxTime = Math.max(maxTime, op.getLastAccessTime( - AppOpsManager.OP_FLAGS_ALL_TRUSTED)); - } - } - return maxTime; - } - private void systemReady() { LocalServices.getService(ActivityTaskManagerInternal.class) .registerScreenObserver(this); @@ -3849,7 +3744,7 @@ class StorageManagerService extends IStorageManager.Stub final ArrayList res = new ArrayList<>(); final ArraySet resUuids = new ArraySet<>(); - final int userIdSharingMedia = mUserSharesMediaWith.getOrDefault(userId, -1); + final int userIdSharingMedia = mUserSharesMediaWith.get(userId, -1); synchronized (mLock) { for (int i = 0; i < mVolumes.size(); i++) { final String volId = mVolumes.keyAt(i); @@ -3868,6 +3763,7 @@ class StorageManagerService extends IStorageManager.Stub break; } // Skip if emulated volume not for userId + continue; default: continue; } @@ -4023,8 +3919,8 @@ class StorageManagerService extends IStorageManager.Stub mContext.enforceCallingPermission(android.Manifest.permission.STORAGE_INTERNAL, TAG); } final long token = Binder.clearCallingIdentity(); - final StorageStatsManager stats = mContext.getSystemService(StorageStatsManager.class); try { + final StorageStatsManager stats = mContext.getSystemService(StorageStatsManager.class); return stats.getCacheQuotaBytes(volumeUuid, uid); } finally { Binder.restoreCallingIdentity(token); @@ -4233,7 +4129,7 @@ class StorageManagerService extends IStorageManager.Stub Slog.i(TAG, "Flushing all OBB state for path " + path); synchronized (mObbMounts) { - final List obbStatesToRemove = new LinkedList(); + final List obbStatesToRemove = new ArrayList<>(); final Iterator i = mObbPathToStateMap.values().iterator(); while (i.hasNext()) { @@ -4284,7 +4180,7 @@ class StorageManagerService extends IStorageManager.Stub } } - abstract class ObbAction { + private static abstract class ObbAction { ObbState mObbState;