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
This commit is contained in:
Rhed Jao
2021-11-02 19:11:07 +08:00
parent 48076b2ba5
commit e537e6f88f
4 changed files with 43 additions and 4 deletions

View File

@@ -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 */);
});
}

View File

@@ -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,

View File

@@ -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;
}
}
}

View File

@@ -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 */);
}
/**