From e537e6f88f53f4a48ede985c53e36faf9cc80c64 Mon Sep 17 00:00:00 2001 From: Rhed Jao Date: Tue, 2 Nov 2021 19:11:07 +0800 Subject: [PATCH] Prune unused static shared libraries Post a message to package handler to prune unused static shared libraries after device boot and package un/installed. Bug: 199746619 Test: atest StaticSharedLibsHostTests Change-Id: I0509ee38249cf1193fad95fe9bdc7d202197485d --- .../server/pm/DeletePackageHelper.java | 3 +++ .../server/pm/InstallPackageHelper.java | 3 +++ .../com/android/server/pm/PackageHandler.java | 17 +++++++++++++ .../server/pm/PackageManagerService.java | 24 +++++++++++++++---- 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index 8b3852ead1759..52d865de5d7a4 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -725,6 +725,9 @@ final class DeletePackageHelper { Log.i(TAG, "Observer no longer exists."); } //end catch notifyPackageChangeObserversOnDelete(packageName, versionCode); + + // Prune unused static shared libraries which have been cached a period of time + mPm.schedulePruneUnusedStaticSharedLibraries(true /* delay */); }); } diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 53e76a7a594d0..40d3eaf13e780 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -3183,6 +3183,9 @@ final class InstallPackageHelper { mPm.notifyInstallObserver(res, installObserver); } + // Prune unused static shared libraries which have been cached a period of time + mPm.schedulePruneUnusedStaticSharedLibraries(true /* delay */); + // Log tracing if needed if (installArgs.mTraceMethod != null) { Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, installArgs.mTraceMethod, diff --git a/services/core/java/com/android/server/pm/PackageHandler.java b/services/core/java/com/android/server/pm/PackageHandler.java index 0c47f7d60979b..1a9c7a994fea3 100644 --- a/services/core/java/com/android/server/pm/PackageHandler.java +++ b/services/core/java/com/android/server/pm/PackageHandler.java @@ -21,6 +21,7 @@ import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static com.android.server.pm.PackageManagerService.CHECK_PENDING_INTEGRITY_VERIFICATION; import static com.android.server.pm.PackageManagerService.CHECK_PENDING_VERIFICATION; import static com.android.server.pm.PackageManagerService.DEBUG_INSTALL; +import static com.android.server.pm.PackageManagerService.DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD; import static com.android.server.pm.PackageManagerService.DEFAULT_VERIFICATION_RESPONSE; import static com.android.server.pm.PackageManagerService.DEFERRED_NO_KILL_INSTALL_OBSERVER; import static com.android.server.pm.PackageManagerService.DEFERRED_NO_KILL_POST_DELETE; @@ -32,6 +33,7 @@ import static com.android.server.pm.PackageManagerService.INSTANT_APP_RESOLUTION import static com.android.server.pm.PackageManagerService.INTEGRITY_VERIFICATION_COMPLETE; import static com.android.server.pm.PackageManagerService.PACKAGE_VERIFIED; import static com.android.server.pm.PackageManagerService.POST_INSTALL; +import static com.android.server.pm.PackageManagerService.PRUNE_UNUSED_STATIC_SHARED_LIBRARIES; import static com.android.server.pm.PackageManagerService.SEND_PENDING_BROADCAST; import static com.android.server.pm.PackageManagerService.SNAPSHOT_UNCORK; import static com.android.server.pm.PackageManagerService.TAG; @@ -53,9 +55,12 @@ import android.os.Process; import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; +import android.provider.Settings; import android.util.Log; import android.util.Slog; +import java.io.IOException; + /** * Part of PackageManagerService that handles events. */ @@ -376,6 +381,18 @@ final class PackageHandler extends Handler { } break; } + case PRUNE_UNUSED_STATIC_SHARED_LIBRARIES: { + try { + mPm.pruneUnusedStaticSharedLibraries(Long.MAX_VALUE, + Settings.Global.getLong(mPm.mContext.getContentResolver(), + Settings.Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD, + DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD)); + } catch (IOException e) { + Log.w(TAG, "Failed to prune unused static shared libraries :" + + e.getMessage()); + } + break; + } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7f1ac15f2ba73..66ea426ebc299 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -303,6 +303,7 @@ import java.util.Objects; import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.BiConsumer; @@ -918,6 +919,7 @@ public class PackageManagerService extends IPackageManager.Stub static final int CHECK_PENDING_INTEGRITY_VERIFICATION = 26; static final int DOMAIN_VERIFICATION = 27; static final int SNAPSHOT_UNCORK = 28; + static final int PRUNE_UNUSED_STATIC_SHARED_LIBRARIES = 29; static final int DEFERRED_NO_KILL_POST_DELETE_DELAY_MS = 3 * 1000; private static final int DEFERRED_NO_KILL_INSTALL_OBSERVER_DELAY_MS = 500; @@ -927,11 +929,16 @@ public class PackageManagerService extends IPackageManager.Stub private static final long BROADCAST_DELAY_DURING_STARTUP = 10 * 1000L; // 10 seconds (in millis) private static final long BROADCAST_DELAY = 1 * 1000L; // 1 second (in millis) + private static final long PRUNE_UNUSED_STATIC_SHARED_LIBRARIES_DELAY = + TimeUnit.MINUTES.toMillis(3); // 3 minutes + // When the service constructor finished plus a delay (used for broadcast delay computation) private long mServiceStartWithDelay; - private static final long DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD = - 2 * 60 * 60 * 1000L; /* two hours */ + private static final long FREE_STORAGE_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD = + TimeUnit.HOURS.toMillis(2); /* two hours */ + static final long DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD = + TimeUnit.DAYS.toMillis(7); /* 7 days */ final UserManagerService mUserManager; @@ -1255,6 +1262,12 @@ public class PackageManagerService extends IPackageManager.Stub mHandler.sendMessageDelayed(message, DEFERRED_NO_KILL_POST_DELETE_DELAY_MS); } + void schedulePruneUnusedStaticSharedLibraries(boolean delay) { + mHandler.removeMessages(PRUNE_UNUSED_STATIC_SHARED_LIBRARIES); + mHandler.sendEmptyMessageDelayed(PRUNE_UNUSED_STATIC_SHARED_LIBRARIES, + delay ? PRUNE_UNUSED_STATIC_SHARED_LIBRARIES_DELAY : 0); + } + @Override public void requestChecksums(@NonNull String packageName, boolean includeSplits, @Checksum.TypeMask int optional, @@ -2913,7 +2926,7 @@ public class PackageManagerService extends IPackageManager.Stub if (internalVolume && pruneUnusedStaticSharedLibraries(bytes, android.provider.Settings.Global.getLong(mContext.getContentResolver(), Global.UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD, - DEFAULT_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD))) { + FREE_STORAGE_UNUSED_STATIC_SHARED_LIB_MIN_CACHE_PERIOD))) { return; } @@ -2968,7 +2981,7 @@ public class PackageManagerService extends IPackageManager.Stub throw new IOException("Failed to free " + bytes + " on storage device at " + file); } - private boolean pruneUnusedStaticSharedLibraries(long neededSpace, long maxCachePeriod) + boolean pruneUnusedStaticSharedLibraries(long neededSpace, long maxCachePeriod) throws IOException { final StorageManager storage = mInjector.getSystemService(StorageManager.class); final File volume = storage.findPathForUuid(StorageManager.UUID_PRIVATE_INTERNAL); @@ -8464,6 +8477,9 @@ public class PackageManagerService extends IPackageManager.Stub }); mBackgroundDexOptService.systemReady(); + + // Prune unused static shared libraries which have been cached a period of time + schedulePruneUnusedStaticSharedLibraries(false /* delay */); } /**