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:
@@ -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();
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user