Call into ART Service for to delete OAT artifacts when it is enabled.

PackageManagerService.deleteOatArtifactsOfPackage is used e.g. from
AppHibernationService via the deprecated
PackageManagerInternalBase.deleteOatArtifactsOfPackage.

Test: adb shell cmd app_hibernation set-state --global com.android.egg true
  with dalvik.vm.useartservice=true and check that ART Service gets
  called and returns a freed byte count.
Bug: 251903639
Change-Id: I7bc01274067abaf1f8de8c0d82020550d23a22f9
This commit is contained in:
Martin Stjernholm
2023-01-16 22:31:25 +00:00
parent a578a8db22
commit ff7a8d6b69
3 changed files with 32 additions and 21 deletions

View File

@@ -168,13 +168,7 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
Log.i(TAG, "Low on space, deleting oat files in an attempt to free up space: "
+ DexOptHelper.packagesToString(others));
for (PackageStateInternal pkg : others) {
// TODO(b/251903639): Call into ART Service.
try {
mPackageManagerService.deleteOatArtifactsOfPackage(
snapshot, pkg.getPackageName());
} catch (LegacyDexoptDisabledException e) {
throw new RuntimeException(e);
}
mPackageManagerService.deleteOatArtifactsOfPackage(snapshot, pkg.getPackageName());
}
}
long spaceAvailableNow = getAvailableSpace();

View File

@@ -47,7 +47,6 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.SparseArray;
import com.android.server.pm.Installer.LegacyDexoptDisabledException;
import com.android.server.pm.dex.DexManager;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.pkg.AndroidPackage;
@@ -708,12 +707,7 @@ abstract class PackageManagerInternalBase extends PackageManagerInternal {
@Override
@Deprecated
public final long deleteOatArtifactsOfPackage(String packageName) {
// TODO(b/251903639): Call into ART Service.
try {
return mService.deleteOatArtifactsOfPackage(snapshot(), packageName);
} catch (LegacyDexoptDisabledException e) {
throw new RuntimeException(e);
}
return mService.deleteOatArtifactsOfPackage(snapshot(), packageName);
}
@Override

View File

@@ -196,6 +196,7 @@ import com.android.server.SystemConfig;
import com.android.server.Watchdog;
import com.android.server.apphibernation.AppHibernationManagerInternal;
import com.android.server.art.DexUseManagerLocal;
import com.android.server.art.model.DeleteResult;
import com.android.server.compat.CompatChange;
import com.android.server.compat.PlatformCompat;
import com.android.server.pm.Installer.InstallerException;
@@ -7106,17 +7107,39 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return AndroidPackageUtils.canHaveOatDir(packageState, packageState.getPkg());
}
long deleteOatArtifactsOfPackage(@NonNull Computer snapshot, String packageName)
throws LegacyDexoptDisabledException {
long deleteOatArtifactsOfPackage(@NonNull Computer snapshot, String packageName) {
PackageManagerServiceUtils.enforceSystemOrRootOrShell(
"Only the system or shell can delete oat artifacts");
PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
if (packageState == null || packageState.getPkg() == null) {
return -1; // error code of deleteOptimizedFiles
if (DexOptHelper.useArtService()) {
// TODO(chiuwinson): Retrieve filtered snapshot from Computer instance instead.
try (PackageManagerLocal.FilteredSnapshot filteredSnapshot =
PackageManagerServiceUtils.getPackageManagerLocal()
.withFilteredSnapshot()) {
try {
DeleteResult res = DexOptHelper.getArtManagerLocal().deleteDexoptArtifacts(
filteredSnapshot, packageName);
return res.getFreedBytes();
} catch (IllegalArgumentException e) {
Log.e(TAG, e.toString());
return -1;
} catch (IllegalStateException e) {
Slog.wtfStack(TAG, e.toString());
return -1;
}
}
} else {
PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
if (packageState == null || packageState.getPkg() == null) {
return -1; // error code of deleteOptimizedFiles
}
try {
return mDexManager.deleteOptimizedFiles(
ArtUtils.createArtPackageInfo(packageState.getPkg(), packageState));
} catch (LegacyDexoptDisabledException e) {
throw new RuntimeException(e);
}
}
return mDexManager.deleteOptimizedFiles(
ArtUtils.createArtPackageInfo(packageState.getPkg(), packageState));
}
List<String> getMimeGroupInternal(@NonNull Computer snapshot, String packageName,