diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java index 4b662670f5e73..f669e94c17795 100644 --- a/core/java/com/android/internal/util/ArrayUtils.java +++ b/core/java/com/android/internal/util/ArrayUtils.java @@ -32,6 +32,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.function.IntFunction; /** * ArrayUtils contains some methods that you can call to find out @@ -656,4 +657,30 @@ public class ArrayUtils { throw new ArrayIndexOutOfBoundsException("length=" + len + "; index=" + index); } } + + /** + * Returns an array with values from {@code val} minus {@code null} values + * + * @param arrayConstructor typically {@code T[]::new} e.g. {@code String[]::new} + */ + public static T[] filterNotNull(T[] val, IntFunction arrayConstructor) { + int nullCount = 0; + int size = size(val); + for (int i = 0; i < size; i++) { + if (val[i] == null) { + nullCount++; + } + } + if (nullCount == 0) { + return val; + } + T[] result = arrayConstructor.apply(size - nullCount); + int outIdx = 0; + for (int i = 0; i < size; i++) { + if (val[i] != null) { + result[outIdx++] = val[i]; + } + } + return result; + } } diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java index 68fe1d8a05f80..51619cf940a8b 100644 --- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java @@ -46,7 +46,6 @@ import android.os.Environment; import android.os.Handler; import android.os.Looper; import android.os.Message; -import android.os.SystemProperties; import android.os.UserHandle; import android.os.storage.StorageManager; import android.permission.PermissionManager; @@ -1059,6 +1058,17 @@ public final class DefaultPermissionGrantPolicy { return; } + // Intersect the requestedPermissions for a factory image with that of its current update + // in case the latter one removed a + String[] requestedByNonSystemPackage = getPackageInfo(pkg.packageName).requestedPermissions; + int size = requestedPermissions.length; + for (int i = 0; i < size; i++) { + if (!ArrayUtils.contains(requestedByNonSystemPackage, requestedPermissions[i])) { + requestedPermissions[i] = null; + } + } + requestedPermissions = ArrayUtils.filterNotNull(requestedPermissions, String[]::new); + PackageManager pm = mContext.getPackageManager(); final ArraySet permissions = new ArraySet<>(permissionsWithoutSplits); ApplicationInfo applicationInfo = pkg.applicationInfo;