From c5d1afa418a9b0b6c94c209ce5bf9765a546a32d Mon Sep 17 00:00:00 2001 From: Terry Wang Date: Fri, 23 Apr 2021 15:51:37 -0700 Subject: Clear the uninstalled package data in AppSearch. Since we cannot access locked user's data and clear it when a package got removed. When a user is unlocking, we should prune their data and remove all data that doesn't belong to any of installed packages. This will also help in handling the case where device gets rebooted before the data is cleared for an uninstalled package. Bug: 186151459 Test: atest --rebuild-module-info CtsAppSearchHostTestCases Change-Id: Ic6d151621a88df7806901781d3edfec65700c35d --- .../server/appsearch/AppSearchManagerService.java | 36 ++++++++++++++++++---- .../appsearch/visibilitystore/VisibilityStore.java | 2 +- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java index e5244296b1f4..31203c73c76a 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java @@ -63,6 +63,7 @@ import com.android.server.appsearch.external.localstorage.stats.CallStats; import com.android.server.appsearch.stats.LoggerInstanceManager; import com.android.server.appsearch.stats.PlatformLogger; import com.android.server.appsearch.util.PackageUtil; +import com.android.server.appsearch.visibilitystore.VisibilityStore; import com.android.server.usage.StorageStatsManagerLocal; import com.android.server.usage.StorageStatsManagerLocal.StorageStatsAugmenter; @@ -218,11 +219,12 @@ public class AppSearchManagerService extends SystemService { UserHandle userHandle = UserHandle.getUserHandleForUid(uid); try { if (isUserLocked(userHandle)) { - //TODO(b/186151459) clear the uninstalled package data when user is unlocked. + // We cannot access a locked user's directry and remove package data from it. + // We should remove those uninstalled package data when the user is unlocking. return; } + // Only clear the package's data if AppSearch exists for this user. if (ImplInstanceManager.getAppSearchDir(userHandle).exists()) { - // Only clear the package's data if AppSearch exists for this user. PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger(mContext, userHandle, AppSearchConfig.getInstance(EXECUTOR)); AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext, @@ -239,9 +241,34 @@ public class AppSearchManagerService extends SystemService { @Override public void onUserUnlocking(@NonNull TargetUser user) { Objects.requireNonNull(user); + UserHandle userHandle = user.getUserHandle(); synchronized (mUnlockedUsersLocked) { - mUnlockedUsersLocked.add(user.getUserHandle()); + mUnlockedUsersLocked.add(userHandle); } + EXECUTOR.execute(() -> { + try { + // Only clear the package's data if AppSearch exists for this user. + if (ImplInstanceManager.getAppSearchDir(userHandle).exists()) { + PlatformLogger logger = mLoggerInstanceManager.getOrCreatePlatformLogger( + mContext, userHandle, AppSearchConfig.getInstance(EXECUTOR)); + AppSearchImpl impl = mImplInstanceManager.getOrCreateAppSearchImpl(mContext, + userHandle, logger); + List installedPackageInfos = mContext + .createContextAsUser(userHandle, /*flags=*/0) + .getPackageManager() + .getInstalledPackages(/*flags=*/0); + Set packagesToKeep = new ArraySet<>(installedPackageInfos.size()); + for (int i = 0; i < installedPackageInfos.size(); i++) { + packagesToKeep.add(installedPackageInfos.get(i).packageName); + } + packagesToKeep.add(VisibilityStore.PACKAGE_NAME); + //TODO(b/145759910) clear visibility setting for package. + impl.prunePackageData(packagesToKeep); + } + } catch (Throwable t) { + Log.e(TAG, "Unable to prune packages for " + user, t); + } + }); } @Override @@ -1255,9 +1282,6 @@ public class AppSearchManagerService extends SystemService { * @param callingUid The actual uid of the caller as determined by Binder. * @return the user handle that the call should run as. Will always be a concrete user. */ - // TODO(b/173553485) verifying that the caller has permission to access target user's data - // TODO(b/173553485) Handle ACTION_USER_REMOVED broadcast - // TODO(b/173553485) Implement SystemService.onUserStopping() @NonNull private UserHandle handleIncomingUser(@NonNull UserHandle requestedUser, int callingUid) { int callingPid = Binder.getCallingPid(); diff --git a/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStore.java b/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStore.java index af09210b2c18..a9f6adb20225 100644 --- a/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStore.java +++ b/apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStore.java @@ -76,7 +76,7 @@ public class VisibilityStore { * These cannot have any of the special characters used by AppSearchImpl (e.g. {@code * AppSearchImpl#PACKAGE_DELIMITER} or {@code AppSearchImpl#DATABASE_DELIMITER}. */ - @VisibleForTesting public static final String PACKAGE_NAME = "VS#Pkg"; + public static final String PACKAGE_NAME = "VS#Pkg"; @VisibleForTesting public static final String DATABASE_NAME = "VS#Db"; -- cgit v1.2.3-59-g8ed1b