summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Terry Wang <tytytyww@google.com> 2021-04-23 15:51:37 -0700
committer Terry Wang <tytytyww@google.com> 2021-06-16 01:52:26 -0700
commitc5d1afa418a9b0b6c94c209ce5bf9765a546a32d (patch)
treebc83b5acc9ba2177abd1ca9f4e0902488b247d1a
parent5c7cdbb8f575b714b72a7b570e7710cd624b0255 (diff)
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
-rw-r--r--apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java36
-rw-r--r--apex/appsearch/service/java/com/android/server/appsearch/visibilitystore/VisibilityStore.java2
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<PackageInfo> installedPackageInfos = mContext
+ .createContextAsUser(userHandle, /*flags=*/0)
+ .getPackageManager()
+ .getInstalledPackages(/*flags=*/0);
+ Set<String> 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";