Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 013cba72 authored by Alex Johnston's avatar Alex Johnston Committed by Automerger Merge Worker
Browse files

Merge "Add exemption check for OP_SYSTEM_EXEMPT_FROM_SUSPENSION" into udc-dev am: d4793dbb

parents b0f4fa18 d4793dbb
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.admin.DevicePolicyManagerInternal;
import android.content.Intent;
@@ -39,6 +40,7 @@ import android.os.PersistableBundle;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.DeviceConfig;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.IntArray;
@@ -63,6 +65,9 @@ import java.util.Set;
import java.util.function.Predicate;

public final class SuspendPackageHelper {

    private static final String SYSTEM_EXEMPT_FROM_SUSPENSION = "system_exempt_from_suspension";

    // TODO(b/198166813): remove PMS dependency
    private final PackageManagerService mPm;
    private final PackageManagerServiceInjector mInjector;
@@ -502,6 +507,10 @@ public final class SuspendPackageHelper {
            final String requiredPermissionControllerPackage =
                    getKnownPackageName(snapshot, KnownPackages.PACKAGE_PERMISSION_CONTROLLER,
                            userId);
            final AppOpsManager appOpsManager = mInjector.getSystemService(AppOpsManager.class);
            final boolean isSystemExemptFlagEnabled = DeviceConfig.getBoolean(
                    DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE,
                    SYSTEM_EXEMPT_FROM_SUSPENSION, /* defaultValue= */ true);
            for (int i = 0; i < packageNames.length; i++) {
                canSuspend[i] = false;
                final String packageName = packageNames[i];
@@ -558,6 +567,7 @@ public final class SuspendPackageHelper {
                PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
                AndroidPackage pkg = packageState == null ? null : packageState.getPkg();
                if (pkg != null) {
                    final int uid = UserHandle.getUid(userId, packageState.getAppId());
                    // Cannot suspend SDK libs as they are controlled by SDK manager.
                    if (pkg.isSdkLibrary()) {
                        Slog.w(TAG, "Cannot suspend package: " + packageName
@@ -574,6 +584,13 @@ public final class SuspendPackageHelper {
                                + pkg.getStaticSharedLibraryName());
                        continue;
                    }
                    if (isSystemExemptFlagEnabled && appOpsManager.checkOpNoThrow(
                            AppOpsManager.OP_SYSTEM_EXEMPT_FROM_SUSPENSION, uid, packageName)
                            == AppOpsManager.MODE_ALLOWED) {
                        Slog.w(TAG, "Cannot suspend package \"" + packageName
                                + "\": has OP_SYSTEM_EXEMPT_FROM_SUSPENSION set");
                        continue;
                    }
                }
                if (PLATFORM_PACKAGE_NAME.equals(packageName)) {
                    Slog.w(TAG, "Cannot suspend the platform package: " + packageName);