summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt2
-rw-r--r--core/api/system-current.txt15
-rw-r--r--core/java/android/app/AppOpsManager.java2
-rw-r--r--core/java/android/content/pm/Signature.java4
-rw-r--r--core/java/android/os/BatteryStats.java1
-rw-r--r--core/java/android/os/BatteryUsageStatsQuery.java12
-rw-r--r--core/java/android/os/UidBatteryConsumer.java18
-rw-r--r--core/java/android/telephony/TelephonyRegistryManager.java203
-rw-r--r--core/java/com/android/internal/os/AudioPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/BatteryUsageStatsProvider.java7
-rw-r--r--core/java/com/android/internal/os/BluetoothPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/CpuPowerCalculator.java4
-rw-r--r--core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java4
-rw-r--r--core/java/com/android/internal/os/GnssPowerCalculator.java5
-rw-r--r--core/java/com/android/internal/os/MobileRadioPowerCalculator.java8
-rw-r--r--core/java/com/android/internal/os/ScreenPowerCalculator.java13
-rw-r--r--core/java/com/android/internal/os/SensorPowerCalculator.java4
-rw-r--r--core/java/com/android/internal/os/UserPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/VideoPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/WakelockPowerCalculator.java6
-rw-r--r--core/java/com/android/internal/os/WifiPowerCalculator.java7
-rw-r--r--core/java/com/android/internal/telephony/ICarrierPrivilegesCallback.aidl (renamed from core/java/com/android/internal/telephony/ICarrierPrivilegesListener.aidl)3
-rw-r--r--core/java/com/android/internal/telephony/ITelephonyRegistry.aidl10
-rw-r--r--core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp24
-rw-r--r--core/res/AndroidManifest.xml6
-rw-r--r--core/res/res/values/config.xml2
-rw-r--r--core/res/res/values/strings.xml4
-rw-r--r--data/etc/platform.xml2
-rw-r--r--graphics/java/android/graphics/drawable/RippleDrawable.java17
-rw-r--r--packages/SystemUI/src/com/android/keyguard/LockIconViewController.java2
-rw-r--r--packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java16
-rw-r--r--packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java10
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java53
-rw-r--r--services/core/java/android/content/pm/PackageManagerInternal.java3
-rw-r--r--services/core/java/com/android/server/TelephonyRegistry.java85
-rw-r--r--services/core/java/com/android/server/am/BatteryStatsService.java3
-rw-r--r--services/core/java/com/android/server/pm/ApkChecksums.java2
-rw-r--r--services/core/java/com/android/server/pm/AppsFilter.java9
-rw-r--r--services/core/java/com/android/server/pm/BackgroundDexOptService.java29
-rw-r--r--services/core/java/com/android/server/pm/Computer.java240
-rw-r--r--services/core/java/com/android/server/pm/ComputerEngine.java34
-rw-r--r--services/core/java/com/android/server/pm/ComputerLocked.java853
-rw-r--r--services/core/java/com/android/server/pm/ComputerTracker.java1327
-rw-r--r--services/core/java/com/android/server/pm/DeletePackageHelper.java49
-rw-r--r--services/core/java/com/android/server/pm/DexOptHelper.java38
-rw-r--r--services/core/java/com/android/server/pm/DomainVerificationConnection.java12
-rw-r--r--services/core/java/com/android/server/pm/DumpHelper.java27
-rw-r--r--services/core/java/com/android/server/pm/IPackageManagerBase.java1189
-rw-r--r--services/core/java/com/android/server/pm/IncrementalProgressListener.java3
-rw-r--r--services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java2
-rw-r--r--services/core/java/com/android/server/pm/InstallPackageHelper.java33
-rw-r--r--services/core/java/com/android/server/pm/ModuleInfoProvider.java21
-rw-r--r--services/core/java/com/android/server/pm/MovePackageHelper.java129
-rw-r--r--services/core/java/com/android/server/pm/OtaDexoptService.java5
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java54
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerSession.java6
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerInternalBase.java751
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java2825
-rw-r--r--services/core/java/com/android/server/pm/PackageSender.java7
-rw-r--r--services/core/java/com/android/server/pm/PreferredActivityHelper.java157
-rw-r--r--services/core/java/com/android/server/pm/PreferredComponent.java11
-rw-r--r--services/core/java/com/android/server/pm/RemovePackageHelper.java10
-rw-r--r--services/core/java/com/android/server/pm/ResolveIntentHelper.java12
-rw-r--r--services/core/java/com/android/server/pm/SharedLibrariesImpl.java4
-rw-r--r--services/core/java/com/android/server/pm/StorageEventHelper.java13
-rw-r--r--services/core/java/com/android/server/pm/SuspendPackageHelper.java106
-rw-r--r--services/core/java/com/android/server/pm/UserManagerService.java4
-rw-r--r--services/core/java/com/android/server/pm/WatchedIntentFilter.java2
-rw-r--r--services/core/java/com/android/server/pm/dex/ArtManagerService.java21
-rw-r--r--services/core/java/com/android/server/pm/dex/DexManager.java32
-rw-r--r--services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java32
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java4
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt2
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt22
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt57
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java147
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java106
78 files changed, 5737 insertions, 3233 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 0cadde1073d2..9edc2dfdb4e3 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -142,7 +142,7 @@ package android {
field @Deprecated public static final String READ_INPUT_STATE = "android.permission.READ_INPUT_STATE";
field public static final String READ_LOGS = "android.permission.READ_LOGS";
field public static final String READ_MEDIA_AUDIO = "android.permission.READ_MEDIA_AUDIO";
- field public static final String READ_MEDIA_IMAGE = "android.permission.READ_MEDIA_IMAGE";
+ field public static final String READ_MEDIA_IMAGES = "android.permission.READ_MEDIA_IMAGES";
field public static final String READ_MEDIA_VIDEO = "android.permission.READ_MEDIA_VIDEO";
field public static final String READ_NEARBY_STREAMING_POLICY = "android.permission.READ_NEARBY_STREAMING_POLICY";
field public static final String READ_PHONE_NUMBERS = "android.permission.READ_PHONE_NUMBERS";
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index 8040a67c5e0e..0b5e7279f38c 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -13340,7 +13340,7 @@ package android.telephony {
}
public class TelephonyManager {
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void addCarrierPrivilegesListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void addCarrierPrivilegesListener(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener);
method @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.PERFORM_IMS_SINGLE_REGISTRATION}) @WorkerThread public void bootstrapAuthenticationRequest(int, @NonNull android.net.Uri, @NonNull android.telephony.gba.UaSecurityProtocolIdentifier, boolean, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.BootstrapAuthenticationCallback);
method @Deprecated @RequiresPermission(android.Manifest.permission.CALL_PHONE) public void call(String, String);
method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public android.telephony.PinResult changeIccLockPin(@NonNull String, @NonNull String);
@@ -13440,7 +13440,8 @@ package android.telephony {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyOtaEmergencyNumberDbInstalled();
method @RequiresPermission(android.Manifest.permission.REBOOT) public int prepareForUnattendedReboot();
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean rebootRadio();
- method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void removeCarrierPrivilegesListener(@NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerCarrierPrivilegesCallback(int, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CarrierPrivilegesCallback);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void removeCarrierPrivilegesListener(@NonNull android.telephony.TelephonyManager.CarrierPrivilegesListener);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void reportDefaultNetworkStatus(boolean);
method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.MODIFY_PHONE_STATE}) public void requestCellInfoUpdate(@NonNull android.os.WorkSource, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.TelephonyManager.CellInfoCallback);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void requestModemActivityInfo(@NonNull java.util.concurrent.Executor, @NonNull android.os.OutcomeReceiver<android.telephony.ModemActivityInfo,android.telephony.TelephonyManager.ModemActivityInfoException>);
@@ -13490,6 +13491,7 @@ package android.telephony {
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int[] supplyPukReportResult(String, String);
method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public boolean switchSlots(int[]);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void toggleRadioOnOff();
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterCarrierPrivilegesCallback(@NonNull android.telephony.TelephonyManager.CarrierPrivilegesCallback);
method @RequiresPermission(android.Manifest.permission.READ_ACTIVE_EMERGENCY_SESSION) public void updateOtaEmergencyNumberDbFilePath(@NonNull android.os.ParcelFileDescriptor);
method public void updateServiceLocation();
field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_ANOMALY_REPORTED = "android.telephony.action.ANOMALY_REPORTED";
@@ -13595,8 +13597,13 @@ package android.telephony {
field public static final int RESULT_SUCCESS = 0; // 0x0
}
- public static interface TelephonyManager.CarrierPrivilegesListener {
- method public void onCarrierPrivilegesChanged(@NonNull java.util.List<java.lang.String>, @NonNull int[]);
+ public static interface TelephonyManager.CarrierPrivilegesCallback {
+ method public void onCarrierPrivilegesChanged(@NonNull java.util.Set<java.lang.String>, @NonNull java.util.Set<java.lang.Integer>);
+ method public default void onCarrierServiceChanged(@Nullable String, int);
+ }
+
+ @Deprecated public static interface TelephonyManager.CarrierPrivilegesListener {
+ method @Deprecated public void onCarrierPrivilegesChanged(@NonNull java.util.List<java.lang.String>, @NonNull int[]);
}
public static class TelephonyManager.ModemActivityInfoException extends java.lang.Exception {
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 7c7c7ef382c1..4829dc085bd9 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -2367,7 +2367,7 @@ public class AppOpsManager {
null, // no permission for OP_WRITE_MEDIA_AUDIO
Manifest.permission.READ_MEDIA_VIDEO,
null, // no permission for OP_WRITE_MEDIA_VIDEO
- Manifest.permission.READ_MEDIA_IMAGE,
+ Manifest.permission.READ_MEDIA_IMAGES,
null, // no permission for OP_WRITE_MEDIA_IMAGES
null, // no permission for OP_LEGACY_STORAGE
null, // no permission for OP_ACCESS_ACCESSIBILITY
diff --git a/core/java/android/content/pm/Signature.java b/core/java/android/content/pm/Signature.java
index 3f5c5d21428e..d94b0d8f9072 100644
--- a/core/java/android/content/pm/Signature.java
+++ b/core/java/android/content/pm/Signature.java
@@ -312,7 +312,7 @@ public class Signature implements Parcelable {
* @hide
*/
public static boolean areExactMatch(Signature[] a, Signature[] b) {
- return (a.length == b.length) && ArrayUtils.containsAll(a, b)
+ return (ArrayUtils.size(a) == ArrayUtils.size(b)) && ArrayUtils.containsAll(a, b)
&& ArrayUtils.containsAll(b, a);
}
@@ -387,4 +387,4 @@ public class Signature implements Parcelable {
return sPrime;
}
-} \ No newline at end of file
+}
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index de1dc8091b2a..5f9fdbfe7503 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -5655,6 +5655,7 @@ public abstract class BatteryStats implements Parcelable {
.setMaxStatsAgeMs(0)
.includePowerModels()
.includeProcessStateData()
+ .includeVirtualUids()
.build());
stats.dump(pw, prefix);
diff --git a/core/java/android/os/BatteryUsageStatsQuery.java b/core/java/android/os/BatteryUsageStatsQuery.java
index 37bd51bb66c5..b3f4d9874f4e 100644
--- a/core/java/android/os/BatteryUsageStatsQuery.java
+++ b/core/java/android/os/BatteryUsageStatsQuery.java
@@ -42,6 +42,7 @@ public final class BatteryUsageStatsQuery implements Parcelable {
FLAG_BATTERY_USAGE_STATS_POWER_PROFILE_MODEL,
FLAG_BATTERY_USAGE_STATS_INCLUDE_HISTORY,
FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA,
+ FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS,
})
@Retention(RetentionPolicy.SOURCE)
public @interface BatteryUsageStatsFlags {}
@@ -69,6 +70,8 @@ public final class BatteryUsageStatsQuery implements Parcelable {
public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA = 0x0008;
+ public static final int FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS = 0x0010;
+
private static final long DEFAULT_MAX_STATS_AGE_MS = 5 * 60 * 1000;
private final int mFlags;
@@ -271,6 +274,15 @@ public final class BatteryUsageStatsQuery implements Parcelable {
}
/**
+ * Requests to return attribution data for virtual UIDs such as
+ * {@link Process#SDK_SANDBOX_VIRTUAL_UID}.
+ */
+ public Builder includeVirtualUids() {
+ mFlags |= BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS;
+ return this;
+ }
+
+ /**
* Requests to aggregate stored snapshots between the two supplied timestamps
* @param fromTimestamp Exclusive starting timestamp, as per System.currentTimeMillis()
* @param toTimestamp Inclusive ending timestamp, as per System.currentTimeMillis()
diff --git a/core/java/android/os/UidBatteryConsumer.java b/core/java/android/os/UidBatteryConsumer.java
index a1ff923e3b94..77d1498e1597 100644
--- a/core/java/android/os/UidBatteryConsumer.java
+++ b/core/java/android/os/UidBatteryConsumer.java
@@ -202,20 +202,24 @@ public final class UidBatteryConsumer extends BatteryConsumer {
private static final String PACKAGE_NAME_UNINITIALIZED = "";
private final BatteryStats.Uid mBatteryStatsUid;
private final int mUid;
+ private final boolean mIsVirtualUid;
private String mPackageWithHighestDrain = PACKAGE_NAME_UNINITIALIZED;
private boolean mExcludeFromBatteryUsageStats;
public Builder(BatteryConsumerData data, @NonNull BatteryStats.Uid batteryStatsUid) {
- super(data, CONSUMER_TYPE_UID);
- mBatteryStatsUid = batteryStatsUid;
- mUid = batteryStatsUid.getUid();
- data.putLong(COLUMN_INDEX_UID, mUid);
+ this(data, batteryStatsUid, batteryStatsUid.getUid());
}
public Builder(BatteryConsumerData data, int uid) {
+ this(data, null, uid);
+ }
+
+ private Builder(BatteryConsumerData data, @Nullable BatteryStats.Uid batteryStatsUid,
+ int uid) {
super(data, CONSUMER_TYPE_UID);
- mBatteryStatsUid = null;
+ mBatteryStatsUid = batteryStatsUid;
mUid = uid;
+ mIsVirtualUid = mUid == Process.SDK_SANDBOX_VIRTUAL_UID;
data.putLong(COLUMN_INDEX_UID, mUid);
}
@@ -232,6 +236,10 @@ public final class UidBatteryConsumer extends BatteryConsumer {
return mUid;
}
+ public boolean isVirtualUid() {
+ return mIsVirtualUid;
+ }
+
/**
* Sets the name of the package owned by this UID that consumed the highest amount
* of power since BatteryStats reset.
diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java
index c1fcd664f6fa..f8445921d3b0 100644
--- a/core/java/android/telephony/TelephonyRegistryManager.java
+++ b/core/java/android/telephony/TelephonyRegistryManager.java
@@ -27,6 +27,7 @@ import android.os.Binder;
import android.os.Build;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.service.carrier.CarrierService;
import android.telephony.Annotation.CallState;
import android.telephony.Annotation.DataActivityType;
import android.telephony.Annotation.DisconnectCauses;
@@ -36,6 +37,7 @@ import android.telephony.Annotation.PreciseDisconnectCauses;
import android.telephony.Annotation.RadioPowerState;
import android.telephony.Annotation.SimActivationState;
import android.telephony.Annotation.SrvccState;
+import android.telephony.TelephonyManager.CarrierPrivilegesCallback;
import android.telephony.TelephonyManager.CarrierPrivilegesListener;
import android.telephony.emergency.EmergencyNumber;
import android.telephony.ims.ImsReasonInfo;
@@ -44,17 +46,19 @@ import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.listeners.ListenerExecutor;
-import com.android.internal.telephony.ICarrierPrivilegesListener;
+import com.android.internal.telephony.ICarrierPrivilegesCallback;
import com.android.internal.telephony.IOnSubscriptionsChangedListener;
import com.android.internal.telephony.ITelephonyRegistry;
import java.lang.ref.WeakReference;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
import java.util.concurrent.Executor;
+import java.util.stream.Collectors;
/**
* A centralized place to notify telephony related status changes, e.g, {@link ServiceState} update
@@ -1260,34 +1264,78 @@ public class TelephonyRegistryManager {
pkgName, attributionTag, callback, new int[0], notifyNow);
}
- private static class CarrierPrivilegesListenerWrapper extends ICarrierPrivilegesListener.Stub
+ // TODO(b/216549778): Remove listener logic once all clients switch to CarrierPrivilegesCallback
+ private static class CarrierPrivilegesCallbackWrapper extends ICarrierPrivilegesCallback.Stub
implements ListenerExecutor {
- private final WeakReference<CarrierPrivilegesListener> mListener;
- private final Executor mExecutor;
+ // Either mListener or mCallback may be null, never both
+ @Nullable private final WeakReference<CarrierPrivilegesListener> mListener;
+ @Nullable private final WeakReference<CarrierPrivilegesCallback> mCallback;
+ @NonNull private final Executor mExecutor;
+
+ CarrierPrivilegesCallbackWrapper(
+ @NonNull CarrierPrivilegesCallback callback, @NonNull Executor executor) {
+ mListener = null;
+ mCallback = new WeakReference<>(callback);
+ mExecutor = executor;
+ }
- CarrierPrivilegesListenerWrapper(CarrierPrivilegesListener listener, Executor executor) {
+ CarrierPrivilegesCallbackWrapper(
+ @NonNull CarrierPrivilegesListener listener, @NonNull Executor executor) {
mListener = new WeakReference<>(listener);
+ mCallback = null;
mExecutor = executor;
}
@Override
public void onCarrierPrivilegesChanged(
- List<String> privilegedPackageNames, int[] privilegedUids) {
- Binder.withCleanCallingIdentity(
- () ->
- executeSafely(
- mExecutor,
- mListener::get,
- cpl ->
- cpl.onCarrierPrivilegesChanged(
- privilegedPackageNames, privilegedUids)));
+ @NonNull List<String> privilegedPackageNames, @NonNull int[] privilegedUids) {
+ if (mListener != null) {
+ Binder.withCleanCallingIdentity(
+ () ->
+ executeSafely(
+ mExecutor,
+ mListener::get,
+ cpl ->
+ cpl.onCarrierPrivilegesChanged(
+ privilegedPackageNames, privilegedUids)));
+ }
+
+ if (mCallback != null) {
+ // AIDL interface does not support Set, keep the List/Array and translate them here
+ Set<String> privilegedPkgNamesSet = Set.copyOf(privilegedPackageNames);
+ Set<Integer> privilegedUidsSet = Arrays.stream(privilegedUids).boxed().collect(
+ Collectors.toSet());
+ Binder.withCleanCallingIdentity(
+ () ->
+ executeSafely(
+ mExecutor,
+ mCallback::get,
+ cpc ->
+ cpc.onCarrierPrivilegesChanged(
+ privilegedPkgNamesSet, privilegedUidsSet)));
+ }
+ }
+
+ @Override
+ public void onCarrierServiceChanged(@Nullable String packageName, int uid) {
+ if (mCallback != null) {
+ Binder.withCleanCallingIdentity(
+ () ->
+ executeSafely(
+ mExecutor,
+ mCallback::get,
+ cpc -> cpc.onCarrierServiceChanged(packageName, uid)));
+ }
}
}
- @GuardedBy("sCarrierPrivilegeListeners")
- private static final WeakHashMap<
- CarrierPrivilegesListener, WeakReference<CarrierPrivilegesListenerWrapper>>
- sCarrierPrivilegeListeners = new WeakHashMap<>();
+ // TODO(b/216549778): Change the map key to CarrierPrivilegesCallback once all clients switch to
+ // CarrierPrivilegesCallback. Before that, the key is either CarrierPrivilegesCallback or
+ // CarrierPrivilegesListener, no logic actually depends on the type.
+ @NonNull
+ @GuardedBy("sCarrierPrivilegeCallbacks")
+ private static final WeakHashMap<Object, WeakReference<CarrierPrivilegesCallbackWrapper>>
+ sCarrierPrivilegeCallbacks = new WeakHashMap<>();
/**
* Registers a {@link CarrierPrivilegesListener} on the given {@code logicalSlotIndex} to
@@ -1297,7 +1345,11 @@ public class TelephonyRegistryManager {
* @param logicalSlotIndex The SIM slot to listen on
* @param executor The executor where {@code listener} will be invoked
* @param listener The callback to register
+ *
+ * @deprecated Use {@link #addCarrierPrivilegesCallback} instead. This API will be removed
+ * prior to API finalization.
*/
+ @Deprecated
public void addCarrierPrivilegesListener(
int logicalSlotIndex,
@NonNull @CallbackExecutor Executor executor,
@@ -1305,18 +1357,18 @@ public class TelephonyRegistryManager {
if (listener == null || executor == null) {
throw new IllegalArgumentException("listener and executor must be non-null");
}
- synchronized (sCarrierPrivilegeListeners) {
- WeakReference<CarrierPrivilegesListenerWrapper> existing =
- sCarrierPrivilegeListeners.get(listener);
+ synchronized (sCarrierPrivilegeCallbacks) {
+ WeakReference<CarrierPrivilegesCallbackWrapper> existing =
+ sCarrierPrivilegeCallbacks.get(listener);
if (existing != null && existing.get() != null) {
Log.d(TAG, "addCarrierPrivilegesListener: listener already registered");
return;
}
- CarrierPrivilegesListenerWrapper wrapper =
- new CarrierPrivilegesListenerWrapper(listener, executor);
- sCarrierPrivilegeListeners.put(listener, new WeakReference<>(wrapper));
+ CarrierPrivilegesCallbackWrapper wrapper =
+ new CarrierPrivilegesCallbackWrapper(listener, executor);
+ sCarrierPrivilegeCallbacks.put(listener, new WeakReference<>(wrapper));
try {
- sRegistry.addCarrierPrivilegesListener(
+ sRegistry.addCarrierPrivilegesCallback(
logicalSlotIndex,
wrapper,
mContext.getOpPackageName(),
@@ -1331,19 +1383,84 @@ public class TelephonyRegistryManager {
* Unregisters a {@link CarrierPrivilegesListener}.
*
* @param listener The callback to unregister
+ *
+ * @deprecated Use {@link #removeCarrierPrivilegesCallback} instead. The callback will prior
+ * to API finalization.
*/
+ @Deprecated
public void removeCarrierPrivilegesListener(@NonNull CarrierPrivilegesListener listener) {
if (listener == null) {
throw new IllegalArgumentException("listener must be non-null");
}
- synchronized (sCarrierPrivilegeListeners) {
- WeakReference<CarrierPrivilegesListenerWrapper> ref =
- sCarrierPrivilegeListeners.remove(listener);
+ synchronized (sCarrierPrivilegeCallbacks) {
+ WeakReference<CarrierPrivilegesCallbackWrapper> ref =
+ sCarrierPrivilegeCallbacks.remove(listener);
if (ref == null) return;
- CarrierPrivilegesListenerWrapper wrapper = ref.get();
+ CarrierPrivilegesCallbackWrapper wrapper = ref.get();
if (wrapper == null) return;
try {
- sRegistry.removeCarrierPrivilegesListener(wrapper, mContext.getOpPackageName());
+ sRegistry.removeCarrierPrivilegesCallback(wrapper, mContext.getOpPackageName());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Registers a {@link CarrierPrivilegesCallback} on the given {@code logicalSlotIndex} to
+ * receive callbacks when the set of packages with carrier privileges changes. The callback will
+ * immediately be called with the latest state.
+ *
+ * @param logicalSlotIndex The SIM slot to listen on
+ * @param executor The executor where {@code listener} will be invoked
+ * @param callback The callback to register
+ */
+ public void addCarrierPrivilegesCallback(
+ int logicalSlotIndex,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull CarrierPrivilegesCallback callback) {
+ if (callback == null || executor == null) {
+ throw new IllegalArgumentException("callback and executor must be non-null");
+ }
+ synchronized (sCarrierPrivilegeCallbacks) {
+ WeakReference<CarrierPrivilegesCallbackWrapper> existing =
+ sCarrierPrivilegeCallbacks.get(callback);
+ if (existing != null && existing.get() != null) {
+ Log.d(TAG, "addCarrierPrivilegesCallback: callback already registered");
+ return;
+ }
+ CarrierPrivilegesCallbackWrapper wrapper =
+ new CarrierPrivilegesCallbackWrapper(callback, executor);
+ sCarrierPrivilegeCallbacks.put(callback, new WeakReference<>(wrapper));
+ try {
+ sRegistry.addCarrierPrivilegesCallback(
+ logicalSlotIndex,
+ wrapper,
+ mContext.getOpPackageName(),
+ mContext.getAttributionTag());
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Unregisters a {@link CarrierPrivilegesCallback}.
+ *
+ * @param callback The callback to unregister
+ */
+ public void removeCarrierPrivilegesCallback(@NonNull CarrierPrivilegesCallback callback) {
+ if (callback == null) {
+ throw new IllegalArgumentException("listener must be non-null");
+ }
+ synchronized (sCarrierPrivilegeCallbacks) {
+ WeakReference<CarrierPrivilegesCallbackWrapper> ref =
+ sCarrierPrivilegeCallbacks.remove(callback);
+ if (ref == null) return;
+ CarrierPrivilegesCallbackWrapper wrapper = ref.get();
+ if (wrapper == null) return;
+ try {
+ sRegistry.removeCarrierPrivilegesCallback(wrapper, mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -1359,15 +1476,33 @@ public class TelephonyRegistryManager {
*/
public void notifyCarrierPrivilegesChanged(
int logicalSlotIndex,
- @NonNull List<String> privilegedPackageNames,
- @NonNull int[] privilegedUids) {
+ @NonNull Set<String> privilegedPackageNames,
+ @NonNull Set<Integer> privilegedUids) {
if (privilegedPackageNames == null || privilegedUids == null) {
throw new IllegalArgumentException(
"privilegedPackageNames and privilegedUids must be non-null");
}
try {
- sRegistry.notifyCarrierPrivilegesChanged(
- logicalSlotIndex, privilegedPackageNames, privilegedUids);
+ // AIDL doesn't support Set yet. Convert Set to List/Array
+ List<String> pkgList = List.copyOf(privilegedPackageNames);
+ int[] uids = privilegedUids.stream().mapToInt(Number::intValue).toArray();
+ sRegistry.notifyCarrierPrivilegesChanged(logicalSlotIndex, pkgList, uids);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Notify listeners that the {@link CarrierService} for current user has changed.
+ *
+ * @param logicalSlotIndex the SIM slot the change occurred on
+ * @param packageName the package name of the changed {@link CarrierService}
+ * @param uid the UID of the changed {@link CarrierService}
+ */
+ public void notifyCarrierServiceChanged(int logicalSlotIndex, @Nullable String packageName,
+ int uid) {
+ try {
+ sRegistry.notifyCarrierServiceChanged(logicalSlotIndex, packageName, uid);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/core/java/com/android/internal/os/AudioPowerCalculator.java b/core/java/com/android/internal/os/AudioPowerCalculator.java
index f9310b0c28d9..ebf0ca263a62 100644
--- a/core/java/com/android/internal/os/AudioPowerCalculator.java
+++ b/core/java/com/android/internal/os/AudioPowerCalculator.java
@@ -78,7 +78,9 @@ public class AudioPowerCalculator extends PowerCalculator {
final double powerMah = mPowerEstimator.calculatePower(durationMs);
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_AUDIO, durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_AUDIO, powerMah);
- total.durationMs += durationMs;
- total.powerMah += powerMah;
+ if (!app.isVirtualUid()) {
+ total.durationMs += durationMs;
+ total.powerMah += powerMah;
+ }
}
}
diff --git a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
index a1c1917fd83e..81c6ee71e060 100644
--- a/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
+++ b/core/java/com/android/internal/os/BatteryUsageStatsProvider.java
@@ -22,6 +22,7 @@ import android.os.BatteryStats;
import android.os.BatteryUsageStats;
import android.os.BatteryUsageStatsQuery;
import android.os.Parcel;
+import android.os.Process;
import android.os.SystemClock;
import android.os.UidBatteryConsumer;
import android.util.Log;
@@ -162,6 +163,8 @@ public class BatteryUsageStatsProvider {
final boolean includeProcessStateData = ((query.getFlags()
& BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_PROCESS_STATE_DATA) != 0)
&& mStats.isProcessStateDataAvailable();
+ final boolean includeVirtualUids = ((query.getFlags()
+ & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_VIRTUAL_UIDS) != 0);
final BatteryUsageStats.Builder batteryUsageStatsBuilder = new BatteryUsageStats.Builder(
mStats.getCustomEnergyConsumerNames(), includePowerModels,
@@ -174,6 +177,10 @@ public class BatteryUsageStatsProvider {
SparseArray<? extends BatteryStats.Uid> uidStats = mStats.getUidStats();
for (int i = uidStats.size() - 1; i >= 0; i--) {
final BatteryStats.Uid uid = uidStats.valueAt(i);
+ if (!includeVirtualUids && uid.getUid() == Process.SDK_SANDBOX_VIRTUAL_UID) {
+ continue;
+ }
+
batteryUsageStatsBuilder.getOrCreateUidBatteryConsumerBuilder(uid)
.setTimeInStateMs(UidBatteryConsumer.STATE_BACKGROUND,
getProcessBackgroundTimeMs(uid, realtimeUs))
diff --git a/core/java/com/android/internal/os/BluetoothPowerCalculator.java b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
index 2ebf689e2c7f..e52c8a3a3efb 100644
--- a/core/java/com/android/internal/os/BluetoothPowerCalculator.java
+++ b/core/java/com/android/internal/os/BluetoothPowerCalculator.java
@@ -139,8 +139,10 @@ public class BluetoothPowerCalculator extends PowerCalculator {
BatteryConsumer.POWER_COMPONENT_BLUETOOTH, powerAndDuration.powerMah,
powerModel);
- powerAndDuration.totalDurationMs += powerAndDuration.durationMs;
- powerAndDuration.totalPowerMah += powerAndDuration.powerMah;
+ if (!app.isVirtualUid()) {
+ powerAndDuration.totalDurationMs += powerAndDuration.durationMs;
+ powerAndDuration.totalPowerMah += powerAndDuration.powerMah;
+ }
if (query.isProcessStateDataNeeded() && powerAndDuration.keys != null) {
for (int j = 0; j < powerAndDuration.keys.length; j++) {
diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java
index 1fc2baf040b6..8704e936c747 100644
--- a/core/java/com/android/internal/os/CpuPowerCalculator.java
+++ b/core/java/com/android/internal/os/CpuPowerCalculator.java
@@ -117,7 +117,9 @@ public class CpuPowerCalculator extends PowerCalculator {
}
}
calculateApp(app, app.getBatteryStatsUid(), query, result, keys);
- totalPowerMah += result.powerMah;
+ if (!app.isVirtualUid()) {
+ totalPowerMah += result.powerMah;
+ }
}
final long consumptionUC = batteryStats.getCpuMeasuredBatteryConsumptionUC();
diff --git a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java
index cbbb52621111..0853bd801137 100644
--- a/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java
+++ b/core/java/com/android/internal/os/CustomMeasuredPowerCalculator.java
@@ -96,7 +96,9 @@ public class CustomMeasuredPowerCalculator extends PowerCalculator {
app.setConsumedPowerForCustomComponent(
BatteryConsumer.FIRST_CUSTOM_POWER_COMPONENT_ID + i,
customMeasuredPowerMah[i]);
- newTotalPowerMah[i] += customMeasuredPowerMah[i];
+ if (!app.isVirtualUid()) {
+ newTotalPowerMah[i] += customMeasuredPowerMah[i];
+ }
}
}
return newTotalPowerMah;
diff --git a/core/java/com/android/internal/os/GnssPowerCalculator.java b/core/java/com/android/internal/os/GnssPowerCalculator.java
index 0f783062f3e7..070783a04105 100644
--- a/core/java/com/android/internal/os/GnssPowerCalculator.java
+++ b/core/java/com/android/internal/os/GnssPowerCalculator.java
@@ -58,8 +58,11 @@ public class GnssPowerCalculator extends PowerCalculator {
final long consumptionUC =
app.getBatteryStatsUid().getGnssMeasuredBatteryConsumptionUC();
final int powerModel = getPowerModel(consumptionUC, query);
- appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), powerModel,
+ final double powerMah = calculateApp(app, app.getBatteryStatsUid(), powerModel,
rawRealtimeUs, averageGnssPowerMa, consumptionUC);
+ if (!app.isVirtualUid()) {
+ appsPowerMah += powerMah;
+ }
}
final long consumptionUC = batteryStats.getGnssMeasuredBatteryConsumptionUC();
diff --git a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
index f4624de289be..d0df45c9af65 100644
--- a/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
+++ b/core/java/com/android/internal/os/MobileRadioPowerCalculator.java
@@ -136,12 +136,14 @@ public class MobileRadioPowerCalculator extends PowerCalculator {
PowerAndDuration total,
BatteryUsageStatsQuery query, BatteryConsumer.Key[] keys) {
final long radioActiveDurationMs = calculateDuration(u, BatteryStats.STATS_SINCE_CHARGED);
- total.totalAppDurationMs += radioActiveDurationMs;
-
final long consumptionUC = u.getMobileRadioMeasuredBatteryConsumptionUC();
final int powerModel = getPowerModel(consumptionUC, query);
final double powerMah = calculatePower(u, powerModel, radioActiveDurationMs, consumptionUC);
- total.totalAppPowerMah += powerMah;
+
+ if (!app.isVirtualUid()) {
+ total.totalAppDurationMs += radioActiveDurationMs;
+ total.totalAppPowerMah += powerMah;
+ }
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_MOBILE_RADIO,
radioActiveDurationMs)
diff --git a/core/java/com/android/internal/os/ScreenPowerCalculator.java b/core/java/com/android/internal/os/ScreenPowerCalculator.java
index 67d3d6e7bede..5ca1a857fbcd 100644
--- a/core/java/com/android/internal/os/ScreenPowerCalculator.java
+++ b/core/java/com/android/internal/os/ScreenPowerCalculator.java
@@ -96,8 +96,10 @@ public class ScreenPowerCalculator extends PowerCalculator {
appPowerAndDuration.durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_SCREEN,
appPowerAndDuration.powerMah, powerModel);
- totalAppPower += appPowerAndDuration.powerMah;
- totalAppDuration += appPowerAndDuration.durationMs;
+ if (!app.isVirtualUid()) {
+ totalAppPower += appPowerAndDuration.powerMah;
+ totalAppDuration += appPowerAndDuration.durationMs;
+ }
}
break;
case BatteryConsumer.POWER_MODEL_POWER_PROFILE:
@@ -192,10 +194,13 @@ public class ScreenPowerCalculator extends PowerCalculator {
long totalActivityTimeMs = 0;
final SparseLongArray activityTimeArray = new SparseLongArray();
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
- final BatteryStats.Uid uid = uidBatteryConsumerBuilders.valueAt(i).getBatteryStatsUid();
+ final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
+ final BatteryStats.Uid uid = app.getBatteryStatsUid();
final long timeMs = getProcessForegroundTimeMs(uid, rawRealtimeUs);
activityTimeArray.put(uid.getUid(), timeMs);
- totalActivityTimeMs += timeMs;
+ if (!app.isVirtualUid()) {
+ totalActivityTimeMs += timeMs;
+ }
}
if (totalActivityTimeMs >= MIN_ACTIVE_TIME_FOR_SMEARING) {
diff --git a/core/java/com/android/internal/os/SensorPowerCalculator.java b/core/java/com/android/internal/os/SensorPowerCalculator.java
index 4a9c91d14c4c..573692ea63f3 100644
--- a/core/java/com/android/internal/os/SensorPowerCalculator.java
+++ b/core/java/com/android/internal/os/SensorPowerCalculator.java
@@ -51,7 +51,9 @@ public class SensorPowerCalculator extends PowerCalculator {
builder.getUidBatteryConsumerBuilders();
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
final UidBatteryConsumer.Builder app = uidBatteryConsumerBuilders.valueAt(i);
- appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs);
+ if (!app.isVirtualUid()) {
+ appsPowerMah += calculateApp(app, app.getBatteryStatsUid(), rawRealtimeUs);
+ }
}
builder.getAggregateBatteryConsumerBuilder(
diff --git a/core/java/com/android/internal/os/UserPowerCalculator.java b/core/java/com/android/internal/os/UserPowerCalculator.java
index 22cff6e2435a..79e3a195dc82 100644
--- a/core/java/com/android/internal/os/UserPowerCalculator.java
+++ b/core/java/com/android/internal/os/UserPowerCalculator.java
@@ -49,7 +49,11 @@ public class UserPowerCalculator extends PowerCalculator {
builder.getUidBatteryConsumerBuilders();
for (int i = uidBatteryConsumerBuilders.size() - 1; i >= 0; i--) {
- UidBatteryConsumer.Builder uidBuilder = uidBatteryConsumerBuilders.valueAt(i);
+ final UidBatteryConsumer.Builder uidBuilder = uidBatteryConsumerBuilders.valueAt(i);
+ if (uidBuilder.isVirtualUid()) {
+ continue;
+ }
+
final int uid = uidBuilder.getUid();
if (UserHandle.getAppId(uid) < Process.FIRST_APPLICATION_UID) {
continue;
diff --git a/core/java/com/android/internal/os/VideoPowerCalculator.java b/core/java/com/android/internal/os/VideoPowerCalculator.java
index a222bcb4dfbf..2daf15eb14a6 100644
--- a/core/java/com/android/internal/os/VideoPowerCalculator.java
+++ b/core/java/com/android/internal/os/VideoPowerCalculator.java
@@ -75,7 +75,9 @@ public class VideoPowerCalculator extends PowerCalculator {
final double powerMah = mPowerEstimator.calculatePower(durationMs);
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_VIDEO, durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_VIDEO, powerMah);
- total.durationMs += durationMs;
- total.powerMah += powerMah;
+ if (!app.isVirtualUid()) {
+ total.durationMs += durationMs;
+ total.powerMah += powerMah;
+ }
}
}
diff --git a/core/java/com/android/internal/os/WakelockPowerCalculator.java b/core/java/com/android/internal/os/WakelockPowerCalculator.java
index 0251e1ccc885..3ae7113faf71 100644
--- a/core/java/com/android/internal/os/WakelockPowerCalculator.java
+++ b/core/java/com/android/internal/os/WakelockPowerCalculator.java
@@ -62,8 +62,10 @@ public class WakelockPowerCalculator extends PowerCalculator {
BatteryStats.STATS_SINCE_CHARGED);
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.durationMs)
.setConsumedPower(BatteryConsumer.POWER_COMPONENT_WAKELOCK, result.powerMah);
- totalAppDurationMs += result.durationMs;
- appPowerMah += result.powerMah;
+ if (!app.isVirtualUid()) {
+ totalAppDurationMs += result.durationMs;
+ appPowerMah += result.powerMah;
+ }
if (app.getUid() == Process.ROOT_UID) {
osBatteryConsumer = app;
diff --git a/core/java/com/android/internal/os/WifiPowerCalculator.java b/core/java/com/android/internal/os/WifiPowerCalculator.java
index 8c3fb86331b2..2181821dd55a 100644
--- a/core/java/com/android/internal/os/WifiPowerCalculator.java
+++ b/core/java/com/android/internal/os/WifiPowerCalculator.java
@@ -111,9 +111,10 @@ public class WifiPowerCalculator extends PowerCalculator {
calculateApp(powerDurationAndTraffic, app.getBatteryStatsUid(), powerModel,
rawRealtimeUs, BatteryStats.STATS_SINCE_CHARGED,
batteryStats.hasWifiActivityReporting(), consumptionUC);
-
- totalAppDurationMs += powerDurationAndTraffic.durationMs;
- totalAppPowerMah += powerDurationAndTraffic.powerMah;
+ if (!app.isVirtualUid()) {
+ totalAppDurationMs += powerDurationAndTraffic.durationMs;
+ totalAppPowerMah += powerDurationAndTraffic.powerMah;
+ }
app.setUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_WIFI,
powerDurationAndTraffic.durationMs);
diff --git a/core/java/com/android/internal/telephony/ICarrierPrivilegesListener.aidl b/core/java/com/android/internal/telephony/ICarrierPrivilegesCallback.aidl
index 6ca8cecba3c8..0c8e73fb2b67 100644
--- a/core/java/com/android/internal/telephony/ICarrierPrivilegesListener.aidl
+++ b/core/java/com/android/internal/telephony/ICarrierPrivilegesCallback.aidl
@@ -16,7 +16,8 @@
package com.android.internal.telephony;
-oneway interface ICarrierPrivilegesListener {
+oneway interface ICarrierPrivilegesCallback {
void onCarrierPrivilegesChanged(
in List<String> privilegedPackageNames, in int[] privilegedUids);
+ void onCarrierServiceChanged(in String carrierServicePackageName, in int carrierServiceUid);
}
diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl
index 9712d7e38a4b..c7fa757ac0b7 100644
--- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl
+++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl
@@ -32,7 +32,7 @@ import android.telephony.PreciseDataConnectionState;
import android.telephony.ServiceState;
import android.telephony.SignalStrength;
import android.telephony.emergency.EmergencyNumber;
-import com.android.internal.telephony.ICarrierPrivilegesListener;
+import com.android.internal.telephony.ICarrierPrivilegesCallback;
import com.android.internal.telephony.IPhoneStateListener;
import com.android.internal.telephony.IOnSubscriptionsChangedListener;
@@ -102,9 +102,11 @@ interface ITelephonyRegistry {
void notifyLinkCapacityEstimateChanged(in int phoneId, in int subId,
in List<LinkCapacityEstimate> linkCapacityEstimateList);
- void addCarrierPrivilegesListener(
- int phoneId, ICarrierPrivilegesListener callback, String pkg, String featureId);
- void removeCarrierPrivilegesListener(ICarrierPrivilegesListener callback, String pkg);
+ void addCarrierPrivilegesCallback(
+ int phoneId, ICarrierPrivilegesCallback callback, String pkg, String featureId);
+ void removeCarrierPrivilegesCallback(ICarrierPrivilegesCallback callback, String pkg);
void notifyCarrierPrivilegesChanged(
int phoneId, in List<String> privilegedPackageNames, in int[] privilegedUids);
+ void notifyCarrierServiceChanged(int phoneId, in String packageName, int uid);
+
}
diff --git a/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp b/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp
index 0c05da551c8f..679a4f070290 100644
--- a/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp
+++ b/core/jni/com_android_internal_os_ZygoteCommandBuffer.cpp
@@ -34,6 +34,7 @@
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/socket.h>
+#include <sys/system_properties.h>
#include <vector>
namespace android {
@@ -43,10 +44,10 @@ using android::base::StringPrintf;
using android::zygote::ZygoteFailure;
// WARNING: Knows a little about the wire protocol used to communicate with Zygote.
-// TODO: Fix error handling.
+// Commands and nice names have large arbitrary size limits to avoid dynamic memory allocation.
constexpr size_t MAX_COMMAND_BYTES = 32768;
-constexpr size_t NICE_NAME_BYTES = 50;
+constexpr size_t NICE_NAME_BYTES = 128;
// A buffer optionally bundled with a file descriptor from which we can fill it.
// Does not own the file descriptor; destroying a NativeCommandBuffer does not
@@ -190,6 +191,9 @@ class NativeCommandBuffer {
size_t copy_len = std::min(name_len, NICE_NAME_BYTES - 1);
memcpy(mNiceName, arg_start + NN_LENGTH, copy_len);
mNiceName[copy_len] = '\0';
+ if (haveWrapProperty()) {
+ return false;
+ }
continue;
}
if (arg_end - arg_start == IW_LENGTH
@@ -222,6 +226,8 @@ class NativeCommandBuffer {
}
saw_setgid = true;
}
+ // ro.debuggable can be handled entirely in the child unless --invoke-with is also specified.
+ // Thus we do not need to check it here.
}
return saw_runtime_args && saw_setuid && saw_setgid;
}
@@ -249,6 +255,14 @@ class NativeCommandBuffer {
}
private:
+ bool haveWrapProperty() {
+ static const char* WRAP = "wrap.";
+ static const size_t WRAP_LENGTH = strlen(WRAP);
+ char propNameBuf[WRAP_LENGTH + NICE_NAME_BYTES];
+ strcpy(propNameBuf, WRAP);
+ strlcpy(propNameBuf + WRAP_LENGTH, mNiceName, NICE_NAME_BYTES);
+ return __system_property_find(propNameBuf) != nullptr;
+ }
// Picky version of atoi(). No sign or unexpected characters allowed. Return -1 on failure.
static int digitsVal(char* start, char* end) {
int result = 0;
@@ -269,7 +283,7 @@ class NativeCommandBuffer {
uint32_t mNext; // Index of first character past last line returned by readLine.
int32_t mLinesLeft; // Lines in current command that haven't yet been read.
int mFd; // Open file descriptor from which we can read more. -1 if none.
- char mNiceName[NICE_NAME_BYTES];
+ char mNiceName[NICE_NAME_BYTES]; // Always null terminated.
char mBuffer[MAX_COMMAND_BYTES];
};
@@ -372,6 +386,7 @@ jboolean com_android_internal_os_ZygoteCommandBuffer_nativeForkRepeatedly(
jint minUid,
jstring managed_nice_name) {
+ ALOGI("Entering forkRepeatedly native zygote loop");
NativeCommandBuffer* n_buffer = reinterpret_cast<NativeCommandBuffer*>(j_buffer);
int session_socket = n_buffer->getFd();
std::vector<int> session_socket_fds {session_socket};
@@ -400,7 +415,8 @@ jboolean com_android_internal_os_ZygoteCommandBuffer_nativeForkRepeatedly(
socklen_t cred_size = sizeof credentials;
if (getsockopt(n_buffer->getFd(), SOL_SOCKET, SO_PEERCRED, &credentials, &cred_size) == -1
|| cred_size != sizeof credentials) {
- fail_fn_1(CREATE_ERROR("ForkMany failed to get initial credentials, %s", strerror(errno)));
+ fail_fn_1(CREATE_ERROR("ForkRepeatedly failed to get initial credentials, %s",
+ strerror(errno)));
}
bool first_time = true;
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index becac7f96428..10cb47ede31d 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1030,10 +1030,10 @@
targetSdkVersion}</a> of {@link android.os.Build.VERSION_CODES#S} or lower, this permission
must not be used and the READ_EXTERNAL_STORAGE permission must be used instead.
<p>Protection level: dangerous -->
- <permission android:name="android.permission.READ_MEDIA_IMAGE"
+ <permission android:name="android.permission.READ_MEDIA_IMAGES"
android:permissionGroup="android.permission-group.UNDEFINED"
- android:label="@string/permlab_readMediaImage"
- android:description="@string/permdesc_readMediaImage"
+ android:label="@string/permlab_readMediaImages"
+ android:description="@string/permdesc_readMediaImages"
android:protectionLevel="dangerous" />
<!-- Allows an application to write to external storage.
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index dc1626eaec5f..269aa1bb7729 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2723,7 +2723,7 @@
<string name="config_bandwidthEstimateSource">bandwidth_estimator</string>
<!-- Whether force to enable telephony new data stack or not -->
- <bool name="config_force_enable_telephony_new_data_stack">true</bool>
+ <bool name="config_force_enable_telephony_new_data_stack">false</bool>
<!-- Whether WiFi display is supported by this device.
There are many prerequisites for this feature to work correctly.
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 5de8feca01dc..04a70cb67d8c 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -1918,9 +1918,9 @@
<string name="permdesc_readMediaVideo">Allows the app to read video files from your shared storage.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. "shared storage" refers to a storage space on the device that all apps with this permission can read from. [CHAR LIMIT=none] -->
- <string name="permlab_readMediaImage">read image files from shared storage</string>
+ <string name="permlab_readMediaImages">read image files from shared storage</string>
<!-- Description of an application permission, listed so the user can choose whether they want to allow the application to do this. "shared storage" refers to a storage space on the device that all apps with this permission can read from. [CHAR LIMIT=none] -->
- <string name="permdesc_readMediaImage">Allows the app to read image files from your shared storage.</string>
+ <string name="permdesc_readMediaImages">Allows the app to read image files from your shared storage.</string>
<!-- Title of an application permission, listed so the user can choose whether they want to allow the application to do this. "shared storage" refers to a storage space on the device that all apps with this permission can write to. [CHAR LIMIT=none] -->
<string name="permlab_sdcardWrite">modify or delete the contents of your shared storage</string>
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 88920c865511..a8293397d7df 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -241,7 +241,7 @@
</split-permission>
<split-permission name="android.permission.READ_EXTERNAL_STORAGE"
targetSdk="33">
- <new-permission name="android.permission.READ_MEDIA_IMAGE" />
+ <new-permission name="android.permission.READ_MEDIA_IMAGES" />
</split-permission>
<split-permission name="android.permission.BLUETOOTH"
targetSdk="31">
diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java
index ffaa4ea51452..c1addbf43937 100644
--- a/graphics/java/android/graphics/drawable/RippleDrawable.java
+++ b/graphics/java/android/graphics/drawable/RippleDrawable.java
@@ -1098,19 +1098,16 @@ public class RippleDrawable extends LayerDrawable {
}
// Draw the appropriate mask anchored to (0,0).
+ final int saveCount = mMaskCanvas.save();
final int left = bounds.left;
final int top = bounds.top;
- if (mState.mRippleStyle == STYLE_SOLID) {
- mMaskCanvas.translate(-left, -top);
- }
+ mMaskCanvas.translate(-left, -top);
if (maskType == MASK_EXPLICIT) {
drawMask(mMaskCanvas);
} else if (maskType == MASK_CONTENT) {
drawContent(mMaskCanvas);
}
- if (mState.mRippleStyle == STYLE_SOLID) {
- mMaskCanvas.translate(left, top);
- }
+ mMaskCanvas.restoreToCount(saveCount);
if (mState.mRippleStyle == STYLE_PATTERNED) {
for (int i = 0; i < mRunningAnimations.size(); i++) {
mRunningAnimations.get(i).getProperties().getShader().setShader(mMaskShader);
@@ -1210,9 +1207,13 @@ public class RippleDrawable extends LayerDrawable {
updateMaskShaderIfNeeded();
// Position the shader to account for canvas translation.
- if (mMaskShader != null && mState.mRippleStyle == STYLE_SOLID) {
+ if (mMaskShader != null) {
final Rect bounds = getBounds();
- mMaskMatrix.setTranslate(bounds.left - x, bounds.top - y);
+ if (mState.mRippleStyle == STYLE_PATTERNED) {
+ mMaskMatrix.setTranslate(bounds.left, bounds.top);
+ } else {
+ mMaskMatrix.setTranslate(bounds.left - x, bounds.top - y);
+ }
mMaskShader.setLocalMatrix(mMaskMatrix);
}
diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
index 370686a1e682..74659f71eb1f 100644
--- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java
@@ -558,7 +558,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
switch(event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_HOVER_ENTER:
- if (!mDownDetected) {
+ if (!mDownDetected && mAccessibilityManager.isTouchExplorationEnabled()) {
mVibrator.vibrate(
Process.myUid(),
getContext().getOpPackageName(),
diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
index bf42db53d3d8..bc7a3f6f4b13 100644
--- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
+++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java
@@ -584,16 +584,18 @@ public class UdfpsController implements DozeReceiver {
}
/**
- * Play haptic to signal udfps scanning started.
+ * If a11y touchExplorationEnabled, play haptic to signal UDFPS scanning started.
*/
@VisibleForTesting
public void playStartHaptic() {
- mVibrator.vibrate(
- Process.myUid(),
- mContext.getOpPackageName(),
- EFFECT_CLICK,
- "udfps-onStart-click",
- VIBRATION_ATTRIBUTES);
+ if (mAccessibilityManager.isTouchExplorationEnabled()) {
+ mVibrator.vibrate(
+ Process.myUid(),
+ mContext.getOpPackageName(),
+ EFFECT_CLICK,
+ "udfps-onStart-click",
+ VIBRATION_ATTRIBUTES);
+ }
}
@Nullable
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
index 0ff010aedfff..16e573280417 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationShadeWindowControllerImpl.java
@@ -386,10 +386,12 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW
}
visible = true;
}
- if (visible) {
- mNotificationShadeView.setVisibility(View.VISIBLE);
- } else {
- mNotificationShadeView.setVisibility(View.INVISIBLE);
+ if (mNotificationShadeView != null) {
+ if (visible) {
+ mNotificationShadeView.setVisibility(View.VISIBLE);
+ } else {
+ mNotificationShadeView.setVisibility(View.INVISIBLE);
+ }
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
index 1856fda14e1b..613931f1341f 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java
@@ -48,6 +48,7 @@ import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper.RunWithLooper;
import android.view.LayoutInflater;
import android.view.MotionEvent;
+import android.view.View;
import android.view.WindowManager;
import android.view.accessibility.AccessibilityManager;
@@ -64,8 +65,8 @@ import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.statusbar.LockscreenShadeTransitionController;
import com.android.systemui.statusbar.VibratorHelper;
-import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.CentralSurfaces;
+import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.statusbar.phone.SystemUIDialogManager;
import com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController;
@@ -188,6 +189,7 @@ public class UdfpsControllerTest extends SysuiTestCase {
@Captor private ArgumentCaptor<IUdfpsOverlayController> mOverlayCaptor;
private IUdfpsOverlayController mOverlayController;
@Captor private ArgumentCaptor<UdfpsView.OnTouchListener> mTouchListenerCaptor;
+ @Captor private ArgumentCaptor<View.OnHoverListener> mHoverListenerCaptor;
@Captor private ArgumentCaptor<Runnable> mOnIlluminatedRunnableCaptor;
@Captor private ArgumentCaptor<ScreenLifecycle.Observer> mScreenObserverCaptor;
private ScreenLifecycle.Observer mScreenObserver;
@@ -568,23 +570,24 @@ public class UdfpsControllerTest extends SysuiTestCase {
}
@Test
- public void playHapticOnTouchUdfpsArea() throws RemoteException {
+ public void playHapticOnTouchUdfpsArea_a11yTouchExplorationEnabled() throws RemoteException {
// Configure UdfpsView to accept the ACTION_DOWN event
when(mUdfpsView.isIlluminationRequested()).thenReturn(false);
when(mUdfpsView.isWithinSensorArea(anyFloat(), anyFloat())).thenReturn(true);
- // GIVEN that the overlay is showing
+ // GIVEN that the overlay is showing and a11y touch exploration enabled
+ when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(true);
mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID,
BiometricOverlayConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
mFgExecutor.runAllReady();
- // WHEN ACTION_DOWN is received
- verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
- MotionEvent downEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
- downEvent.recycle();
- MotionEvent moveEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0, 0, 0);
- mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);
+ // WHEN ACTION_HOVER is received
+ verify(mUdfpsView).setOnHoverListener(mHoverListenerCaptor.capture());
+ MotionEvent enterEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_ENTER, 0, 0, 0);
+ mHoverListenerCaptor.getValue().onHover(mUdfpsView, enterEvent);
+ enterEvent.recycle();
+ MotionEvent moveEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_HOVER_MOVE, 0, 0, 0);
+ mHoverListenerCaptor.getValue().onHover(mUdfpsView, moveEvent);
moveEvent.recycle();
// THEN tick haptic is played
@@ -600,4 +603,34 @@ public class UdfpsControllerTest extends SysuiTestCase {
assertEquals(VibrationAttributes.USAGE_COMMUNICATION_REQUEST,
UdfpsController.VIBRATION_ATTRIBUTES.getUsage());
}
+
+ @Test
+ public void noHapticOnTouchUdfpsArea_a11yTouchExplorationDisabled() throws RemoteException {
+ // Configure UdfpsView to accept the ACTION_DOWN event
+ when(mUdfpsView.isIlluminationRequested()).thenReturn(false);
+ when(mUdfpsView.isWithinSensorArea(anyFloat(), anyFloat())).thenReturn(true);
+
+ // GIVEN that the overlay is showing and a11y touch exploration NOT enabled
+ when(mAccessibilityManager.isTouchExplorationEnabled()).thenReturn(false);
+ mOverlayController.showUdfpsOverlay(TEST_UDFPS_SENSOR_ID,
+ BiometricOverlayConstants.REASON_AUTH_KEYGUARD, mUdfpsOverlayControllerCallback);
+ mFgExecutor.runAllReady();
+
+ // WHEN ACTION_DOWN is received
+ verify(mUdfpsView).setOnTouchListener(mTouchListenerCaptor.capture());
+ MotionEvent downEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_DOWN, 0, 0, 0);
+ mTouchListenerCaptor.getValue().onTouch(mUdfpsView, downEvent);
+ downEvent.recycle();
+ MotionEvent moveEvent = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, 0, 0, 0);
+ mTouchListenerCaptor.getValue().onTouch(mUdfpsView, moveEvent);
+ moveEvent.recycle();
+
+ // THEN NO haptic played
+ verify(mVibrator, never()).vibrate(
+ anyInt(),
+ anyString(),
+ any(),
+ anyString(),
+ any());
+ }
}
diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java
index 68cd28809fd0..2068e6d380b7 100644
--- a/services/core/java/android/content/pm/PackageManagerInternal.java
+++ b/services/core/java/android/content/pm/PackageManagerInternal.java
@@ -48,6 +48,7 @@ import com.android.server.pm.PackageSetting;
import com.android.server.pm.dex.DynamicCodeLogger;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.AndroidPackageApi;
+import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.pm.pkg.SharedUserApi;
import com.android.server.pm.pkg.component.ParsedMainComponent;
@@ -689,6 +690,8 @@ public abstract class PackageManagerInternal {
@Nullable
public abstract PackageStateInternal getPackageStateInternal(@NonNull String packageName);
+ public abstract @Nullable PackageState getPackageState(@NonNull String packageName);
+
@NonNull
public abstract ArrayMap<String, ? extends PackageStateInternal> getPackageStates();
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 58fa9fb28a78..839cdc6eaca3 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -91,7 +91,7 @@ import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.app.IBatteryStats;
-import com.android.internal.telephony.ICarrierPrivilegesListener;
+import com.android.internal.telephony.ICarrierPrivilegesCallback;
import com.android.internal.telephony.IOnSubscriptionsChangedListener;
import com.android.internal.telephony.IPhoneStateListener;
import com.android.internal.telephony.ITelephonyRegistry;
@@ -153,7 +153,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
IPhoneStateListener callback;
IOnSubscriptionsChangedListener onSubscriptionsChangedListenerCallback;
IOnSubscriptionsChangedListener onOpportunisticSubscriptionsChangedListenerCallback;
- ICarrierPrivilegesListener carrierPrivilegesListener;
+ ICarrierPrivilegesCallback carrierPrivilegesCallback;
int callerUid;
int callerPid;
@@ -178,8 +178,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
return (onOpportunisticSubscriptionsChangedListenerCallback != null);
}
- boolean matchCarrierPrivilegesListener() {
- return carrierPrivilegesListener != null;
+ boolean matchCarrierPrivilegesCallback() {
+ return carrierPrivilegesCallback != null;
}
boolean canReadCallLog() {
@@ -199,7 +199,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
+ onSubscriptionsChangedListenerCallback
+ " onOpportunisticSubscriptionsChangedListenererCallback="
+ onOpportunisticSubscriptionsChangedListenerCallback
- + " carrierPrivilegesListener=" + carrierPrivilegesListener
+ + " carrierPrivilegesCallback=" + carrierPrivilegesCallback
+ " subId=" + subId + " phoneId=" + phoneId + " events=" + eventList + "}";
}
}
@@ -414,7 +414,9 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
mPreciseDataConnectionStates;
/** Per-phoneId snapshot of privileged packages (names + UIDs). */
- private List<Pair<List<String>, int[]>> mCarrierPrivilegeStates;
+ @NonNull private List<Pair<List<String>, int[]>> mCarrierPrivilegeStates;
+ /** Per-phoneId of CarrierService (PackageName, UID) pair. */
+ @NonNull private List<Pair<String, Integer>> mCarrierServiceStates;
/**
* Support backward compatibility for {@link android.telephony.TelephonyDisplayInfo}.
@@ -705,6 +707,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
cutListToSize(mPhysicalChannelConfigs, mNumPhones);
cutListToSize(mLinkCapacityEstimateLists, mNumPhones);
cutListToSize(mCarrierPrivilegeStates, mNumPhones);
+ cutListToSize(mCarrierServiceStates, mNumPhones);
return;
}
@@ -746,6 +749,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
mAllowedNetworkTypeValue[i] = -1;
mLinkCapacityEstimateLists.add(i, INVALID_LCE_LIST);
mCarrierPrivilegeStates.add(i, new Pair<>(Collections.emptyList(), new int[0]));
+ mCarrierServiceStates.add(i, new Pair<>(null, Process.INVALID_UID));
}
}
}
@@ -813,6 +817,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
mDataEnabledReason = new int[numPhones];
mLinkCapacityEstimateLists = new ArrayList<>();
mCarrierPrivilegeStates = new ArrayList<>();
+ mCarrierServiceStates = new ArrayList<>();
for (int i = 0; i < numPhones; i++) {
mCallState[i] = TelephonyManager.CALL_STATE_IDLE;
@@ -851,6 +856,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
mAllowedNetworkTypeValue[i] = -1;
mLinkCapacityEstimateLists.add(i, INVALID_LCE_LIST);
mCarrierPrivilegeStates.add(i, new Pair<>(Collections.emptyList(), new int[0]));
+ mCarrierServiceStates.add(i, new Pair<>(null, Process.INVALID_UID));
}
mAppOps = mContext.getSystemService(AppOpsManager.class);
@@ -2784,16 +2790,16 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
@Override
- public void addCarrierPrivilegesListener(
+ public void addCarrierPrivilegesCallback(
int phoneId,
- ICarrierPrivilegesListener callback,
- String callingPackage,
- String callingFeatureId) {
+ @NonNull ICarrierPrivilegesCallback callback,
+ @NonNull String callingPackage,
+ @NonNull String callingFeatureId) {
int callerUserId = UserHandle.getCallingUserId();
mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
- "addCarrierPrivilegesListener");
+ "addCarrierPrivilegesCallback");
if (VDBG) {
log(
"listen carrier privs: E pkg=" + pii(callingPackage) + " phoneId=" + phoneId
@@ -2813,7 +2819,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
if (r == null) return;
r.context = mContext;
- r.carrierPrivilegesListener = callback;
+ r.carrierPrivilegesCallback = callback;
r.callingPackage = callingPackage;
r.callingFeatureId = callingFeatureId;
r.callerUid = Binder.getCallingUid();
@@ -2825,10 +2831,18 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
Pair<List<String>, int[]> state = mCarrierPrivilegeStates.get(phoneId);
+ Pair<String, Integer> carrierServiceState = mCarrierServiceStates.get(phoneId);
try {
- r.carrierPrivilegesListener.onCarrierPrivilegesChanged(
- Collections.unmodifiableList(state.first),
- Arrays.copyOf(state.second, state.second.length));
+ if (r.matchCarrierPrivilegesCallback()) {
+ // Here, two callbacks are triggered in quick succession on the same binder.
+ // In typical case, we expect the callers to care about only one or the other.
+ r.carrierPrivilegesCallback.onCarrierPrivilegesChanged(
+ Collections.unmodifiableList(state.first),
+ Arrays.copyOf(state.second, state.second.length));
+
+ r.carrierPrivilegesCallback.onCarrierServiceChanged(carrierServiceState.first,
+ carrierServiceState.second);
+ }
} catch (RemoteException ex) {
remove(r.binder);
}
@@ -2836,12 +2850,12 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
@Override
- public void removeCarrierPrivilegesListener(
- ICarrierPrivilegesListener callback, String callingPackage) {
+ public void removeCarrierPrivilegesCallback(
+ @NonNull ICarrierPrivilegesCallback callback, @NonNull String callingPackage) {
mAppOps.checkPackage(Binder.getCallingUid(), callingPackage);
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
- "removeCarrierPrivilegesListener");
+ "removeCarrierPrivilegesCallback");
remove(callback.asBinder());
}
@@ -2866,13 +2880,13 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
for (Record r : mRecords) {
// Listeners are per-slot, not per-subscription. This is to provide a stable
// view across SIM profile switches.
- if (!r.matchCarrierPrivilegesListener()
+ if (!r.matchCarrierPrivilegesCallback()
|| !idMatch(r, SubscriptionManager.INVALID_SUBSCRIPTION_ID, phoneId)) {
continue;
}
try {
// Make sure even in-process listeners can't modify the values.
- r.carrierPrivilegesListener.onCarrierPrivilegesChanged(
+ r.carrierPrivilegesCallback.onCarrierPrivilegesChanged(
Collections.unmodifiableList(privilegedPackageNames),
Arrays.copyOf(privilegedUids, privilegedUids.length));
} catch (RemoteException ex) {
@@ -2883,6 +2897,34 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
}
}
+ @Override
+ public void notifyCarrierServiceChanged(int phoneId, @Nullable String packageName, int uid) {
+ if (!checkNotifyPermission("notifyCarrierServiceChanged")) return;
+ if (!validatePhoneId(phoneId)) return;
+ if (VDBG) {
+ log("notifyCarrierServiceChanged: phoneId=" + phoneId
+ + ", package=" + pii(packageName) + ", uid=" + uid);
+ }
+
+ synchronized (mRecords) {
+ mCarrierServiceStates.set(
+ phoneId, new Pair<>(packageName, uid));
+ for (Record r : mRecords) {
+ // Listeners are per-slot, not per-subscription.
+ if (!r.matchCarrierPrivilegesCallback()
+ || !idMatch(r, SubscriptionManager.INVALID_SUBSCRIPTION_ID, phoneId)) {
+ continue;
+ }
+ try {
+ r.carrierPrivilegesCallback.onCarrierServiceChanged(packageName, uid);
+ } catch (RemoteException ex) {
+ mRemoveList.add(r.binder);
+ }
+ }
+ handleRemoveListLocked();
+ }
+ }
+
@NeverCompile // Avoid size overhead of debugging code.
@Override
public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
@@ -2938,6 +2980,9 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
pw.println(
"mCarrierPrivilegeState=<packages=" + pii(carrierPrivilegeState.first)
+ ", uids=" + Arrays.toString(carrierPrivilegeState.second) + ">");
+ Pair<String, Integer> carrierServiceState = mCarrierServiceStates.get(i);
+ pw.println("mCarrierServiceState=<package=" + pii(carrierServiceState.first)
+ + ", uid=" + carrierServiceState.second + ">");
pw.decreaseIndent();
}
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 91822ac353ab..eb7897b2c678 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -799,6 +799,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
final BatteryUsageStatsQuery querySinceReset =
new BatteryUsageStatsQuery.Builder()
.includeProcessStateData()
+ .includeVirtualUids()
.build();
bus = getBatteryUsageStats(List.of(querySinceReset)).get(0);
break;
@@ -806,6 +807,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
final BatteryUsageStatsQuery queryPowerProfile =
new BatteryUsageStatsQuery.Builder()
.includeProcessStateData()
+ .includeVirtualUids()
.powerProfileModeledOnly()
.build();
bus = getBatteryUsageStats(List.of(queryPowerProfile)).get(0);
@@ -821,6 +823,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub
final BatteryUsageStatsQuery queryBeforeReset =
new BatteryUsageStatsQuery.Builder()
.includeProcessStateData()
+ .includeVirtualUids()
.aggregateSnapshots(sessionStart, sessionEnd)
.build();
bus = getBatteryUsageStats(List.of(queryBeforeReset)).get(0);
diff --git a/services/core/java/com/android/server/pm/ApkChecksums.java b/services/core/java/com/android/server/pm/ApkChecksums.java
index 2824585bf5aa..aa467e782e84 100644
--- a/services/core/java/com/android/server/pm/ApkChecksums.java
+++ b/services/core/java/com/android/server/pm/ApkChecksums.java
@@ -34,7 +34,6 @@ import android.content.Context;
import android.content.pm.ApkChecksum;
import android.content.pm.Checksum;
import android.content.pm.IOnChecksumsReadyListener;
-import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.Signature;
import android.content.pm.SigningDetails.SignatureSchemeVersion;
@@ -63,7 +62,6 @@ import android.util.apk.VerityBuilder;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.security.VerityUtils;
-import com.android.server.LocalServices;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import java.io.ByteArrayOutputStream;
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index 7b2dc28a396f..d117967954d3 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -52,7 +52,6 @@ import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.function.QuadFunction;
import com.android.server.FgThread;
-import com.android.server.LocalServices;
import com.android.server.compat.CompatChange;
import com.android.server.om.OverlayReferenceMapper;
import com.android.server.pm.parsing.pkg.AndroidPackage;
@@ -487,12 +486,12 @@ public class AppsFilter implements Watchable, Snappable {
}
/** Builder method for an AppsFilter */
- public static AppsFilter create(@NonNull PackageManagerServiceInjector injector,
- @NonNull PackageManagerInternal pmInt) {
+ public static AppsFilter create(
+ PackageManagerInternal pms, PackageManagerServiceInjector injector) {
final boolean forceSystemAppsQueryable =
injector.getContext().getResources()
.getBoolean(R.bool.config_forceSystemPackagesQueryable);
- final FeatureConfigImpl featureConfig = new FeatureConfigImpl(pmInt, injector);
+ final FeatureConfigImpl featureConfig = new FeatureConfigImpl(pms, injector);
final String[] forcedQueryablePackageNames;
if (forceSystemAppsQueryable) {
// all system apps already queryable, no need to read and parse individual exceptions
@@ -513,7 +512,7 @@ public class AppsFilter implements Watchable, Snappable {
};
AppsFilter appsFilter = new AppsFilter(stateProvider, featureConfig,
forcedQueryablePackageNames, forceSystemAppsQueryable, null,
- injector.getBackgroundExecutor(), pmInt);
+ injector.getBackgroundExecutor(), pms);
featureConfig.setAppsFilter(appsFilter);
return appsFilter;
}
diff --git a/services/core/java/com/android/server/pm/BackgroundDexOptService.java b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
index 9ff4aab83cff..ecbb4a9d45a1 100644
--- a/services/core/java/com/android/server/pm/BackgroundDexOptService.java
+++ b/services/core/java/com/android/server/pm/BackgroundDexOptService.java
@@ -19,7 +19,6 @@ package com.android.server.pm;
import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME;
import android.annotation.IntDef;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.job.JobInfo;
import android.app.job.JobParameters;
@@ -270,7 +269,7 @@ public final class BackgroundDexOptService {
PackageManagerService pm = mInjector.getPackageManagerService();
ArraySet<String> packagesToOptimize;
if (packageNames == null) {
- packagesToOptimize = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer());
+ packagesToOptimize = mDexOptHelper.getOptimizablePackages();
} else {
packagesToOptimize = new ArraySet<>(packageNames);
}
@@ -335,7 +334,7 @@ public final class BackgroundDexOptService {
return false;
}
- ArraySet<String> pkgs = mDexOptHelper.getOptimizablePackages(pm.snapshotComputer());
+ ArraySet<String> pkgs = mDexOptHelper.getOptimizablePackages();
if (pkgs.isEmpty()) {
Slog.i(TAG, "No packages to optimize");
markPostBootUpdateCompleted(params);
@@ -557,8 +556,8 @@ public final class BackgroundDexOptService {
}
/** Gets the size of a package. */
- private long getPackageSize(@NonNull Computer snapshot, String pkg) {
- PackageInfo info = snapshot.getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM);
+ private long getPackageSize(PackageManagerService pm, String pkg) {
+ PackageInfo info = pm.snapshotComputer().getPackageInfo(pkg, 0, UserHandle.USER_SYSTEM);
long size = 0;
if (info != null && info.applicationInfo != null) {
File path = Paths.get(info.applicationInfo.sourceDir).toFile();
@@ -606,9 +605,8 @@ public final class BackgroundDexOptService {
Slog.d(TAG, "Should Downgrade " + shouldDowngrade);
}
if (shouldDowngrade) {
- final Computer snapshot = pm.snapshotComputer();
Set<String> unusedPackages =
- snapshot.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
+ pm.getUnusedPackages(mDowngradeUnusedAppsThresholdInMillis);
if (DEBUG) {
Slog.d(TAG, "Unsused Packages " + String.join(",", unusedPackages));
}
@@ -620,7 +618,7 @@ public final class BackgroundDexOptService {
// Should be aborted by the scheduler.
return abortCode;
}
- @DexOptResult int downgradeResult = downgradePackage(snapshot, pm, pkg,
+ @DexOptResult int downgradeResult = downgradePackage(pm, pkg,
/* isForPrimaryDex= */ true, isPostBootUpdate);
if (downgradeResult == PackageDexOptimizer.DEX_OPT_PERFORMED) {
updatedPackages.add(pkg);
@@ -631,7 +629,7 @@ public final class BackgroundDexOptService {
return status;
}
if (supportSecondaryDex) {
- downgradeResult = downgradePackage(snapshot, pm, pkg,
+ downgradeResult = downgradePackage(pm, pkg,
/* isForPrimaryDex= */false, isPostBootUpdate);
status = convertPackageDexOptimizerStatusToInternal(downgradeResult);
if (status != STATUS_OK) {
@@ -698,8 +696,8 @@ public final class BackgroundDexOptService {
* @return PackageDexOptimizer.DEX_*
*/
@DexOptResult
- private int downgradePackage(@NonNull Computer snapshot, PackageManagerService pm, String pkg,
- boolean isForPrimaryDex, boolean isPostBootUpdate) {
+ private int downgradePackage(PackageManagerService pm, String pkg, boolean isForPrimaryDex,
+ boolean isPostBootUpdate) {
if (DEBUG) {
Slog.d(TAG, "Downgrading " + pkg);
}
@@ -711,15 +709,15 @@ public final class BackgroundDexOptService {
if (!isPostBootUpdate) {
dexoptFlags |= DexoptOptions.DEXOPT_IDLE_BACKGROUND_JOB;
}
- long package_size_before = getPackageSize(snapshot, pkg);
+ long package_size_before = getPackageSize(pm, pkg);
int result = PackageDexOptimizer.DEX_OPT_SKIPPED;
if (isForPrimaryDex || PLATFORM_PACKAGE_NAME.equals(pkg)) {
// This applies for system apps or if packages location is not a directory, i.e.
// monolithic install.
- if (!pm.canHaveOatDir(snapshot, pkg)) {
+ if (!pm.canHaveOatDir(pkg)) {
// For apps that don't have the oat directory, instead of downgrading,
// remove their compiler artifacts from dalvik cache.
- pm.deleteOatArtifactsOfPackage(snapshot, pkg);
+ pm.deleteOatArtifactsOfPackage(pkg);
} else {
result = performDexOptPrimary(pkg, reason, dexoptFlags);
}
@@ -728,9 +726,8 @@ public final class BackgroundDexOptService {
}
if (result == PackageDexOptimizer.DEX_OPT_PERFORMED) {
- final Computer newSnapshot = pm.snapshotComputer();
FrameworkStatsLog.write(FrameworkStatsLog.APP_DOWNGRADED, pkg, package_size_before,
- getPackageSize(newSnapshot, pkg), /*aggressive=*/ false);
+ getPackageSize(pm, pkg), /*aggressive=*/ false);
}
return result;
}
diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java
index 8e853019de90..6103d688e2b1 100644
--- a/services/core/java/com/android/server/pm/Computer.java
+++ b/services/core/java/com/android/server/pm/Computer.java
@@ -58,6 +58,10 @@ import com.android.server.utils.WatchedLongSparseArray;
import java.io.FileDescriptor;
import java.io.PrintWriter;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
import java.util.List;
import java.util.Set;
@@ -88,69 +92,92 @@ import java.util.Set;
* and other managers (like PermissionManager) mean deadlock is possible. On the
* other hand, not overriding in {@link ComputerLocked} may leave a function walking
* unstable data.
+ *
+ * To coax developers to consider such issues carefully, all methods in
+ * {@link Computer} must be annotated with <code>@LiveImplementation(override =
+ * MANDATORY)</code> or <code>LiveImplementation(locked = NOT_ALLOWED)</code>. A unit
+ * test verifies the annotation and that the annotation corresponds to the code in
+ * {@link ComputerEngine} and {@link ComputerLocked}.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public interface Computer extends PackageDataSnapshot {
/**
+ * Every method must be annotated.
+ */
+ @Target({ ElementType.METHOD })
+ @Retention(RetentionPolicy.RUNTIME)
+ @interface LiveImplementation {
+ // A Computer method must be annotated with one of the following values:
+ // MANDATORY - the method must be overridden in ComputerEngineLive. The
+ // format of the override is a call to the super method, wrapped in a
+ // synchronization block.
+ // NOT_ALLOWED - the method may not appear in the live computer. It must
+ // be final in the ComputerEngine.
+ int MANDATORY = 1;
+ int NOT_ALLOWED = 2;
+ int override() default MANDATORY;
+ String rationale() default "";
+ }
+
+ /**
* Administrative statistics: record that the snapshot has been used. Every call
* to use() increments the usage counter.
*/
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
default void use() {
}
/**
* Fetch the snapshot usage counter.
* @return The number of times this snapshot was used.
*/
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
default int getUsed() {
return 0;
}
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
@NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent, String resolvedType,
@PackageManager.ResolveInfoFlagsBits long flags,
@PackageManagerInternal.PrivateResolveFlags long privateResolveFlags,
int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
@NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent, String resolvedType,
long flags, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
@NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent, String resolvedType,
long flags, int userId, int callingUid, boolean includeInstantApps);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
@NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody(Intent intent,
String resolvedType, long flags, int filterCallingUid, int userId,
boolean resolveForStart, boolean allowDynamicSplits, String pkgName,
String instantAppPkgName);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ActivityInfo getActivityInfo(ComponentName component, long flags, int userId);
-
- /**
- * Important: The provided filterCallingUid is used exclusively to filter out activities
- * that can be seen based on user state. It's typically the original caller uid prior
- * to clearing. Because it can only be provided by trusted code, its value can be
- * trusted and will be used as-is; unlike userId which will be validated by this method.
- */
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ActivityInfo getActivityInfoInternal(ComponentName component, long flags,
int filterCallingUid, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
AndroidPackage getPackage(String packageName);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
AndroidPackage getPackage(int uid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ApplicationInfo generateApplicationInfoFromSettings(String packageName, long flags,
int filterCallingUid, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ApplicationInfo getApplicationInfo(String packageName, long flags, int userId);
-
- /**
- * Important: The provided filterCallingUid is used exclusively to filter out applications
- * that can be seen based on user state. It's typically the original caller uid prior
- * to clearing. Because it can only be provided by trusted code, its value can be
- * trusted and will be used as-is; unlike userId which will be validated by this method.
- */
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ApplicationInfo getApplicationInfoInternal(String packageName, long flags,
int filterCallingUid, int userId);
-
- /**
- * Report the 'Home' activity which is currently set as "always use this one". If non is set
- * then reports the most likely home activity or null if there are more than one.
- */
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ComponentName getDefaultHomeActivity(int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent, String resolvedType,
long flags, int sourceUserId, int parentUserId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
Intent getHomeIntent();
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
List<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(Intent intent,
String resolvedType, int userId);
@@ -165,11 +192,15 @@ public interface Computer extends PackageDataSnapshot {
* @param intent
* @return A filtered list of resolved activities.
*/
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
List<ResolveInfo> applyPostResolutionFilter(@NonNull List<ResolveInfo> resolveInfos,
String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid,
boolean resolveForStart, int userId, Intent intent);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
PackageInfo generatePackageInfo(PackageStateInternal ps, long flags, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
PackageInfo getPackageInfo(String packageName, long flags, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
PackageInfo getPackageInfoInternal(String packageName, long versionCode, long flags,
int filterCallingUid, int userId);
@@ -178,69 +209,79 @@ public interface Computer extends PackageDataSnapshot {
* known {@link PackageState} instances without a {@link PackageState#getAndroidPackage()}
* will not be represented.
*/
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
String[] getAllAvailablePackageNames();
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
PackageStateInternal getPackageStateInternal(String packageName);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
PackageStateInternal getPackageStateInternal(String packageName, int callingUid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
+ @Nullable PackageState getPackageStateCopied(@NonNull String packageName);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ParceledListSlice<PackageInfo> getInstalledPackages(long flags, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ResolveInfo createForwardingResolveInfoUnchecked(WatchedIntentFilter filter,
int sourceUserId, int targetUserId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
ServiceInfo getServiceInfo(ComponentName component, long flags, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
SharedLibraryInfo getSharedLibraryInfo(String name, long version);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
String getInstantAppPackageName(int callingUid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
String resolveExternalPackageName(AndroidPackage pkg);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
String resolveInternalPackageName(String packageName, long versionCode);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
String[] getPackagesForUid(int uid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
UserInfo getProfileParent(int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean canViewInstantApps(int callingUid, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid, int userId,
long flags);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean isCallerSameApp(String packageName, int uid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean isComponentVisibleToInstantApp(@Nullable ComponentName component);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean isComponentVisibleToInstantApp(@Nullable ComponentName component,
@PackageManager.ComponentType int type);
-
- /**
- * From Android R, camera intents have to match system apps. The only exception to this is if
- * the DPC has set the camera persistent preferred activity. This case was introduced
- * because it is important that the DPC has the ability to set both system and non-system
- * camera persistent preferred activities.
- *
- * @return {@code true} if the intent is a camera intent and the persistent preferred
- * activity was not set by the DPC.
- */
- boolean isImplicitImageCaptureIntentAndNotSetByDpc(Intent intent, int userId,
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
+ boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId,
String resolvedType, long flags);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean isInstantApp(String packageName, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean isInstantAppInternal(String packageName, @UserIdInt int userId, int callingUid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean isSameProfileGroup(@UserIdInt int callerUserId, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid,
@Nullable ComponentName component, @PackageManager.ComponentType int componentType,
int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean shouldFilterApplication(@Nullable PackageStateInternal ps, int callingUid,
int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
boolean shouldFilterApplication(@NonNull SharedUserSetting sus, int callingUid,
int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
int checkUidPermission(String permName, int uid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
int getPackageUidInternal(String packageName, long flags, int userId, int callingUid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
long updateFlagsForApplication(long flags, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
long updateFlagsForComponent(long flags, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
long updateFlagsForPackage(long flags, int userId);
-
- /**
- * Update given flags when being used to request {@link ResolveInfo}.
- * <p>Instant apps are resolved specially, depending upon context. Minimally,
- * {@code}flags{@code} must have the {@link PackageManager#MATCH_INSTANT}
- * flag set. However, this flag is only honoured in three circumstances:
- * <ul>
- * <li>when called from a system process</li>
- * <li>when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}</li>
- * <li>when resolution occurs to start an activity with a {@code android.intent.action.VIEW}
- * action and a {@code android.intent.category.BROWSABLE} category</li>
- * </ul>
- */
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
long updateFlagsForResolve(long flags, int userId, int callingUid, boolean wantInstantApps,
boolean isImplicitImageCaptureIntentAndNotSetByDpc);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
long updateFlagsForResolve(long flags, int userId, int callingUid, boolean wantInstantApps,
boolean onlyExposedExplicitly, boolean isImplicitImageCaptureIntentAndNotSetByDpc);
@@ -258,99 +299,117 @@ public interface Computer extends PackageDataSnapshot {
* @param checkShell whether to prevent shell from access if there's a debugging restriction
* @param message the message to log on security exception
*/
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId,
boolean requireFullPermission, boolean checkShell, String message);
-
- /**
- * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS
- * or INTERACT_ACROSS_USERS_FULL permissions, if the {@code userId} is not for the caller.
- *
- * @param checkShell whether to prevent shell from access if there's a debugging restriction
- * @param message the message to log on security exception
- */
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
boolean requireFullPermission, boolean checkShell, String message);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
boolean requireFullPermission, boolean checkShell,
boolean requirePermissionWhenSameUser, String message);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
SigningDetails getSigningDetails(@NonNull String packageName);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
SigningDetails getSigningDetails(int uid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
boolean filterAppAccess(String packageName, int callingUid, int userId);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
boolean filterAppAccess(int uid, int callingUid);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.MANDATORY)
void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState);
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityInternal(
Intent intent, String resolvedType, long flags, List<ResolveInfo> query, boolean always,
boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered);
- ResolveInfo findPersistentPreferredActivity(Intent intent, String resolvedType, long flags,
+ @Computer.LiveImplementation(override = Computer.LiveImplementation.NOT_ALLOWED)
+ ResolveInfo findPersistentPreferredActivityLP(Intent intent, String resolvedType, long flags,
List<ResolveInfo> query, boolean debug, int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
PreferredIntentResolver getPreferredActivities(@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ArrayMap<String, ? extends PackageStateInternal> getPackageStates();
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
String getRenamedPackage(@NonNull String packageName);
/**
* @return set of packages to notify
*/
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@PackageManagerService.PackageStartability
int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid,
@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean isPackageAvailable(String packageName, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
String[] currentToCanonicalPackageNames(@NonNull String[] names);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
String[] canonicalToCurrentPackageNames(@NonNull String[] names);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
int[] getPackageGids(@NonNull String packageName,
@PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
int getTargetSdkVersion(@NonNull String packageName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName,
@NonNull ComponentName component, @NonNull Intent intent, String resolvedType);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ActivityInfo getReceiverInfo(@NonNull ComponentName component,
@PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName,
@PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid,
int userId, boolean throwIfPermNotDeclared);
- /**
- * Returns true if the system or user is explicitly preventing an otherwise valid installer to
- * complete an install. This includes checks like unknown sources and user restrictions.
- */
+ @Computer.LiveImplementation(override = LiveImplementation.NOT_ALLOWED)
boolean isInstallDisabledForPackage(@NonNull String packageName, int uid,
@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo,
@PackageManager.PackageInfoFlagsBits long flags, int callingUid, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
@NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ProviderInfo getProviderInfo(@NonNull ComponentName component,
@PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
String[] getSystemSharedLibraryNames();
@@ -358,103 +417,136 @@ public interface Computer extends PackageDataSnapshot {
* @return the state if the given package has a state and isn't filtered by visibility.
* Provides no guarantee that the package is in any usable state.
*/
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
int checkSignatures(@NonNull String pkg1, @NonNull String pkg2);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
int checkUidSignatures(int uid1, int uid2);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate,
@PackageManager.CertificateInputType int type);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate,
@PackageManager.CertificateInputType int type);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
List<String> getAllPackages();
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
String getNameForUid(int uid);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
String[] getNamesForUids(@NonNull int[] uids);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
int getUidForSharedUser(@NonNull String sharedUserName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
int getFlagsForUid(int uid);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
int getPrivateFlagsForUid(int uid);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean isUidPrivileged(int uid);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
String[] getAppOpPermissionPackages(@NonNull String permissionName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(@NonNull String[] permissions,
@PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
List<ApplicationInfo> getInstalledApplications(
@PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId,
int callingUid);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ProviderInfo resolveContentProvider(@NonNull String name,
@PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId, int callingUid);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid,
@NonNull String visibleAuthority);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
void querySyncProviders(boolean safeMode, @NonNull List<String> outNames,
@NonNull List<ProviderInfo> outInfo);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName, int uid,
@PackageManager.ComponentInfoFlagsBits long flags, @Nullable String metaDataKey);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ParceledListSlice<InstrumentationInfo> queryInstrumentation(
@NonNull String targetPackage, int flags);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
List<PackageStateInternal> findSharedNonSystemLibraries(
@NonNull PackageStateInternal pkgSetting);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean getApplicationHiddenSettingAsUser(@NonNull String packageName, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName, @UserIdInt int[] userIds,
boolean isInstantApp);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
String getInstallerPackageName(@NonNull String packageName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
InstallSourceInfo getInstallSourceInfo(@NonNull String packageName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@PackageManager.EnabledState
int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@PackageManager.EnabledState
int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid,
@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@PackageManager.EnabledState
int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid,
@UserIdInt int userId);
@@ -465,19 +557,25 @@ public interface Computer extends PackageDataSnapshot {
* are all effectively enabled for the given component. Or if the component cannot be found,
* returns false.
*/
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo,
@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
KeySet getSigningKeySet(@NonNull String packageName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId);
@@ -487,37 +585,49 @@ public interface Computer extends PackageDataSnapshot {
* package visibility filtering is enabled on it. If the UID is part of a shared user ID,
* return {@code true} if any one application belongs to the shared user ID meets the criteria.
*/
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean canQueryPackage(int callingUid, @Nullable String targetPackageName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
int getPackageUid(@NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@PackageManager.InstallReason
int getInstallReason(@NonNull String packageName, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean canPackageQuery(@NonNull String sourcePackageName, @NonNull String targetPackageName,
@UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
@UserIdInt int sourceUserId, @UserIdInt int targetUserId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
SparseArray<String> getAppsWithSharedUserIds();
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
String[] getSharedUserPackagesForPackage(@NonNull String packageName, @UserIdInt int userId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
Set<String> getUnusedPackages(long downgradeTimeThresholdMillis);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId);
@@ -528,49 +638,55 @@ public interface Computer extends PackageDataSnapshot {
*
* @return The filtered packages
*/
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
String[] filterOnlySystemPackages(@Nullable String... pkgNames);
// The methods in this block should be removed once SettingBase is interface snapshotted
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
List<AndroidPackage> getPackagesForAppId(int appId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
int getUidTargetSdkVersion(int uid);
/**
* @see PackageManagerInternal#getProcessesForUid(int)
*/
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ArrayMap<String, ProcessInfo> getProcessesForUid(int uid);
// End block
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries();
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
SharedUserApi getSharedUser(int sharedUserAppIde);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@NonNull
ComponentResolverApi getComponentResolver();
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
PackageStateInternal getDisabledSystemPackage(@NonNull String packageName);
+ @Computer.LiveImplementation(override = LiveImplementation.MANDATORY)
@Nullable
ResolveInfo getInstantAppInstallerInfo();
-
- @NonNull
- WatchedArrayMap<String, Integer> getFrozenPackages();
-
- @Nullable
- ComponentName getInstantAppInstallerComponent();
}
diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java
index 06e827a8897f..0c9855b2385d 100644
--- a/services/core/java/com/android/server/pm/ComputerEngine.java
+++ b/services/core/java/com/android/server/pm/ComputerEngine.java
@@ -466,7 +466,7 @@ public class ComputerEngine implements Computer {
flags = updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart,
comp != null || pkgName != null /*onlyExposedExplicitly*/,
- isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType,
+ isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType,
flags));
List<ResolveInfo> list = Collections.emptyList();
boolean skipPostResolution = false;
@@ -1722,6 +1722,15 @@ public class ComputerEngine implements Computer {
return mSettings.getPackage(packageName);
}
+ @Nullable
+ public PackageState getPackageStateCopied(@NonNull String packageName) {
+ int callingUid = Binder.getCallingUid();
+ packageName = resolveInternalPackageNameInternalLocked(
+ packageName, PackageManager.VERSION_CODE_HIGHEST, callingUid);
+ PackageStateInternal pkgSetting = mSettings.getPackage(packageName);
+ return pkgSetting == null ? null : PackageStateImpl.copy(pkgSetting);
+ }
+
public final ParceledListSlice<PackageInfo> getInstalledPackages(long flags, int userId) {
final int callingUid = Binder.getCallingUid();
if (getInstantAppPackageName(callingUid) != null) {
@@ -2459,7 +2468,7 @@ public class ComputerEngine implements Computer {
* @return {@code true} if the intent is a camera intent and the persistent preferred
* activity was not set by the DPC.
*/
- public final boolean isImplicitImageCaptureIntentAndNotSetByDpc(Intent intent,
+ public final boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent,
int userId, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) {
return intent.isImplicitImageCaptureIntent() && !isPersistentPreferredActivitySetByDpm(
intent, userId, resolvedType, flags);
@@ -3219,12 +3228,12 @@ public class ComputerEngine implements Computer {
flags = updateFlagsForResolve(
flags, userId, callingUid, false /*includeInstantApps*/,
- isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId,
+ isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
resolvedType, flags));
intent = PackageManagerServiceUtils.updateIntentForResolve(intent);
// Try to find a matching persistent preferred activity.
- result.mPreferredResolveInfo = findPersistentPreferredActivity(intent,
+ result.mPreferredResolveInfo = findPersistentPreferredActivityLP(intent,
resolvedType, flags, query, debug, userId);
// If a persistent preferred activity matched, use it.
@@ -3435,7 +3444,7 @@ public class ComputerEngine implements Computer {
userId, queryMayBeFiltered, callingUid, isDeviceProvisioned);
}
- public final ResolveInfo findPersistentPreferredActivity(Intent intent,
+ public final ResolveInfo findPersistentPreferredActivityLP(Intent intent,
String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
List<ResolveInfo> query, boolean debug, int userId) {
final int n = query.size();
@@ -5409,7 +5418,7 @@ public class ComputerEngine implements Computer {
}
long flags = updateFlagsForResolve(0, parent.id, callingUid,
false /*includeInstantApps*/,
- isImplicitImageCaptureIntentAndNotSetByDpc(intent, parent.id,
+ isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, parent.id,
resolvedType, 0));
flags |= PackageManager.MATCH_DEFAULT_ONLY;
CrossProfileDomainInfo xpDomainInfo = getCrossProfileDomainPreferredLpr(
@@ -5685,17 +5694,4 @@ public class ComputerEngine implements Computer {
public ResolveInfo getInstantAppInstallerInfo() {
return mInstantAppInstallerInfo;
}
-
- @NonNull
- @Override
- public WatchedArrayMap<String, Integer> getFrozenPackages() {
- return mFrozenPackages;
- }
-
- @Nullable
- @Override
- public ComponentName getInstantAppInstallerComponent() {
- return mLocalInstantAppInstallerActivity == null
- ? null : mLocalInstantAppInstallerActivity.getComponentName();
- }
}
diff --git a/services/core/java/com/android/server/pm/ComputerLocked.java b/services/core/java/com/android/server/pm/ComputerLocked.java
index af196d51331f..5d89c7daeaf5 100644
--- a/services/core/java/com/android/server/pm/ComputerLocked.java
+++ b/services/core/java/com/android/server/pm/ComputerLocked.java
@@ -16,21 +16,62 @@
package com.android.server.pm;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
import android.content.ComponentName;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
+import android.content.pm.ComponentInfo;
+import android.content.pm.InstallSourceInfo;
+import android.content.pm.InstrumentationInfo;
+import android.content.pm.KeySet;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.ProcessInfo;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.pm.SharedLibraryInfo;
+import android.content.pm.SigningDetails;
+import android.content.pm.VersionedPackage;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Pair;
+import android.util.SparseArray;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.pkg.PackageState;
+import com.android.server.pm.pkg.PackageStateInternal;
+import com.android.server.pm.pkg.SharedUserApi;
+import com.android.server.pm.resolution.ComponentResolverApi;
+import com.android.server.utils.WatchedArrayMap;
+import com.android.server.utils.WatchedLongSparseArray;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
/**
* This subclass is the external interface to the live computer. Some internal helper
- * methods are overridden to fetch live data instead of snapshot data.
+ * methods are overridden to fetch live data instead of snapshot data. For each
+ * Computer interface that is overridden in this class, the override takes the PM lock
+ * and then delegates to the live computer engine. This is required because there are
+ * no locks taken in the engine itself.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
public final class ComputerLocked extends ComputerEngine {
+ private final Object mLock;
ComputerLocked(PackageManagerService.Snapshot args) {
super(args);
+ mLock = mService.mLock;
}
protected ComponentName resolveComponentName() {
@@ -42,4 +83,814 @@ public final class ComputerLocked extends ComputerEngine {
protected ApplicationInfo androidApplication() {
return mService.getCoreAndroidApplication();
}
+
+ public @NonNull List<ResolveInfo> queryIntentServicesInternalBody(Intent intent,
+ String resolvedType, int flags, int userId, int callingUid,
+ String instantAppPkgName) {
+ synchronized (mLock) {
+ return super.queryIntentServicesInternalBody(intent, resolvedType, flags, userId,
+ callingUid, instantAppPkgName);
+ }
+ }
+ public @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody(
+ Intent intent, String resolvedType, long flags, int filterCallingUid, int userId,
+ boolean resolveForStart, boolean allowDynamicSplits, String pkgName,
+ String instantAppPkgName) {
+ synchronized (mLock) {
+ return super.queryIntentActivitiesInternalBody(intent, resolvedType, flags,
+ filterCallingUid, userId, resolveForStart, allowDynamicSplits, pkgName,
+ instantAppPkgName);
+ }
+ }
+ public ActivityInfo getActivityInfoInternalBody(ComponentName component, int flags,
+ int filterCallingUid, int userId) {
+ synchronized (mLock) {
+ return super.getActivityInfoInternalBody(component, flags, filterCallingUid,
+ userId);
+ }
+ }
+ public AndroidPackage getPackage(String packageName) {
+ synchronized (mLock) {
+ return super.getPackage(packageName);
+ }
+ }
+ public AndroidPackage getPackage(int uid) {
+ synchronized (mLock) {
+ return super.getPackage(uid);
+ }
+ }
+ public ApplicationInfo getApplicationInfoInternalBody(String packageName, int flags,
+ int filterCallingUid, int userId) {
+ synchronized (mLock) {
+ return super.getApplicationInfoInternalBody(packageName, flags, filterCallingUid,
+ userId);
+ }
+ }
+ public ArrayList<ResolveInfo> filterCandidatesWithDomainPreferredActivitiesLPrBody(
+ Intent intent, int matchFlags, List<ResolveInfo> candidates,
+ CrossProfileDomainInfo xpDomainInfo, int userId, boolean debug) {
+ synchronized (mLock) {
+ return super.filterCandidatesWithDomainPreferredActivitiesLPrBody(intent,
+ matchFlags, candidates, xpDomainInfo, userId, debug);
+ }
+ }
+ public PackageInfo getPackageInfoInternalBody(String packageName, long versionCode,
+ int flags, int filterCallingUid, int userId) {
+ synchronized (mLock) {
+ return super.getPackageInfoInternalBody(packageName, versionCode, flags,
+ filterCallingUid, userId);
+ }
+ }
+
+ @Override
+ public String[] getAllAvailablePackageNames() {
+ synchronized (mLock) {
+ return super.getAllAvailablePackageNames();
+ }
+ }
+
+ public PackageStateInternal getPackageStateInternal(String packageName, int callingUid) {
+ synchronized (mLock) {
+ return super.getPackageStateInternal(packageName, callingUid);
+ }
+ }
+
+ @Nullable
+ public PackageState getPackageStateCopied(@NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getPackageStateCopied(packageName);
+ }
+ }
+
+ public ParceledListSlice<PackageInfo> getInstalledPackagesBody(int flags, int userId,
+ int callingUid) {
+ synchronized (mLock) {
+ return super.getInstalledPackagesBody(flags, userId, callingUid);
+ }
+ }
+ public ServiceInfo getServiceInfoBody(ComponentName component, int flags, int userId,
+ int callingUid) {
+ synchronized (mLock) {
+ return super.getServiceInfoBody(component, flags, userId, callingUid);
+ }
+ }
+ public String getInstantAppPackageName(int callingUid) {
+ synchronized (mLock) {
+ return super.getInstantAppPackageName(callingUid);
+ }
+ }
+ public String[] getPackagesForUidInternalBody(int callingUid, int userId, int appId,
+ boolean isCallerInstantApp) {
+ synchronized (mLock) {
+ return super.getPackagesForUidInternalBody(callingUid, userId, appId,
+ isCallerInstantApp);
+ }
+ }
+ public boolean isInstantAppInternalBody(String packageName, @UserIdInt int userId,
+ int callingUid) {
+ synchronized (mLock) {
+ return super.isInstantAppInternalBody(packageName, userId, callingUid);
+ }
+ }
+ public boolean isInstantAppResolutionAllowedBody(Intent intent,
+ List<ResolveInfo> resolvedActivities, int userId, boolean skipPackageCheck,
+ int flags) {
+ synchronized (mLock) {
+ return super.isInstantAppResolutionAllowedBody(intent, resolvedActivities, userId,
+ skipPackageCheck, flags);
+ }
+ }
+ public int getPackageUidInternal(String packageName, int flags, int userId,
+ int callingUid) {
+ synchronized (mLock) {
+ return super.getPackageUidInternal(packageName, flags, userId, callingUid);
+ }
+ }
+ public SigningDetails getSigningDetails(@NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getSigningDetails(packageName);
+ }
+ }
+ public SigningDetails getSigningDetails(int uid) {
+ synchronized (mLock) {
+ return super.getSigningDetails(uid);
+ }
+ }
+ public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
+ synchronized (mLock) {
+ return super.filterAppAccess(pkg, callingUid, userId);
+ }
+ }
+ public boolean filterAppAccess(String packageName, int callingUid, int userId) {
+ synchronized (mLock) {
+ return super.filterAppAccess(packageName, callingUid, userId);
+ }
+ }
+ public boolean filterAppAccess(int uid, int callingUid) {
+ synchronized (mLock) {
+ return super.filterAppAccess(uid, callingUid);
+ }
+ }
+ public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) {
+ synchronized (mLock) {
+ super.dump(type, fd, pw, dumpState);
+ }
+ }
+ public PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityBody(
+ Intent intent, String resolvedType, int flags, List<ResolveInfo> query, boolean always,
+ boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered,
+ int callingUid, boolean isDeviceProvisioned) {
+ synchronized (mLock) {
+ return super.findPreferredActivityBody(intent, resolvedType, flags, query, always,
+ removeMatches, debug, userId, queryMayBeFiltered, callingUid,
+ isDeviceProvisioned);
+ }
+ }
+
+ @Override
+ public PreferredIntentResolver getPreferredActivities(int userId) {
+ synchronized (mLock) {
+ return super.getPreferredActivities(userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
+ synchronized (mLock) {
+ return super.getPackageStates();
+ }
+ }
+
+ @Nullable
+ @Override
+ public String getRenamedPackage(@NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getRenamedPackage(packageName);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages) {
+ synchronized (mLock) {
+ return super.getNotifyPackagesForReplacedReceived(packages);
+ }
+ }
+
+ @Override
+ public int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getPackageStartability(safeMode, packageName, callingUid, userId);
+ }
+ }
+
+ @Override
+ public boolean isPackageAvailable(String packageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.isPackageAvailable(packageName, userId);
+ }
+ }
+
+ @Override
+ public String[] currentToCanonicalPackageNames(String[] names) {
+ synchronized (mLock) {
+ return super.currentToCanonicalPackageNames(names);
+ }
+ }
+
+ @Override
+ public String[] canonicalToCurrentPackageNames(String[] names) {
+ synchronized (mLock) {
+ return super.canonicalToCurrentPackageNames(names);
+ }
+ }
+
+ @Override
+ public int[] getPackageGids(@NonNull String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getPackageGids(packageName, flags, userId);
+ }
+ }
+
+ @Override
+ public int getTargetSdkVersion(@NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getTargetSdkVersion(packageName);
+ }
+ }
+
+ @Override
+ public boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName,
+ @NonNull ComponentName component, @NonNull Intent intent, String resolvedType) {
+ synchronized (mLock) {
+ return super.activitySupportsIntent(resolveComponentName, component, intent,
+ resolvedType);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ActivityInfo getReceiverInfo(@NonNull ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getReceiverInfo(component, flags, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getSharedLibraries(packageName, flags, userId);
+ }
+ }
+
+ @Override
+ public boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid,
+ @UserIdInt int userId, boolean throwIfPermNotDeclared) {
+ synchronized (mLock) {
+ return super.canRequestPackageInstalls(packageName, callingUid, userId,
+ throwIfPermNotDeclared);
+ }
+ }
+
+ @Override
+ public List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo,
+ @PackageManager.PackageInfoFlagsBits long flags, int callingUid,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
+ @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getDeclaredSharedLibraries(packageName, flags, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ProviderInfo getProviderInfo(@NonNull ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getProviderInfo(component, flags, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public String[] getSystemSharedLibraryNames() {
+ synchronized (mLock) {
+ return super.getSystemSharedLibraryNames();
+ }
+ }
+
+ @Override
+ public int checkSignatures(@NonNull String pkg1,
+ @NonNull String pkg2) {
+ synchronized (mLock) {
+ return super.checkSignatures(pkg1, pkg2);
+ }
+ }
+
+ @Override
+ public int checkUidSignatures(int uid1, int uid2) {
+ synchronized (mLock) {
+ return super.checkUidSignatures(uid1, uid2);
+ }
+ }
+
+ @Override
+ public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate,
+ int type) {
+ synchronized (mLock) {
+ return super.hasSigningCertificate(packageName, certificate, type);
+ }
+ }
+
+ @Override
+ public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, int type) {
+ synchronized (mLock) {
+ return super.hasUidSigningCertificate(uid, certificate, type);
+ }
+ }
+
+ @Override
+ public List<String> getAllPackages() {
+ synchronized (mLock) {
+ return super.getAllPackages();
+ }
+ }
+
+ @Nullable
+ @Override
+ public String getNameForUid(int uid) {
+ synchronized (mLock) {
+ return super.getNameForUid(uid);
+ }
+ }
+
+ @Nullable
+ @Override
+ public String[] getNamesForUids(int[] uids) {
+ synchronized (mLock) {
+ return super.getNamesForUids(uids);
+ }
+ }
+
+ @Override
+ public int getUidForSharedUser(@NonNull String sharedUserName) {
+ synchronized (mLock) {
+ return super.getUidForSharedUser(sharedUserName);
+ }
+ }
+
+ @Override
+ public int getFlagsForUid(int uid) {
+ synchronized (mLock) {
+ return super.getFlagsForUid(uid);
+ }
+ }
+
+ @Override
+ public int getPrivateFlagsForUid(int uid) {
+ synchronized (mLock) {
+ return super.getPrivateFlagsForUid(uid);
+ }
+ }
+
+ @Override
+ public boolean isUidPrivileged(int uid) {
+ synchronized (mLock) {
+ return super.isUidPrivileged(uid);
+ }
+ }
+
+ @NonNull
+ @Override
+ public String[] getAppOpPermissionPackages(@NonNull String permissionName) {
+ synchronized (mLock) {
+ return super.getAppOpPermissionPackages(permissionName);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
+ @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getPackagesHoldingPermissions(permissions, flags, userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public List<ApplicationInfo> getInstalledApplications(
+ @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId,
+ int callingUid) {
+ synchronized (mLock) {
+ return super.getInstalledApplications(flags, userId, callingUid);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ProviderInfo resolveContentProvider(@NonNull String name,
+ @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId,
+ int callingUid) {
+ synchronized (mLock) {
+ return super.resolveContentProvider(name, flags, userId, callingUid);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid,
+ @NonNull String visibleAuthority) {
+ synchronized (mLock) {
+ return super.getGrantImplicitAccessProviderInfo(recipientUid, visibleAuthority);
+ }
+ }
+
+ @Override
+ public void querySyncProviders(boolean safeMode, @NonNull List<String> outNames,
+ @NonNull List<ProviderInfo> outInfo) {
+ synchronized (mLock) {
+ super.querySyncProviders(safeMode, outNames, outInfo);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName,
+ int uid, @PackageManager.ComponentInfoFlagsBits long flags,
+ @Nullable String metaDataKey) {
+ synchronized (mLock) {
+ return super.queryContentProviders(processName, uid, flags, metaDataKey);
+ }
+ }
+
+ @Nullable
+ @Override
+ public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) {
+ synchronized (mLock) {
+ return super.getInstrumentationInfo(component, flags);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<InstrumentationInfo> queryInstrumentation(
+ @NonNull String targetPackage, int flags) {
+ synchronized (mLock) {
+ return super.queryInstrumentation(targetPackage, flags);
+ }
+ }
+
+ @NonNull
+ @Override
+ public List<PackageStateInternal> findSharedNonSystemLibraries(
+ @NonNull PackageStateInternal pkgSetting) {
+ synchronized (mLock) {
+ return super.findSharedNonSystemLibraries(pkgSetting);
+ }
+ }
+
+ @Override
+ public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getApplicationHiddenSettingAsUser(packageName, userId);
+ }
+ }
+
+ @Override
+ public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.isPackageSuspendedForUser(packageName, userId);
+ }
+ }
+
+ @Override
+ public boolean isSuspendingAnyPackages(@NonNull String suspendingPackage,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.isSuspendingAnyPackages(suspendingPackage, userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getAllIntentFilters(packageName);
+ }
+ }
+
+ @Override
+ public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getBlockUninstallForUser(packageName, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName,
+ @UserIdInt int[] userIds, boolean isInstantApp) {
+ synchronized (mLock) {
+ return super.getBroadcastAllowList(packageName, userIds, isInstantApp);
+ }
+ }
+
+ @Nullable
+ @Override
+ public String getInstallerPackageName(@NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getInstallerPackageName(packageName);
+ }
+ }
+
+ @Nullable
+ @Override
+ public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getInstallSourceInfo(packageName);
+ }
+ }
+
+ @Override
+ public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getApplicationEnabledSetting(packageName, userId);
+ }
+ }
+
+ @Override
+ public int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getComponentEnabledSetting(component, callingUid, userId);
+ }
+ }
+
+ @Override
+ public int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getComponentEnabledSettingInternal(component, callingUid, userId);
+ }
+ }
+
+ @Override
+ public boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.isComponentEffectivelyEnabled(componentInfo, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {
+ synchronized (mLock) {
+ return super.getKeySetByAlias(packageName, alias);
+ }
+ }
+
+ @Nullable
+ @Override
+ public KeySet getSigningKeySet(@NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getSigningKeySet(packageName);
+ }
+ }
+
+ @Override
+ public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) {
+ synchronized (mLock) {
+ return super.isPackageSignedByKeySet(packageName, ks);
+ }
+ }
+
+ @Override
+ public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) {
+ synchronized (mLock) {
+ return super.isPackageSignedByKeySetExactly(packageName, ks);
+ }
+ }
+
+ @Nullable
+ @Override
+ public int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getVisibilityAllowList(packageName, userId);
+ }
+ }
+
+ @Override
+ public boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) {
+ synchronized (mLock) {
+ return super.canQueryPackage(callingUid, targetPackageName);
+ }
+ }
+
+ @Override
+ public int getPackageUid(@NonNull String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getPackageUid(packageName, flags, userId);
+ }
+ }
+
+ @Override
+ public boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.canAccessComponent(callingUid, component, userId);
+ }
+ }
+
+ @Override
+ public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) {
+ synchronized (mLock) {
+ return super.isCallerInstallerOfRecord(pkg, callingUid);
+ }
+ }
+
+ @Override
+ public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getInstallReason(packageName, userId);
+ }
+ }
+
+ @Override
+ public boolean canPackageQuery(@NonNull String sourcePackageName,
+ @NonNull String targetPackageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.canPackageQuery(sourcePackageName, targetPackageName, userId);
+ }
+ }
+
+ @Override
+ public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
+ @UserIdInt int sourceUserId, @UserIdInt int targetUserId) {
+ synchronized (mLock) {
+ return super.canForwardTo(intent, resolvedType, sourceUserId, targetUserId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags) {
+ synchronized (mLock) {
+ return super.getPersistentApplications(safeMode, flags);
+ }
+ }
+
+ @NonNull
+ @Override
+ public SparseArray<String> getAppsWithSharedUserIds() {
+ synchronized (mLock) {
+ return super.getAppsWithSharedUserIds();
+ }
+ }
+
+ @NonNull
+ @Override
+ public String[] getSharedUserPackagesForPackage(@NonNull String packageName,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getSharedUserPackagesForPackage(packageName, userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) {
+ synchronized (mLock) {
+ return super.getUnusedPackages(downgradeTimeThresholdMillis);
+ }
+ }
+
+ @Nullable
+ @Override
+ public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getHarmfulAppWarning(packageName, userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public String[] filterOnlySystemPackages(@Nullable String... pkgNames) {
+ synchronized (mLock) {
+ return super.filterOnlySystemPackages(pkgNames);
+ }
+ }
+
+ @NonNull
+ @Override
+ public List<AndroidPackage> getPackagesForAppId(int appId) {
+ synchronized (mLock) {
+ return super.getPackagesForAppId(appId);
+ }
+ }
+
+ @Override
+ public int getUidTargetSdkVersion(int uid) {
+ synchronized (mLock) {
+ return super.getUidTargetSdkVersion(uid);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) {
+ synchronized (mLock) {
+ return super.getProcessesForUid(uid);
+ }
+ }
+
+ @Override
+ public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
+ @UserIdInt int userId) {
+ synchronized (mLock) {
+ return super.getPackageStateFiltered(packageName, callingUid, userId);
+ }
+ }
+
+ @Override
+ public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getBlockUninstall(userId, packageName);
+ }
+ }
+
+ @NonNull
+ @Override
+ public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
+ synchronized (mLock) {
+ return super.getSharedLibraries();
+ }
+ }
+
+ @Nullable
+ @Override
+ public Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId) {
+ synchronized (mLock) {
+ return super.getPackageOrSharedUser(appId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public SharedUserApi getSharedUser(int sharedUserAppId) {
+ synchronized (mLock) {
+ return super.getSharedUser(sharedUserAppId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) {
+ synchronized (mLock) {
+ return super.getSharedUserPackages(sharedUserAppId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ComponentResolverApi getComponentResolver() {
+ synchronized (mLock) {
+ return super.getComponentResolver();
+ }
+ }
+
+ @Nullable
+ @Override
+ public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) {
+ synchronized (mLock) {
+ return super.getDisabledSystemPackage(packageName);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ResolveInfo getInstantAppInstallerInfo() {
+ synchronized (mLock) {
+ return super.getInstantAppInstallerInfo();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/ComputerTracker.java b/services/core/java/com/android/server/pm/ComputerTracker.java
new file mode 100644
index 000000000000..216ad71b4d5d
--- /dev/null
+++ b/services/core/java/com/android/server/pm/ComputerTracker.java
@@ -0,0 +1,1327 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.pm;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.UserIdInt;
+import android.content.ComponentName;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.ActivityInfo;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ComponentInfo;
+import android.content.pm.InstallSourceInfo;
+import android.content.pm.InstrumentationInfo;
+import android.content.pm.KeySet;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
+import android.content.pm.ParceledListSlice;
+import android.content.pm.ProcessInfo;
+import android.content.pm.ProviderInfo;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
+import android.content.pm.SharedLibraryInfo;
+import android.content.pm.SigningDetails;
+import android.content.pm.UserInfo;
+import android.content.pm.VersionedPackage;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Pair;
+import android.util.SparseArray;
+
+import com.android.server.pm.parsing.pkg.AndroidPackage;
+import com.android.server.pm.pkg.PackageState;
+import com.android.server.pm.pkg.PackageStateInternal;
+import com.android.server.pm.pkg.SharedUserApi;
+import com.android.server.pm.resolution.ComponentResolverApi;
+import com.android.server.utils.WatchedArrayMap;
+import com.android.server.utils.WatchedLongSparseArray;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * This subclass delegates to methods in a Computer after reference-counting the computer.
+ */
+public final class ComputerTracker implements Computer {
+
+ // The number of times a thread reused a computer in its stack instead of fetching
+ // a snapshot computer.
+ private final AtomicInteger mReusedSnapshot = new AtomicInteger(0);
+
+ private final PackageManagerService mService;
+ ComputerTracker(PackageManagerService s) {
+ mService = s;
+ }
+
+ private ThreadComputer snapshot() {
+ ThreadComputer current = PackageManagerService.sThreadComputer.get();
+ if (current.mRefCount > 0) {
+ current.acquire();
+ mReusedSnapshot.incrementAndGet();
+ } else {
+ current.acquire(mService.snapshotComputer());
+ }
+ return current;
+ }
+
+ public @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+ @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags,
+ int filterCallingUid, int userId, boolean resolveForStart,
+ boolean allowDynamicSplits) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.queryIntentActivitiesInternal(intent, resolvedType, flags,
+ privateResolveFlags, filterCallingUid, userId, resolveForStart,
+ allowDynamicSplits);
+ } finally {
+ current.release();
+ }
+ }
+ public @NonNull List<ResolveInfo> queryIntentActivitiesInternal(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.queryIntentActivitiesInternal(intent, resolvedType, flags,
+ userId);
+ } finally {
+ current.release();
+ }
+ }
+ public @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId,
+ int callingUid, boolean includeInstantApps) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.queryIntentServicesInternal(intent, resolvedType, flags,
+ userId, callingUid, includeInstantApps);
+ } finally {
+ current.release();
+ }
+ }
+ public @NonNull QueryIntentActivitiesResult queryIntentActivitiesInternalBody(
+ Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+ int filterCallingUid, int userId, boolean resolveForStart, boolean allowDynamicSplits,
+ String pkgName, String instantAppPkgName) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.queryIntentActivitiesInternalBody(intent, resolvedType,
+ flags, filterCallingUid, userId, resolveForStart, allowDynamicSplits,
+ pkgName, instantAppPkgName);
+ } finally {
+ current.release();
+ }
+ }
+ public ActivityInfo getActivityInfo(ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getActivityInfo(component, flags, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public ActivityInfo getActivityInfoInternal(ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags,
+ int filterCallingUid, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getActivityInfoInternal(component, flags, filterCallingUid,
+ userId);
+ } finally {
+ current.release();
+ }
+ }
+ public AndroidPackage getPackage(String packageName) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getPackage(packageName);
+ } finally {
+ current.release();
+ }
+ }
+ public AndroidPackage getPackage(int uid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getPackage(uid);
+ } finally {
+ current.release();
+ }
+ }
+ public ApplicationInfo generateApplicationInfoFromSettings(String packageName,
+ long flags, int filterCallingUid, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.generateApplicationInfoFromSettings(packageName, flags,
+ filterCallingUid, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public ApplicationInfo getApplicationInfo(String packageName,
+ @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getApplicationInfo(packageName, flags, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public ApplicationInfo getApplicationInfoInternal(String packageName,
+ @PackageManager.ApplicationInfoFlagsBits long flags, int filterCallingUid, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getApplicationInfoInternal(packageName, flags,
+ filterCallingUid, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public ComponentName getDefaultHomeActivity(int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getDefaultHomeActivity(userId);
+ } finally {
+ current.release();
+ }
+ }
+ public ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
+ int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getHomeActivitiesAsUser(allHomeCandidates, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public CrossProfileDomainInfo getCrossProfileDomainPreferredLpr(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int sourceUserId,
+ int parentUserId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getCrossProfileDomainPreferredLpr(intent, resolvedType,
+ flags, sourceUserId, parentUserId);
+ } finally {
+ current.release();
+ }
+ }
+ public Intent getHomeIntent() {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getHomeIntent();
+ } finally {
+ current.release();
+ }
+ }
+ public List<CrossProfileIntentFilter> getMatchingCrossProfileIntentFilters(
+ Intent intent, String resolvedType, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getMatchingCrossProfileIntentFilters(intent, resolvedType,
+ userId);
+ } finally {
+ current.release();
+ }
+ }
+ public List<ResolveInfo> applyPostResolutionFilter(
+ @NonNull List<ResolveInfo> resolveInfos,
+ String ephemeralPkgName, boolean allowDynamicSplits, int filterCallingUid,
+ boolean resolveForStart, int userId, Intent intent) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.applyPostResolutionFilter(resolveInfos, ephemeralPkgName,
+ allowDynamicSplits, filterCallingUid, resolveForStart, userId, intent);
+ } finally {
+ current.release();
+ }
+ }
+ public PackageInfo generatePackageInfo(PackageStateInternal ps,
+ @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.generatePackageInfo(ps, flags, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public PackageInfo getPackageInfo(String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getPackageInfo(packageName, flags, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public PackageInfo getPackageInfoInternal(String packageName, long versionCode,
+ long flags, int filterCallingUid, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getPackageInfoInternal(packageName, versionCode, flags,
+ filterCallingUid, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public PackageStateInternal getPackageStateInternal(String packageName) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getPackageStateInternal(packageName);
+ } finally {
+ current.release();
+ }
+ }
+ public PackageStateInternal getPackageStateInternal(String packageName, int callingUid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getPackageStateInternal(packageName, callingUid);
+ } finally {
+ current.release();
+ }
+ }
+
+ @Nullable
+ public PackageState getPackageStateCopied(@NonNull String packageName) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getPackageStateCopied(packageName);
+ } finally {
+ current.release();
+ }
+ }
+
+ public ParceledListSlice<PackageInfo> getInstalledPackages(long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getInstalledPackages(flags, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public ResolveInfo createForwardingResolveInfoUnchecked(WatchedIntentFilter filter,
+ int sourceUserId, int targetUserId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.createForwardingResolveInfoUnchecked(filter, sourceUserId,
+ targetUserId);
+ } finally {
+ current.release();
+ }
+ }
+ public ServiceInfo getServiceInfo(ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getServiceInfo(component, flags, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public SharedLibraryInfo getSharedLibraryInfo(String name, long version) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getSharedLibraryInfo(name, version);
+ } finally {
+ current.release();
+ }
+ }
+ public SigningDetails getSigningDetails(@NonNull String packageName) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getSigningDetails(packageName);
+ } finally {
+ current.release();
+ }
+ }
+ public SigningDetails getSigningDetails(int uid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getSigningDetails(uid);
+ } finally {
+ current.release();
+ }
+ }
+ public String getInstantAppPackageName(int callingUid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getInstantAppPackageName(callingUid);
+ } finally {
+ current.release();
+ }
+ }
+ public String resolveExternalPackageName(AndroidPackage pkg) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.resolveExternalPackageName(pkg);
+ } finally {
+ current.release();
+ }
+ }
+ public String resolveInternalPackageName(String packageName, long versionCode) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.resolveInternalPackageName(packageName, versionCode);
+ } finally {
+ current.release();
+ }
+ }
+ public String[] getPackagesForUid(int uid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getPackagesForUid(uid);
+ } finally {
+ current.release();
+ }
+ }
+ public UserInfo getProfileParent(int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getProfileParent(userId);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean canViewInstantApps(int callingUid, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.canViewInstantApps(callingUid, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.filterAppAccess(pkg, callingUid, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean filterAppAccess(String packageName, int callingUid, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.filterAppAccess(packageName, callingUid, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean filterAppAccess(int uid, int callingUid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.filterAppAccess(uid, callingUid);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean filterSharedLibPackage(@Nullable PackageStateInternal ps, int uid,
+ int userId, @PackageManager.ComponentInfoFlagsBits long flags) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.filterSharedLibPackage(ps, uid, userId, flags);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean isCallerSameApp(String packageName, int uid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.isCallerSameApp(packageName, uid);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.isComponentVisibleToInstantApp(component);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean isComponentVisibleToInstantApp(@Nullable ComponentName component,
+ @PackageManager.ComponentType int type) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.isComponentVisibleToInstantApp(component, type);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent,
+ int userId, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent,
+ userId, resolvedType, flags);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean isInstantApp(String packageName, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.isInstantApp(packageName, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean isInstantAppInternal(String packageName, @UserIdInt int userId,
+ int callingUid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.isInstantAppInternal(packageName, userId, callingUid);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean isSameProfileGroup(@UserIdInt int callerUserId,
+ @UserIdInt int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.isSameProfileGroup(callerUserId, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean shouldFilterApplication(@NonNull SharedUserSetting sus,
+ int callingUid, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.shouldFilterApplication(sus, callingUid, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean shouldFilterApplication(@Nullable PackageStateInternal ps,
+ int callingUid, @Nullable ComponentName component,
+ @PackageManager.ComponentType int componentType, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.shouldFilterApplication(ps, callingUid, component,
+ componentType, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public boolean shouldFilterApplication(@Nullable PackageStateInternal ps,
+ int callingUid, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.shouldFilterApplication(ps, callingUid, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public int checkUidPermission(String permName, int uid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.checkUidPermission(permName, uid);
+ } finally {
+ current.release();
+ }
+ }
+ public int getPackageUidInternal(String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, int userId, int callingUid) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.getPackageUidInternal(packageName, flags, userId,
+ callingUid);
+ } finally {
+ current.release();
+ }
+ }
+ public long updateFlagsForApplication(long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.updateFlagsForApplication(flags, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public long updateFlagsForComponent(long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.updateFlagsForComponent(flags, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public long updateFlagsForPackage(long flags, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.updateFlagsForPackage(flags, userId);
+ } finally {
+ current.release();
+ }
+ }
+ public long updateFlagsForResolve(long flags, int userId, int callingUid,
+ boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.updateFlagsForResolve(flags, userId, callingUid,
+ wantInstantApps, isImplicitImageCaptureIntentAndNotSetByDpc);
+ } finally {
+ current.release();
+ }
+ }
+ public long updateFlagsForResolve(long flags, int userId, int callingUid,
+ boolean wantInstantApps, boolean onlyExposedExplicitly,
+ boolean isImplicitImageCaptureIntentAndNotSetByDpc) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.updateFlagsForResolve(flags, userId, callingUid,
+ wantInstantApps, onlyExposedExplicitly,
+ isImplicitImageCaptureIntentAndNotSetByDpc);
+ } finally {
+ current.release();
+ }
+ }
+ public void dump(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) {
+ ThreadComputer current = snapshot();
+ try {
+ current.mComputer.dump(type, fd, pw, dumpState);
+ } finally {
+ current.release();
+ }
+ }
+ public void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId,
+ boolean requireFullPermission, boolean checkShell, String message) {
+ ThreadComputer current = snapshot();
+ try {
+ current.mComputer.enforceCrossUserOrProfilePermission(callingUid, userId,
+ requireFullPermission, checkShell, message);
+ } finally {
+ current.release();
+ }
+ }
+ public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
+ boolean requireFullPermission, boolean checkShell, String message) {
+ ThreadComputer current = snapshot();
+ try {
+ current.mComputer.enforceCrossUserPermission(callingUid, userId,
+ requireFullPermission, checkShell, message);
+ } finally {
+ current.release();
+ }
+ }
+ public void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
+ boolean requireFullPermission, boolean checkShell,
+ boolean requirePermissionWhenSameUser, String message) {
+ ThreadComputer current = snapshot();
+ try {
+ current.mComputer.enforceCrossUserPermission(callingUid, userId,
+ requireFullPermission, checkShell, requirePermissionWhenSameUser, message);
+ } finally {
+ current.release();
+ }
+ }
+ public PackageManagerService.FindPreferredActivityBodyResult findPreferredActivityInternal(
+ Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+ List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug,
+ int userId, boolean queryMayBeFiltered) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.findPreferredActivityInternal(intent, resolvedType, flags,
+ query, always, removeMatches, debug, userId, queryMayBeFiltered);
+ } finally {
+ current.release();
+ }
+ }
+ public ResolveInfo findPersistentPreferredActivityLP(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+ List<ResolveInfo> query, boolean debug, int userId) {
+ ThreadComputer current = snapshot();
+ try {
+ return current.mComputer.findPersistentPreferredActivityLP(intent, resolvedType,
+ flags, query, debug, userId);
+ } finally {
+ current.release();
+ }
+ }
+
+ @Override
+ public String[] getAllAvailablePackageNames() {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getAllAvailablePackageNames();
+ }
+ }
+
+ @Override
+ public PreferredIntentResolver getPreferredActivities(int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPreferredActivities(userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPackageStates();
+ }
+ }
+
+ @Nullable
+ @Override
+ public String getRenamedPackage(@NonNull String packageName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getRenamedPackage(packageName);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ArraySet<String> getNotifyPackagesForReplacedReceived(@NonNull String[] packages) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getNotifyPackagesForReplacedReceived(packages);
+ }
+ }
+
+ @Override
+ public int getPackageStartability(boolean safeMode, @NonNull String packageName, int callingUid,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPackageStartability(safeMode, packageName, callingUid,
+ userId);
+ }
+ }
+
+ @Override
+ public boolean isPackageAvailable(String packageName, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.isPackageAvailable(packageName, userId);
+ }
+ }
+
+ @Override
+ public String[] currentToCanonicalPackageNames(String[] names) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.currentToCanonicalPackageNames(names);
+ }
+ }
+
+ @Override
+ public String[] canonicalToCurrentPackageNames(String[] names) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.canonicalToCurrentPackageNames(names);
+ }
+ }
+
+ @Override
+ public int[] getPackageGids(@NonNull String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPackageGids(packageName, flags, userId);
+ }
+ }
+
+ @Override
+ public int getTargetSdkVersion(@NonNull String packageName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getTargetSdkVersion(packageName);
+ }
+ }
+
+ @Override
+ public boolean activitySupportsIntent(@NonNull ComponentName resolveComponentName,
+ @NonNull ComponentName component, @NonNull Intent intent, String resolvedType) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.activitySupportsIntent(resolveComponentName, component, intent,
+ resolvedType);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ActivityInfo getReceiverInfo(@NonNull ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getReceiverInfo(component, flags, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(@NonNull String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getSharedLibraries(packageName, flags, userId);
+ }
+ }
+
+ @Override
+ public boolean canRequestPackageInstalls(@NonNull String packageName, int callingUid,
+ @UserIdInt int userId, boolean throwIfPermNotDeclared) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.canRequestPackageInstalls(packageName, callingUid, userId,
+ throwIfPermNotDeclared);
+ }
+ }
+
+ @Override
+ public boolean isInstallDisabledForPackage(@NonNull String packageName, int uid,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.isInstallDisabledForPackage(packageName, uid, userId);
+ }
+ }
+
+ @Override
+ public List<VersionedPackage> getPackagesUsingSharedLibrary(@NonNull SharedLibraryInfo libInfo,
+ @PackageManager.PackageInfoFlagsBits long flags, int callingUid,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPackagesUsingSharedLibrary(libInfo, flags, callingUid,
+ userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
+ @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getDeclaredSharedLibraries(packageName, flags, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ProviderInfo getProviderInfo(@NonNull ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getProviderInfo(component, flags, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public String[] getSystemSharedLibraryNames() {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getSystemSharedLibraryNames();
+ }
+ }
+
+ @Override
+ public int checkSignatures(@NonNull String pkg1,
+ @NonNull String pkg2) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.checkSignatures(pkg1, pkg2);
+ }
+ }
+
+ @Override
+ public int checkUidSignatures(int uid1, int uid2) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.checkUidSignatures(uid1, uid2);
+ }
+ }
+
+ @Override
+ public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate,
+ int type) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.hasSigningCertificate(packageName, certificate, type);
+ }
+ }
+
+ @Override
+ public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate, int type) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.hasUidSigningCertificate(uid, certificate, type);
+ }
+ }
+
+ @Override
+ public List<String> getAllPackages() {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getAllPackages();
+ }
+ }
+
+ @Nullable
+ @Override
+ public String getNameForUid(int uid) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getNameForUid(uid);
+ }
+ }
+
+ @Nullable
+ @Override
+ public String[] getNamesForUids(int[] uids) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getNamesForUids(uids);
+ }
+ }
+
+ @Override
+ public int getUidForSharedUser(@NonNull String sharedUserName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getUidForSharedUser(sharedUserName);
+ }
+ }
+
+ @Override
+ public int getFlagsForUid(int uid) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getFlagsForUid(uid);
+ }
+ }
+
+ @Override
+ public int getPrivateFlagsForUid(int uid) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPrivateFlagsForUid(uid);
+ }
+ }
+
+ @Override
+ public boolean isUidPrivileged(int uid) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.isUidPrivileged(uid);
+ }
+ }
+
+ @NonNull
+ @Override
+ public String[] getAppOpPermissionPackages(@NonNull String permissionName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getAppOpPermissionPackages(permissionName);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
+ @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPackagesHoldingPermissions(permissions, flags, userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public List<ApplicationInfo> getInstalledApplications(
+ @PackageManager.ApplicationInfoFlagsBits long flags, @UserIdInt int userId,
+ int callingUid) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getInstalledApplications(flags, userId, callingUid);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ProviderInfo resolveContentProvider(@NonNull String name,
+ @PackageManager.ResolveInfoFlagsBits long flags, @UserIdInt int userId,
+ int callingUid) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.resolveContentProvider(name, flags, userId, callingUid);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ProviderInfo getGrantImplicitAccessProviderInfo(int recipientUid,
+ @NonNull String visibleAuthority) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getGrantImplicitAccessProviderInfo(recipientUid,
+ visibleAuthority);
+ }
+ }
+
+ @Override
+ public void querySyncProviders(boolean safeMode, @NonNull List<String> outNames,
+ @NonNull List<ProviderInfo> outInfo) {
+ try (ThreadComputer current = snapshot()) {
+ current.mComputer.querySyncProviders(safeMode, outNames, outInfo);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName,
+ int uid, @PackageManager.ComponentInfoFlagsBits long flags,
+ @Nullable String metaDataKey) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.queryContentProviders(processName, uid, flags, metaDataKey);
+ }
+ }
+
+ @Nullable
+ @Override
+ public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getInstrumentationInfo(component, flags);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<InstrumentationInfo> queryInstrumentation(
+ @NonNull String targetPackage, int flags) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.queryInstrumentation(targetPackage, flags);
+ }
+ }
+
+ @NonNull
+ @Override
+ public List<PackageStateInternal> findSharedNonSystemLibraries(
+ @NonNull PackageStateInternal pkgSetting) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.findSharedNonSystemLibraries(pkgSetting);
+ }
+ }
+
+ @Override
+ public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getApplicationHiddenSettingAsUser(packageName, userId);
+ }
+ }
+
+ @Override
+ public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.isPackageSuspendedForUser(packageName, userId);
+ }
+ }
+
+ @Override
+ public boolean isSuspendingAnyPackages(@NonNull String suspendingPackage,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.isSuspendingAnyPackages(suspendingPackage, userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getAllIntentFilters(packageName);
+ }
+ }
+
+ @Override
+ public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getBlockUninstallForUser(packageName, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName,
+ @UserIdInt int[] userIds, boolean isInstantApp) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getBroadcastAllowList(packageName, userIds, isInstantApp);
+ }
+ }
+
+ @Nullable
+ @Override
+ public String getInstallerPackageName(@NonNull String packageName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getInstallerPackageName(packageName);
+ }
+ }
+
+ @Nullable
+ @Override
+ public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getInstallSourceInfo(packageName);
+ }
+ }
+
+ @Override
+ public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getApplicationEnabledSetting(packageName, userId);
+ }
+ }
+
+ @Override
+ public int getComponentEnabledSetting(@NonNull ComponentName component, int callingUid,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getComponentEnabledSetting(component, callingUid, userId);
+ }
+ }
+
+ @Override
+ public int getComponentEnabledSettingInternal(@NonNull ComponentName component, int callingUid,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getComponentEnabledSettingInternal(
+ component, callingUid, userId);
+ }
+ }
+
+ @Override
+ public boolean isComponentEffectivelyEnabled(@NonNull ComponentInfo componentInfo,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.isComponentEffectivelyEnabled(componentInfo, userId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getKeySetByAlias(packageName, alias);
+ }
+ }
+
+ @Nullable
+ @Override
+ public KeySet getSigningKeySet(@NonNull String packageName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getSigningKeySet(packageName);
+ }
+ }
+
+ @Override
+ public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.isPackageSignedByKeySet(packageName, ks);
+ }
+ }
+
+ @Override
+ public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.isPackageSignedByKeySetExactly(packageName, ks);
+ }
+ }
+
+ @Nullable
+ @Override
+ public int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getVisibilityAllowList(packageName, userId);
+ }
+ }
+
+ @Override
+ public boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.canQueryPackage(callingUid, targetPackageName);
+ }
+ }
+
+ @Override
+ public int getPackageUid(@NonNull String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPackageUid(packageName, flags, userId);
+ }
+ }
+
+ @Override
+ public boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.canAccessComponent(callingUid, component, userId);
+ }
+ }
+
+ @Override
+ public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.isCallerInstallerOfRecord(pkg, callingUid);
+ }
+ }
+
+ @Override
+ public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getInstallReason(packageName, userId);
+ }
+ }
+
+ @Override
+ public boolean canPackageQuery(@NonNull String sourcePackageName,
+ @NonNull String targetPackageName, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.canPackageQuery(sourcePackageName, targetPackageName, userId);
+ }
+ }
+
+ @Override
+ public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
+ @UserIdInt int sourceUserId, @UserIdInt int targetUserId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.canForwardTo(intent, resolvedType, sourceUserId, targetUserId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public List<ApplicationInfo> getPersistentApplications(boolean safeMode, int flags) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPersistentApplications(safeMode, flags);
+ }
+ }
+
+ @NonNull
+ @Override
+ public SparseArray<String> getAppsWithSharedUserIds() {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getAppsWithSharedUserIds();
+ }
+ }
+
+ @NonNull
+ @Override
+ public String[] getSharedUserPackagesForPackage(@NonNull String packageName,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getSharedUserPackagesForPackage(packageName, userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getUnusedPackages(downgradeTimeThresholdMillis);
+ }
+ }
+
+ @Nullable
+ @Override
+ public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getHarmfulAppWarning(packageName, userId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public String[] filterOnlySystemPackages(@Nullable String... pkgNames) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.filterOnlySystemPackages(pkgNames);
+ }
+ }
+
+ @NonNull
+ @Override
+ public List<AndroidPackage> getPackagesForAppId(int appId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPackagesForAppId(appId);
+ }
+ }
+
+ @Override
+ public int getUidTargetSdkVersion(int uid) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getUidTargetSdkVersion(uid);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getProcessesForUid(uid);
+ }
+ }
+
+ @Override
+ public PackageStateInternal getPackageStateFiltered(@NonNull String packageName, int callingUid,
+ @UserIdInt int userId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPackageStateFiltered(packageName, callingUid, userId);
+ }
+ }
+
+ @Override
+ public boolean getBlockUninstall(@UserIdInt int userId, @NonNull String packageName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getBlockUninstall(userId, packageName);
+ }
+ }
+
+ @NonNull
+ @Override
+ public WatchedArrayMap<String, WatchedLongSparseArray<SharedLibraryInfo>> getSharedLibraries() {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getSharedLibraries();
+ }
+ }
+
+ @Nullable
+ @Override
+ public Pair<PackageStateInternal, SharedUserApi> getPackageOrSharedUser(int appId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getPackageOrSharedUser(appId);
+ }
+ }
+
+ @Nullable
+ @Override
+ public SharedUserApi getSharedUser(int sharedUserAppId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getSharedUser(sharedUserAppId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getSharedUserPackages(sharedUserAppId);
+ }
+ }
+
+ @NonNull
+ @Override
+ public ComponentResolverApi getComponentResolver() {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getComponentResolver();
+ }
+ }
+
+ @Nullable
+ @Override
+ public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getDisabledSystemPackage(packageName);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ResolveInfo getInstantAppInstallerInfo() {
+ try (ThreadComputer current = snapshot()) {
+ return current.mComputer.getInstantAppInstallerInfo();
+ }
+ }
+}
diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java
index 0e1c1ad4120f..664c7bb929d7 100644
--- a/services/core/java/com/android/server/pm/DeletePackageHelper.java
+++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java
@@ -147,7 +147,6 @@ final class DeletePackageHelper {
final SparseArray<TempUserState> priorUserStates;
/** enabled state of the uninstalled application */
synchronized (mPm.mLock) {
- final Computer computer = mPm.snapshotComputer();
uninstalledPs = mPm.mSettings.getPackageLPr(packageName);
if (uninstalledPs == null) {
Slog.w(TAG, "Not removing non-existent package " + packageName);
@@ -171,10 +170,10 @@ final class DeletePackageHelper {
if (pkg != null) {
SharedLibraryInfo libraryInfo = null;
if (pkg.getStaticSharedLibName() != null) {
- libraryInfo = computer.getSharedLibraryInfo(pkg.getStaticSharedLibName(),
+ libraryInfo = mPm.getSharedLibraryInfo(pkg.getStaticSharedLibName(),
pkg.getStaticSharedLibVersion());
} else if (pkg.getSdkLibName() != null) {
- libraryInfo = computer.getSharedLibraryInfo(pkg.getSdkLibName(),
+ libraryInfo = mPm.getSharedLibraryInfo(pkg.getSdkLibName(),
pkg.getSdkLibVersionMajor());
}
@@ -184,7 +183,7 @@ final class DeletePackageHelper {
continue;
}
List<VersionedPackage> libClientPackages =
- computer.getPackagesUsingSharedLibrary(libraryInfo,
+ mPm.getPackagesUsingSharedLibrary(libraryInfo,
MATCH_KNOWN_PACKAGES, Process.SYSTEM_UID, currUserId);
if (!ArrayUtils.isEmpty(libClientPackages)) {
Slog.w(TAG, "Not removing package " + pkg.getManifestPackageName()
@@ -455,11 +454,11 @@ final class DeletePackageHelper {
if (affectedUserIds == null) {
affectedUserIds = mPm.resolveUserIds(userId);
}
- final Computer snapshot = mPm.snapshotComputer();
for (final int affectedUserId : affectedUserIds) {
if (hadSuspendAppsPermission.get(affectedUserId)) {
- mPm.unsuspendForSuspendingPackage(snapshot, packageName, affectedUserId);
- mPm.removeAllDistractingPackageRestrictions(snapshot, affectedUserId);
+ mPm.unsuspendForSuspendingPackage(mPm.snapshotComputer(), packageName,
+ affectedUserId);
+ mPm.removeAllDistractingPackageRestrictions(affectedUserId);
}
}
@@ -622,8 +621,7 @@ final class DeletePackageHelper {
final int callingUid = Binder.getCallingUid();
mPm.mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.DELETE_PACKAGES, null);
- final Computer snapshot = mPm.snapshotComputer();
- final boolean canViewInstantApps = snapshot.canViewInstantApps(callingUid, userId);
+ final boolean canViewInstantApps = mPm.canViewInstantApps(callingUid, userId);
Preconditions.checkNotNull(versionedPackage);
Preconditions.checkNotNull(observer);
Preconditions.checkArgumentInRange(versionedPackage.getLongVersionCode(),
@@ -646,13 +644,12 @@ final class DeletePackageHelper {
}
// Normalize package name to handle renamed packages and static libs
- final String internalPackageName =
- snapshot.resolveInternalPackageName(packageName, versionCode);
+ final String internalPackageName = mPm.resolveInternalPackageName(packageName, versionCode);
final int uid = Binder.getCallingUid();
- if (!isOrphaned(snapshot, internalPackageName)
+ if (!isOrphaned(internalPackageName)
&& !allowSilentUninstall
- && !isCallerAllowedToSilentlyUninstall(snapshot, uid, internalPackageName)) {
+ && !isCallerAllowedToSilentlyUninstall(uid, internalPackageName)) {
mPm.mHandler.post(() -> {
try {
final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
@@ -683,7 +680,8 @@ final class DeletePackageHelper {
return;
}
- if (!deleteAllUsers && snapshot.getBlockUninstallForUser(internalPackageName, userId)) {
+ if (!deleteAllUsers && mPm.mIPackageManager
+ .getBlockUninstallForUser(internalPackageName, userId)) {
mPm.mHandler.post(() -> {
try {
observer.onPackageDeleted(packageName,
@@ -758,45 +756,44 @@ final class DeletePackageHelper {
});
}
- private boolean isOrphaned(@NonNull Computer snapshot, String packageName) {
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ private boolean isOrphaned(String packageName) {
+ final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName);
return packageState != null && packageState.getInstallSource().isOrphaned;
}
- private boolean isCallerAllowedToSilentlyUninstall(@NonNull Computer snapshot, int callingUid,
- String pkgName) {
+ private boolean isCallerAllowedToSilentlyUninstall(int callingUid, String pkgName) {
if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID
|| UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
return true;
}
final int callingUserId = UserHandle.getUserId(callingUid);
// If the caller installed the pkgName, then allow it to silently uninstall.
- if (callingUid == snapshot.getPackageUid(snapshot.getInstallerPackageName(pkgName), 0,
- callingUserId)) {
+ if (callingUid == mPm.mIPackageManager.getPackageUid(
+ mPm.mIPackageManager.getInstallerPackageName(pkgName), 0, callingUserId)) {
return true;
}
// Allow package verifier to silently uninstall.
- if (mPm.mRequiredVerifierPackage != null && callingUid == snapshot
+ if (mPm.mRequiredVerifierPackage != null && callingUid == mPm.mIPackageManager
.getPackageUid(mPm.mRequiredVerifierPackage, 0, callingUserId)) {
return true;
}
// Allow package uninstaller to silently uninstall.
- if (mPm.mRequiredUninstallerPackage != null && callingUid == snapshot
+ if (mPm.mRequiredUninstallerPackage != null && callingUid == mPm.mIPackageManager
.getPackageUid(mPm.mRequiredUninstallerPackage, 0, callingUserId)) {
return true;
}
// Allow storage manager to silently uninstall.
- if (mPm.mStorageManagerPackage != null && callingUid == snapshot.getPackageUid(
+ if (mPm.mStorageManagerPackage != null && callingUid == mPm.mIPackageManager.getPackageUid(
mPm.mStorageManagerPackage, 0, callingUserId)) {
return true;
}
// Allow caller having MANAGE_PROFILE_AND_DEVICE_OWNERS permission to silently
// uninstall for device owner provisioning.
- return snapshot.checkUidPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, callingUid)
+ return mPm.mIPackageManager.checkUidPermission(MANAGE_PROFILE_AND_DEVICE_OWNERS, callingUid)
== PERMISSION_GRANTED;
}
@@ -902,8 +899,8 @@ final class DeletePackageHelper {
int installedForUsersCount = 0;
synchronized (mPm.mLock) {
// Normalize package name to handle renamed packages and static libs
- final String internalPkgName = mPm.snapshotComputer()
- .resolveInternalPackageName(packageName, versionCode);
+ final String internalPkgName = mPm.resolveInternalPackageName(packageName,
+ versionCode);
final PackageSetting ps = mPm.mSettings.getPackageLPr(internalPkgName);
if (ps != null) {
int[] installedUsers = ps.queryInstalledUsers(mUserManagerInternal.getUserIds(),
diff --git a/services/core/java/com/android/server/pm/DexOptHelper.java b/services/core/java/com/android/server/pm/DexOptHelper.java
index 50b2e2321886..74ea7cc9b4e1 100644
--- a/services/core/java/com/android/server/pm/DexOptHelper.java
+++ b/services/core/java/com/android/server/pm/DexOptHelper.java
@@ -266,9 +266,8 @@ final class DexOptHelper {
return;
}
- final Computer snapshot = mPm.snapshotComputer();
List<PackageStateInternal> pkgSettings =
- getPackagesForDexopt(snapshot.getPackageStates().values(), mPm);
+ getPackagesForDexopt(mPm.getPackageStates().values(), mPm);
List<AndroidPackage> pkgs = new ArrayList<>(pkgSettings.size());
for (int index = 0; index < pkgSettings.size(); index++) {
@@ -283,19 +282,17 @@ final class DexOptHelper {
final int elapsedTimeSeconds =
(int) TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime);
- final Computer newSnapshot = mPm.snapshotComputer();
-
MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_dexopted", stats[0]);
MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_skipped", stats[1]);
MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_failed", stats[2]);
- MetricsLogger.histogram(mPm.mContext, "opt_dialog_num_total",
- getOptimizablePackages(newSnapshot).size());
+ MetricsLogger.histogram(
+ mPm.mContext, "opt_dialog_num_total", getOptimizablePackages().size());
MetricsLogger.histogram(mPm.mContext, "opt_dialog_time_s", elapsedTimeSeconds);
}
- public ArraySet<String> getOptimizablePackages(@NonNull Computer snapshot) {
+ public ArraySet<String> getOptimizablePackages() {
ArraySet<String> pkgs = new ArraySet<>();
- mPm.forEachPackageState(snapshot, packageState -> {
+ mPm.forEachPackageState(packageState -> {
final AndroidPackage pkg = packageState.getPkg();
if (pkg != null && mPm.mPackageDexOptimizer.canOptimizePackage(pkg)) {
pkgs.add(packageState.getPackageName());
@@ -305,10 +302,10 @@ final class DexOptHelper {
}
/*package*/ boolean performDexOpt(DexoptOptions options) {
- final Computer snapshot = mPm.snapshotComputer();
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) {
return false;
- } else if (snapshot.isInstantApp(options.getPackageName(), UserHandle.getCallingUserId())) {
+ } else if (mPm.mIPackageManager.isInstantApp(options.getPackageName(),
+ UserHandle.getCallingUserId())) {
return false;
}
@@ -420,10 +417,10 @@ final class DexOptHelper {
mPm.getDexManager().getPackageUseInfoOrDefault(p.getPackageName()), options);
}
- public void forceDexOpt(@NonNull Computer snapshot, String packageName) {
+ public void forceDexOpt(String packageName) {
PackageManagerServiceUtils.enforceSystemOrRoot("forceDexOpt");
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName);
final AndroidPackage pkg = packageState == null ? null : packageState.getPkg();
if (packageState == null || pkg == null) {
throw new IllegalArgumentException("Unknown package: " + packageName);
@@ -488,21 +485,19 @@ final class DexOptHelper {
ArrayList<PackageStateInternal> sortTemp = new ArrayList<>(remainingPkgSettings.size());
- final Computer snapshot = packageManagerService.snapshotComputer();
-
// Give priority to core apps.
- applyPackageFilter(snapshot, pkgSetting -> pkgSetting.getPkg().isCoreApp(), result,
+ applyPackageFilter(pkgSetting -> pkgSetting.getPkg().isCoreApp(), result,
remainingPkgSettings, sortTemp, packageManagerService);
// Give priority to system apps that listen for pre boot complete.
Intent intent = new Intent(Intent.ACTION_PRE_BOOT_COMPLETED);
final ArraySet<String> pkgNames = getPackageNamesForIntent(intent, UserHandle.USER_SYSTEM);
- applyPackageFilter(snapshot, pkgSetting -> pkgNames.contains(pkgSetting.getPackageName()), result,
+ applyPackageFilter(pkgSetting -> pkgNames.contains(pkgSetting.getPackageName()), result,
remainingPkgSettings, sortTemp, packageManagerService);
// Give priority to apps used by other apps.
DexManager dexManager = packageManagerService.getDexManager();
- applyPackageFilter(snapshot, pkgSetting ->
+ applyPackageFilter(pkgSetting ->
dexManager.getPackageUseInfoOrDefault(pkgSetting.getPackageName())
.isAnyCodePathUsedByOtherApps(),
result, remainingPkgSettings, sortTemp, packageManagerService);
@@ -540,7 +535,7 @@ final class DexOptHelper {
// No historical info. Take all.
remainingPredicate = pkgSetting -> true;
}
- applyPackageFilter(snapshot, remainingPredicate, result, remainingPkgSettings, sortTemp,
+ applyPackageFilter(remainingPredicate, result, remainingPkgSettings, sortTemp,
packageManagerService);
if (debug) {
@@ -555,7 +550,7 @@ final class DexOptHelper {
// package will be removed from {@code packages} and added to {@code result} with its
// dependencies. If usage data is available, the positive packages will be sorted by usage
// data (with {@code sortTemp} as temporary storage).
- private static void applyPackageFilter(@NonNull Computer snapshot,
+ private static void applyPackageFilter(
Predicate<PackageStateInternal> filter,
Collection<PackageStateInternal> result,
Collection<PackageStateInternal> packages,
@@ -573,7 +568,8 @@ final class DexOptHelper {
for (PackageStateInternal pkgSetting : sortTemp) {
result.add(pkgSetting);
- List<PackageStateInternal> deps = snapshot.findSharedNonSystemLibraries(pkgSetting);
+ List<PackageStateInternal> deps =
+ packageManagerService.findSharedNonSystemLibraries(pkgSetting);
if (!deps.isEmpty()) {
deps.removeAll(result);
result.addAll(deps);
diff --git a/services/core/java/com/android/server/pm/DomainVerificationConnection.java b/services/core/java/com/android/server/pm/DomainVerificationConnection.java
index 20e4dd8a995b..db8c6dc60b5e 100644
--- a/services/core/java/com/android/server/pm/DomainVerificationConnection.java
+++ b/services/core/java/com/android/server/pm/DomainVerificationConnection.java
@@ -21,6 +21,7 @@ import static com.android.server.pm.PackageManagerService.DOMAIN_VERIFICATION;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
+import android.content.pm.PackageManagerInternal;
import android.os.Binder;
import android.os.Message;
import android.os.UserHandle;
@@ -34,10 +35,13 @@ import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV2;
public final class DomainVerificationConnection implements DomainVerificationService.Connection,
DomainVerificationProxyV1.Connection, DomainVerificationProxyV2.Connection {
final PackageManagerService mPm;
+ final PackageManagerInternal mPmInternal;
final UserManagerInternal mUmInternal;
+ // TODO(b/198166813): remove PMS dependency
DomainVerificationConnection(PackageManagerService pm) {
mPm = pm;
+ mPmInternal = mPm.mInjector.getLocalService(PackageManagerInternal.class);
mUmInternal = mPm.mInjector.getLocalService(UserManagerInternal.class);
}
@@ -78,18 +82,18 @@ public final class DomainVerificationConnection implements DomainVerificationSer
@Override
public boolean isCallerPackage(int callingUid, @NonNull String packageName) {
final int callingUserId = UserHandle.getUserId(callingUid);
- return callingUid == mPm.snapshotComputer().getPackageUid(packageName, 0, callingUserId);
+ return callingUid == mPmInternal.getPackageUid(packageName, 0, callingUserId);
}
@Nullable
@Override
public AndroidPackage getPackage(@NonNull String packageName) {
- return mPm.snapshotComputer().getPackage(packageName);
+ return mPmInternal.getPackage(packageName);
}
@Override
public boolean filterAppAccess(String packageName, int callingUid, int userId) {
- return mPm.snapshotComputer().filterAppAccess(packageName, callingUid, userId);
+ return mPmInternal.filterAppAccess(packageName, callingUid, userId);
}
@Override
@@ -104,6 +108,6 @@ public final class DomainVerificationConnection implements DomainVerificationSer
@NonNull
public Computer snapshot() {
- return mPm.snapshotComputer();
+ return (Computer) mPmInternal.snapshot();
}
}
diff --git a/services/core/java/com/android/server/pm/DumpHelper.java b/services/core/java/com/android/server/pm/DumpHelper.java
index f83ef5aea23a..05ef3c4ec300 100644
--- a/services/core/java/com/android/server/pm/DumpHelper.java
+++ b/services/core/java/com/android/server/pm/DumpHelper.java
@@ -55,7 +55,6 @@ final class DumpHelper {
@NeverCompile // Avoid size overhead of debugging code.
public void doDump(FileDescriptor fd, PrintWriter pw, String[] args) {
- final Computer snapshot = mPm.snapshotComputer();
DumpState dumpState = new DumpState();
ArraySet<String> permissionNames = null;
@@ -122,7 +121,7 @@ final class DumpHelper {
}
// Normalize package name to handle renamed packages and static libs
- pkg = snapshot.resolveInternalPackageName(pkg, PackageManager.VERSION_CODE_HIGHEST);
+ pkg = mPm.resolveInternalPackageName(pkg, PackageManager.VERSION_CODE_HIGHEST);
pw.println(mPm.checkPermission(perm, pkg, user));
return;
@@ -244,7 +243,7 @@ final class DumpHelper {
// Return if the package doesn't exist.
if (packageName != null
- && snapshot.getPackageStateInternal(packageName) == null
+ && mPm.getPackageStateInternal(packageName) == null
&& !mPm.mApexManager.isApexPackage(packageName)) {
pw.println("Unable to find package: " + packageName);
return;
@@ -258,7 +257,7 @@ final class DumpHelper {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_VERSION)
&& packageName == null) {
- snapshot.dump(DumpState.DUMP_VERSION, fd, pw, dumpState);
+ mPm.dumpComputer(DumpState.DUMP_VERSION, fd, pw, dumpState);
}
if (!checkin
@@ -274,7 +273,7 @@ final class DumpHelper {
final String knownPackage = PackageManagerInternal.knownPackageToString(i);
ipw.print(knownPackage);
ipw.println(":");
- final String[] pkgNames = mPm.getKnownPackageNamesInternal(snapshot, i,
+ final String[] pkgNames = mPm.getKnownPackageNamesInternal(i,
UserHandle.USER_SYSTEM);
ipw.increaseIndent();
if (ArrayUtils.isEmpty(pkgNames)) {
@@ -289,6 +288,8 @@ final class DumpHelper {
ipw.decreaseIndent();
}
+ final Computer snapshot = mPm.snapshotComputer();
+
if (dumpState.isDumping(DumpState.DUMP_VERIFIERS)
&& packageName == null) {
final String requiredVerifierPackage = mPm.mRequiredVerifierPackage;
@@ -342,7 +343,7 @@ final class DumpHelper {
if (dumpState.isDumping(DumpState.DUMP_LIBS)
&& packageName == null) {
- snapshot.dump(DumpState.DUMP_LIBS, fd, pw, dumpState);
+ mPm.dumpComputer(DumpState.DUMP_LIBS, fd, pw, dumpState);
}
if (dumpState.isDumping(DumpState.DUMP_FEATURES)
@@ -388,17 +389,17 @@ final class DumpHelper {
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PREFERRED)) {
- snapshot.dump(DumpState.DUMP_PREFERRED, fd, pw, dumpState);
+ mPm.dumpComputer(DumpState.DUMP_PREFERRED, fd, pw, dumpState);
}
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_PREFERRED_XML)
&& packageName == null) {
- snapshot.dump(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState);
+ mPm.dumpComputer(DumpState.DUMP_PREFERRED_XML, fd, pw, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_DOMAIN_PREFERRED)) {
- snapshot.dump(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState);
+ mPm.dumpComputer(DumpState.DUMP_DOMAIN_PREFERRED, fd, pw, dumpState);
}
if (!checkin && dumpState.isDumping(DumpState.DUMP_PERMISSIONS)) {
@@ -428,7 +429,7 @@ final class DumpHelper {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_QUERIES)) {
- snapshot.dump(DumpState.DUMP_QUERIES, fd, pw, dumpState);
+ mPm.dumpComputer(DumpState.DUMP_QUERIES, fd, pw, dumpState);
}
if (dumpState.isDumping(DumpState.DUMP_SHARED_USERS)) {
@@ -528,12 +529,12 @@ final class DumpHelper {
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_DEXOPT)) {
- snapshot.dump(DumpState.DUMP_DEXOPT, fd, pw, dumpState);
+ mPm.dumpComputer(DumpState.DUMP_DEXOPT, fd, pw, dumpState);
}
if (!checkin
&& dumpState.isDumping(DumpState.DUMP_COMPILER_STATS)) {
- snapshot.dump(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState);
+ mPm.dumpComputer(DumpState.DUMP_COMPILER_STATS, fd, pw, dumpState);
}
if (dumpState.isDumping(DumpState.DUMP_MESSAGES)
@@ -580,7 +581,7 @@ final class DumpHelper {
pw.println(" Known digesters list flag: "
+ PackageManagerService.getKnownDigestersList());
- PerUidReadTimeouts[] items = mPm.getPerUidReadTimeouts(snapshot);
+ PerUidReadTimeouts[] items = mPm.getPerUidReadTimeouts();
pw.println(" Timeouts (" + items.length + "):");
for (PerUidReadTimeouts item : items) {
pw.print(" (");
diff --git a/services/core/java/com/android/server/pm/IPackageManagerBase.java b/services/core/java/com/android/server/pm/IPackageManagerBase.java
deleted file mode 100644
index e1aee6d747f4..000000000000
--- a/services/core/java/com/android/server/pm/IPackageManagerBase.java
+++ /dev/null
@@ -1,1189 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.pm;
-
-
-import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SuppressLint;
-import android.annotation.UserIdInt;
-import android.app.role.RoleManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.IPackageDeleteObserver;
-import android.content.pm.IPackageDeleteObserver2;
-import android.content.pm.IPackageInstaller;
-import android.content.pm.IPackageManager;
-import android.content.pm.IPackageStatsObserver;
-import android.content.pm.InstallSourceInfo;
-import android.content.pm.InstrumentationInfo;
-import android.content.pm.IntentFilterVerificationInfo;
-import android.content.pm.KeySet;
-import android.content.pm.ModuleInfo;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ParceledListSlice;
-import android.content.pm.PermissionGroupInfo;
-import android.content.pm.PermissionInfo;
-import android.content.pm.ProviderInfo;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.content.pm.SharedLibraryInfo;
-import android.content.pm.VersionedPackage;
-import android.content.pm.dex.IArtManager;
-import android.os.Binder;
-import android.os.Process;
-import android.os.RemoteException;
-import android.os.Trace;
-import android.os.UserHandle;
-import android.permission.PermissionManager;
-
-import com.android.internal.R;
-import com.android.internal.content.InstallLocationUtils;
-import com.android.internal.util.CollectionUtils;
-import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.pm.verify.domain.DomainVerificationManagerInternal;
-import com.android.server.pm.verify.domain.proxy.DomainVerificationProxyV1;
-
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Contains all simply proxy methods which need a snapshot instance and just calls a method on it,
- * with no additional logic. Separated with all methods marked final and deprecated to prevent their
- * use from other methods which may need a snapshot for non-trivial reasons.
- */
-public abstract class IPackageManagerBase extends IPackageManager.Stub {
-
- @NonNull
- private final PackageManagerService mService;
-
- @NonNull
- private final Context mContext;
-
- @NonNull private final DexOptHelper mDexOptHelper;
- @NonNull private final ModuleInfoProvider mModuleInfoProvider;
- @NonNull private final PreferredActivityHelper mPreferredActivityHelper;
- @NonNull private final ResolveIntentHelper mResolveIntentHelper;
-
- @NonNull
- private final DomainVerificationManagerInternal mDomainVerificationManager;
-
- @NonNull
- private final DomainVerificationConnection mDomainVerificationConnection;
-
- @NonNull
- private final PackageInstallerService mInstallerService;
-
- @NonNull
- private final PackageProperty mPackageProperty;
-
- @NonNull
- private final ComponentName mResolveComponentName;
-
- @Nullable
- private final ComponentName mInstantAppResolverSettingsComponent;
-
- @NonNull
- private final String mRequiredSupplementalProcessPackage;
-
- @Nullable
- private final String mServicesExtensionPackageName;
-
- @Nullable
- private final String mSharedSystemSharedLibraryPackageName;
-
- public IPackageManagerBase(@NonNull PackageManagerService service, @NonNull Context context,
- @NonNull DexOptHelper dexOptHelper, @NonNull ModuleInfoProvider moduleInfoProvider,
- @NonNull PreferredActivityHelper preferredActivityHelper,
- @NonNull ResolveIntentHelper resolveIntentHelper,
- @NonNull DomainVerificationManagerInternal domainVerificationManager,
- @NonNull DomainVerificationConnection domainVerificationConnection,
- @NonNull PackageInstallerService installerService,
- @NonNull PackageProperty packageProperty, @NonNull ComponentName resolveComponentName,
- @Nullable ComponentName instantAppResolverSettingsComponent,
- @NonNull String requiredSupplementalProcessPackage,
- @Nullable String servicesExtensionPackageName,
- @Nullable String sharedSystemSharedLibraryPackageName) {
- mService = service;
- mContext = context;
- mDexOptHelper = dexOptHelper;
- mModuleInfoProvider = moduleInfoProvider;
- mPreferredActivityHelper = preferredActivityHelper;
- mResolveIntentHelper = resolveIntentHelper;
- mDomainVerificationManager = domainVerificationManager;
- mDomainVerificationConnection = domainVerificationConnection;
- mInstallerService = installerService;
- mPackageProperty = packageProperty;
- mResolveComponentName = resolveComponentName;
- mInstantAppResolverSettingsComponent = instantAppResolverSettingsComponent;
- mRequiredSupplementalProcessPackage = requiredSupplementalProcessPackage;
- mServicesExtensionPackageName = servicesExtensionPackageName;
- mSharedSystemSharedLibraryPackageName = sharedSystemSharedLibraryPackageName;
- }
-
- protected Computer snapshot() {
- return mService.snapshotComputer();
- }
-
- @Override
- @Deprecated
- public final boolean activitySupportsIntent(ComponentName component, Intent intent,
- String resolvedType) {
- return snapshot().activitySupportsIntent(mResolveComponentName, component, intent,
- resolvedType);
- }
-
- @Override
- @Deprecated
- public final void addCrossProfileIntentFilter(IntentFilter intentFilter, String ownerPackage,
- int sourceUserId, int targetUserId, int flags) {
- mService.addCrossProfileIntentFilter(snapshot(),
- new WatchedIntentFilter(intentFilter), ownerPackage, sourceUserId, targetUserId,
- flags);
- }
-
- // NOTE: Can't remove due to unsupported app usage
- @Override
- @Deprecated
- public final boolean addPermission(PermissionInfo info) {
- // Because this is accessed via the package manager service AIDL,
- // go through the permission manager service AIDL
- return mContext.getSystemService(PermissionManager.class).addPermission(info, false);
- }
-
- // NOTE: Can't remove due to unsupported app usage
- @Override
- @Deprecated
- public final boolean addPermissionAsync(PermissionInfo info) {
- // Because this is accessed via the package manager service AIDL,
- // go through the permission manager service AIDL
- return mContext.getSystemService(PermissionManager.class).addPermission(info, true);
- }
-
- @Override
- @Deprecated
- public final void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity,
- int userId) {
- mPreferredActivityHelper.addPersistentPreferredActivity(new WatchedIntentFilter(filter),
- activity, userId);
- }
-
- @Override
- @Deprecated
- public final void addPreferredActivity(IntentFilter filter, int match,
- ComponentName[] set, ComponentName activity, int userId, boolean removeExisting) {
- mPreferredActivityHelper.addPreferredActivity(snapshot(),
- new WatchedIntentFilter(filter), match, set, activity, true, userId,
- "Adding preferred", removeExisting);
- }
-
- /*
- * Returns if intent can be forwarded from the sourceUserId to the targetUserId
- */
- @Override
- @Deprecated
- public final boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
- @UserIdInt int sourceUserId, @UserIdInt int targetUserId) {
- return snapshot().canForwardTo(intent, resolvedType, sourceUserId, targetUserId);
- }
-
- @Override
- @Deprecated
- public final boolean canRequestPackageInstalls(String packageName, int userId) {
- return snapshot().canRequestPackageInstalls(packageName, Binder.getCallingUid(), userId,
- true /* throwIfPermNotDeclared*/);
- }
-
- @Override
- @Deprecated
- public final String[] canonicalToCurrentPackageNames(String[] names) {
- return snapshot().canonicalToCurrentPackageNames(names);
- }
-
- // NOTE: Can't remove due to unsupported app usage
- @Override
- @Deprecated
- public final int checkPermission(String permName, String pkgName, int userId) {
- return mService.checkPermission(permName, pkgName, userId);
- }
-
- @Override
- @Deprecated
- public final int checkSignatures(@NonNull String pkg1, @NonNull String pkg2) {
- return snapshot().checkSignatures(pkg1, pkg2);
- }
-
- @Override
- @Deprecated
- public final int checkUidPermission(String permName, int uid) {
- return snapshot().checkUidPermission(permName, uid);
- }
-
- @Override
- @Deprecated
- public final int checkUidSignatures(int uid1, int uid2) {
- return snapshot().checkUidSignatures(uid1, uid2);
- }
-
- @Override
- @Deprecated
- public final void clearPackagePersistentPreferredActivities(String packageName, int userId) {
- mPreferredActivityHelper.clearPackagePersistentPreferredActivities(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final void clearPackagePreferredActivities(String packageName) {
- mPreferredActivityHelper.clearPackagePreferredActivities(snapshot(),
- packageName);
- }
-
- @Override
- @Deprecated
- public final String[] currentToCanonicalPackageNames(String[] names) {
- return snapshot().currentToCanonicalPackageNames(names);
- }
-
- @Override
- @Deprecated
- public final void deleteExistingPackageAsUser(VersionedPackage versionedPackage,
- final IPackageDeleteObserver2 observer, final int userId) {
- mService.deleteExistingPackageAsUser(versionedPackage, observer, userId);
- }
-
- @Override
- @Deprecated
- public final void deletePackageAsUser(String packageName, int versionCode,
- IPackageDeleteObserver observer, int userId, int flags) {
- deletePackageVersioned(new VersionedPackage(packageName, versionCode),
- new PackageManager.LegacyPackageDeleteObserver(observer).getBinder(), userId,
- flags);
- }
-
- @Override
- @Deprecated
- public final void deletePackageVersioned(VersionedPackage versionedPackage,
- final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
- mService.deletePackageVersioned(versionedPackage, observer, userId, deleteFlags);
- }
-
- @Override
- @Deprecated
- public final ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) {
- return mPreferredActivityHelper.findPersistentPreferredActivity(snapshot(), intent, userId);
- }
-
- @Override
- @Deprecated
- public final void forceDexOpt(String packageName) {
- mDexOptHelper.forceDexOpt(snapshot(), packageName);
- }
-
- @Override
- @Deprecated
- public final ActivityInfo getActivityInfo(ComponentName component,
- @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
- return snapshot().getActivityInfo(component, flags, userId);
- }
-
- @NonNull
- @Override
- @Deprecated
- public final ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
- return snapshot().getAllIntentFilters(packageName);
- }
-
- @Override
- @Deprecated
- public final List<String> getAllPackages() {
- return snapshot().getAllPackages();
- }
-
- // NOTE: Can't remove due to unsupported app usage
- @NonNull
- @Override
- @Deprecated
- public final String[] getAppOpPermissionPackages(@NonNull String permissionName) {
- return snapshot().getAppOpPermissionPackages(permissionName);
- }
-
- @Override
- @Deprecated
- public final String getAppPredictionServicePackageName() {
- return mService.mAppPredictionServicePackage;
- }
-
- @PackageManager.EnabledState
- @Override
- @Deprecated
- public final int getApplicationEnabledSetting(@NonNull String packageName,
- @UserIdInt int userId) {
- return snapshot().getApplicationEnabledSetting(packageName, userId);
- }
-
- /**
- * Returns true if application is not found or there was an error. Otherwise it returns the
- * hidden state of the package for the given user.
- */
- @Override
- @Deprecated
- public final boolean getApplicationHiddenSettingAsUser(@NonNull String packageName,
- @UserIdInt int userId) {
- return snapshot().getApplicationHiddenSettingAsUser(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final ApplicationInfo getApplicationInfo(String packageName,
- @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
- return snapshot().getApplicationInfo(packageName, flags, userId);
- }
-
- @Override
- @Deprecated
- public final IArtManager getArtManager() {
- return mService.mArtManagerService;
- }
-
- @Override
- @Deprecated
- public final @Nullable
- String getAttentionServicePackageName() {
- return mService.ensureSystemPackageName(snapshot(),
- mService.getPackageFromComponentString(R.string.config_defaultAttentionService));
- }
-
- @Override
- @Deprecated
- public final boolean getBlockUninstallForUser(@NonNull String packageName,
- @UserIdInt int userId) {
- return snapshot().getBlockUninstallForUser(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final int getComponentEnabledSetting(@NonNull ComponentName component, int userId) {
- return snapshot().getComponentEnabledSetting(component, Binder.getCallingUid(), userId);
- }
-
- @Override
- @Deprecated
- public final String getContentCaptureServicePackageName() {
- return mService.ensureSystemPackageName(snapshot(),
- mService.getPackageFromComponentString(
- R.string.config_defaultContentCaptureService));
- }
-
- @Nullable
- @Override
- @Deprecated
- public final ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
- @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
- @NonNull int userId) {
- return snapshot().getDeclaredSharedLibraries(packageName, flags, userId);
- }
-
- /**
- * Non-Binder method, support for the backup/restore mechanism: write the default browser (etc)
- * settings in its canonical XML format. Returns the default browser XML representation as a
- * byte array, or null if there is none.
- */
- @Override
- @Deprecated
- public final byte[] getDefaultAppsBackup(int userId) {
- return mPreferredActivityHelper.getDefaultAppsBackup(userId);
- }
-
- @Override
- @Deprecated
- public final String getDefaultTextClassifierPackageName() {
- return mService.mDefaultTextClassifierPackage;
- }
-
- @Override
- @Deprecated
- public final int getFlagsForUid(int uid) {
- return snapshot().getFlagsForUid(uid);
- }
-
- @Nullable
- @Override
- @Deprecated
- public final CharSequence getHarmfulAppWarning(@NonNull String packageName,
- @UserIdInt int userId) {
- return snapshot().getHarmfulAppWarning(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) {
- final Computer snapshot = snapshot();
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
- return null;
- }
- return snapshot.getHomeActivitiesAsUser(allHomeCandidates,
- UserHandle.getCallingUserId());
- }
-
- @Deprecated
- public final String getIncidentReportApproverPackageName() {
- return mService.mIncidentReportApproverPackage;
- }
-
- @Override
- @Deprecated
- public final int getInstallLocation() {
- // allow instant app access
- return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
- android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION,
- InstallLocationUtils.APP_INSTALL_AUTO);
- }
-
- @PackageManager.InstallReason
- @Override
- @Deprecated
- public final int getInstallReason(@NonNull String packageName, @UserIdInt int userId) {
- return snapshot().getInstallReason(packageName, userId);
- }
-
- @Override
- @Nullable
- @Deprecated
- public final InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) {
- return snapshot().getInstallSourceInfo(packageName);
- }
-
- @Override
- @Deprecated
- public final ParceledListSlice<ApplicationInfo> getInstalledApplications(
- @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
- final int callingUid = Binder.getCallingUid();
- return new ParceledListSlice<>(
- snapshot().getInstalledApplications(flags, userId, callingUid));
- }
-
- @Override
- @Deprecated
- public final List<ModuleInfo> getInstalledModules(int flags) {
- return mModuleInfoProvider.getInstalledModules(flags);
- }
-
- @Override
- @Deprecated
- public final ParceledListSlice<PackageInfo> getInstalledPackages(
- @PackageManager.PackageInfoFlagsBits long flags, int userId) {
- return snapshot().getInstalledPackages(flags, userId);
- }
-
- @Nullable
- @Override
- @Deprecated
- public final String getInstallerPackageName(@NonNull String packageName) {
- return snapshot().getInstallerPackageName(packageName);
- }
-
- @Override
- @Deprecated
- public final ComponentName getInstantAppInstallerComponent() {
- final Computer snapshot = snapshot();
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
- return null;
- }
- return snapshot.getInstantAppInstallerComponent();
- }
-
- @Override
- @Deprecated
- public final @Nullable
- ComponentName getInstantAppResolverComponent() {
- final Computer snapshot = snapshot();
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
- return null;
- }
- return mService.getInstantAppResolver(snapshot);
- }
-
- @Override
- @Deprecated
- public final ComponentName getInstantAppResolverSettingsComponent() {
- return mInstantAppResolverSettingsComponent;
- }
-
- @Nullable
- @Override
- @Deprecated
- public final InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component,
- int flags) {
- return snapshot().getInstrumentationInfo(component, flags);
- }
-
- @Override
- @Deprecated
- public final @NonNull
- ParceledListSlice<IntentFilterVerificationInfo>
- getIntentFilterVerifications(String packageName) {
- return ParceledListSlice.emptyList();
- }
-
- @Override
- @Deprecated
- public final int getIntentVerificationStatus(String packageName, int userId) {
- return mDomainVerificationManager.getLegacyState(packageName, userId);
- }
-
- @Nullable
- @Override
- @Deprecated
- public final KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {
- return snapshot().getKeySetByAlias(packageName, alias);
- }
-
- @Override
- @Deprecated
- public final ModuleInfo getModuleInfo(String packageName,
- @PackageManager.ModuleInfoFlags int flags) {
- return mModuleInfoProvider.getModuleInfo(packageName, flags);
- }
-
- @Nullable
- @Override
- @Deprecated
- public final String getNameForUid(int uid) {
- return snapshot().getNameForUid(uid);
- }
-
- @Nullable
- @Override
- @Deprecated
- public final String[] getNamesForUids(@NonNull int[] uids) {
- return snapshot().getNamesForUids(uids);
- }
-
- @Override
- @Deprecated
- public final int[] getPackageGids(String packageName,
- @PackageManager.PackageInfoFlagsBits long flags, int userId) {
- return snapshot().getPackageGids(packageName, flags, userId);
- }
-
- @Override
- @Deprecated
- public final PackageInfo getPackageInfo(String packageName,
- @PackageManager.PackageInfoFlagsBits long flags, int userId) {
- return snapshot().getPackageInfo(packageName, flags, userId);
- }
-
- @Override
- @Deprecated
- public final PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage,
- @PackageManager.PackageInfoFlagsBits long flags, int userId) {
- return snapshot().getPackageInfoInternal(versionedPackage.getPackageName(),
- versionedPackage.getLongVersionCode(), flags, Binder.getCallingUid(), userId);
- }
-
- @Override
- @Deprecated
- public final IPackageInstaller getPackageInstaller() {
- // Return installer service for internal calls.
- if (PackageManagerServiceUtils.isSystemOrRoot()) {
- return mInstallerService;
- }
- final Computer snapshot = snapshot();
- // Return null for InstantApps.
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
- return null;
- }
- return mInstallerService;
- }
-
- @Override
- @Deprecated
- public final void getPackageSizeInfo(final String packageName, int userId,
- final IPackageStatsObserver observer) {
- throw new UnsupportedOperationException(
- "Shame on you for calling the hidden API getPackageSizeInfo(). Shame!");
- }
-
- @Override
- @Deprecated
- public final int getPackageUid(@NonNull String packageName,
- @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
- return snapshot().getPackageUid(packageName, flags, userId);
- }
-
- /**
- * <em>IMPORTANT:</em> Not all packages returned by this method may be known
- * to the system. There are two conditions in which this may occur:
- * <ol>
- * <li>The package is on adoptable storage and the device has been removed</li>
- * <li>The package is being removed and the internal structures are partially updated</li>
- * </ol>
- * The second is an artifact of the current data structures and should be fixed. See
- * b/111075456 for one such instance.
- * This binder API is cached. If the algorithm in this method changes,
- * or if the underlying objecs (as returned by getSettingLPr()) change
- * then the logic that invalidates the cache must be revisited. See
- * calls to invalidateGetPackagesForUidCache() to locate the points at
- * which the cache is invalidated.
- */
- @Override
- @Deprecated
- public final String[] getPackagesForUid(int uid) {
- final int callingUid = Binder.getCallingUid();
- final int userId = UserHandle.getUserId(uid);
- snapshot().enforceCrossUserOrProfilePermission(callingUid, userId,
- /* requireFullPermission */ false,
- /* checkShell */ false, "getPackagesForUid");
- return snapshot().getPackagesForUid(uid);
- }
-
- @Override
- @Deprecated
- public final ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
- @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags,
- @UserIdInt int userId) {
- return snapshot().getPackagesHoldingPermissions(permissions, flags, userId);
- }
-
- // NOTE: Can't remove due to unsupported app usage
- @Override
- @Deprecated
- public final PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) {
- return mService.getPermissionGroupInfo(groupName, flags);
- }
-
- @Override
- @Deprecated
- public final @NonNull
- ParceledListSlice<ApplicationInfo> getPersistentApplications(int flags) {
- final Computer snapshot = snapshot();
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
- return ParceledListSlice.emptyList();
- }
- return new ParceledListSlice<>(snapshot.getPersistentApplications(isSafeMode(), flags));
- }
-
- @Override
- @Deprecated
- public final int getPreferredActivities(List<IntentFilter> outFilters,
- List<ComponentName> outActivities, String packageName) {
- return mPreferredActivityHelper.getPreferredActivities(snapshot(), outFilters,
- outActivities, packageName);
- }
-
- /**
- * Non-Binder method, support for the backup/restore mechanism: write the full set of preferred
- * activities in its canonical XML format. Returns the XML output as a byte array, or null if
- * there is none.
- */
- @Override
- @Deprecated
- public final byte[] getPreferredActivityBackup(int userId) {
- return mPreferredActivityHelper.getPreferredActivityBackup(userId);
- }
-
- @Override
- @Deprecated
- public final int getPrivateFlagsForUid(int uid) {
- return snapshot().getPrivateFlagsForUid(uid);
- }
-
- @Override
- @Deprecated
- public final PackageManager.Property getProperty(String propertyName, String packageName,
- String className) {
- Objects.requireNonNull(propertyName);
- Objects.requireNonNull(packageName);
- PackageStateInternal packageState = snapshot().getPackageStateFiltered(packageName,
- Binder.getCallingUid(), UserHandle.getCallingUserId());
- if (packageState == null) {
- return null;
- }
- return mPackageProperty.getProperty(propertyName, packageName, className);
- }
-
- @Nullable
- @Override
- @Deprecated
- public final ProviderInfo getProviderInfo(@NonNull ComponentName component,
- @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
- return snapshot().getProviderInfo(component, flags, userId);
- }
-
- @Override
- @Deprecated
- public final ActivityInfo getReceiverInfo(ComponentName component,
- @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
- return snapshot().getReceiverInfo(component, flags, userId);
- }
-
- @Override
- @Deprecated
- public final @Nullable
- String getRotationResolverPackageName() {
- return mService.ensureSystemPackageName(snapshot(),
- mService.getPackageFromComponentString(
- R.string.config_defaultRotationResolverService));
- }
-
- @Nullable
- @Override
- @Deprecated
- public final ServiceInfo getServiceInfo(@NonNull ComponentName component,
- @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
- return snapshot().getServiceInfo(component, flags, userId);
- }
-
- @Override
- @Deprecated
- public final @NonNull
- String getServicesSystemSharedLibraryPackageName() {
- return mServicesExtensionPackageName;
- }
-
- @Override
- @Deprecated
- public final String getSetupWizardPackageName() {
- if (Binder.getCallingUid() != Process.SYSTEM_UID) {
- throw new SecurityException("Non-system caller");
- }
- return mService.mSetupWizardPackage;
- }
-
- @Override
- @Deprecated
- public final ParceledListSlice<SharedLibraryInfo> getSharedLibraries(String packageName,
- @PackageManager.PackageInfoFlagsBits long flags, int userId) {
- return snapshot().getSharedLibraries(packageName, flags, userId);
- }
-
- @Override
- @Deprecated
- public final @NonNull
- String getSharedSystemSharedLibraryPackageName() {
- return mSharedSystemSharedLibraryPackageName;
- }
-
- @Nullable
- @Override
- @Deprecated
- public final KeySet getSigningKeySet(@NonNull String packageName) {
- return snapshot().getSigningKeySet(packageName);
- }
-
- @Override
- @Deprecated
- public final String getSdkSandboxPackageName() {
- return mService.getSdkSandboxPackageName();
- }
-
- @Override
- @Deprecated
- public final String getSystemCaptionsServicePackageName() {
- return mService.ensureSystemPackageName(snapshot(),
- mService.getPackageFromComponentString(
- R.string.config_defaultSystemCaptionsService));
- }
-
- @Nullable
- @Override
- @Deprecated
- public final String[] getSystemSharedLibraryNames() {
- return snapshot().getSystemSharedLibraryNames();
- }
-
- @Override
- @Deprecated
- public final String getSystemTextClassifierPackageName() {
- return mService.mSystemTextClassifierPackageName;
- }
-
- @Override
- @Deprecated
- public final int getTargetSdkVersion(@NonNull String packageName) {
- return snapshot().getTargetSdkVersion(packageName);
- }
-
- @Override
- @Deprecated
- public final int getUidForSharedUser(@NonNull String sharedUserName) {
- return snapshot().getUidForSharedUser(sharedUserName);
- }
-
- @SuppressLint("MissingPermission")
- @Override
- @Deprecated
- public final String getWellbeingPackageName() {
- final long identity = Binder.clearCallingIdentity();
- try {
- return CollectionUtils.firstOrNull(
- mContext.getSystemService(RoleManager.class).getRoleHolders(
- RoleManager.ROLE_SYSTEM_WELLBEING));
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
- }
-
- // NOTE: Can't remove due to unsupported app usage
- @SuppressLint("MissingPermission")
- @Override
- @Deprecated
- public final void grantRuntimePermission(String packageName, String permName,
- final int userId) {
- // Because this is accessed via the package manager service AIDL,
- // go through the permission manager service AIDL
- mContext.getSystemService(PermissionManager.class)
- .grantRuntimePermission(packageName, permName, UserHandle.of(userId));
- }
-
- @Override
- @Deprecated
- public final boolean hasSigningCertificate(@NonNull String packageName,
- @NonNull byte[] certificate,
- @PackageManager.CertificateInputType int type) {
- return snapshot().hasSigningCertificate(packageName, certificate, type);
- }
-
- @Override
- @Deprecated
- public final boolean hasSystemFeature(String name, int version) {
- return mService.hasSystemFeature(name, version);
- }
-
- @Override
- @Deprecated
- public final boolean hasSystemUidErrors() {
- // allow instant applications
- return false;
- }
-
- @Override
- @Deprecated
- public final boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate,
- @PackageManager.CertificateInputType int type) {
- return snapshot().hasUidSigningCertificate(uid, certificate, type);
- }
-
- @Override
- @Deprecated
- public final boolean isDeviceUpgrading() {
- return mService.isDeviceUpgrading();
- }
-
- @Override
- @Deprecated
- public final boolean isFirstBoot() {
- return mService.isFirstBoot();
- }
-
- @Override
- @Deprecated
- public final boolean isInstantApp(String packageName, int userId) {
- return snapshot().isInstantApp(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final boolean isOnlyCoreApps() {
- return mService.isOnlyCoreApps();
- }
-
- @Override
- @Deprecated
- public final boolean isPackageAvailable(String packageName, int userId) {
- return snapshot().isPackageAvailable(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final boolean isPackageDeviceAdminOnAnyUser(String packageName) {
- return mService.isPackageDeviceAdminOnAnyUser(snapshot(),
- packageName);
- }
-
- @Override
- @Deprecated
- public final boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) {
- return snapshot().isPackageSignedByKeySet(packageName, ks);
- }
-
- @Override
- @Deprecated
- public final boolean isPackageSignedByKeySetExactly(@NonNull String packageName,
- @NonNull KeySet ks) {
- return snapshot().isPackageSignedByKeySetExactly(packageName, ks);
- }
-
- @Override
- @Deprecated
- public final boolean isPackageSuspendedForUser(@NonNull String packageName,
- @UserIdInt int userId) {
- return snapshot().isPackageSuspendedForUser(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final boolean isSafeMode() {
- // allow instant applications
- return mService.getSafeMode();
- }
-
- @Override
- @Deprecated
- public final boolean isStorageLow() {
- return mService.isStorageLow();
- }
-
- @Override
- @Deprecated
- public final boolean isUidPrivileged(int uid) {
- return snapshot().isUidPrivileged(uid);
- }
-
- /**
- * Ask the package manager to perform a dex-opt with the given compiler filter.
- * <p>
- * Note: exposed only for the shell command to allow moving packages explicitly to a definite
- * state.
- */
- @Override
- @Deprecated
- public final boolean performDexOptMode(String packageName,
- boolean checkProfiles, String targetCompilerFilter, boolean force,
- boolean bootComplete, String splitName) {
- return mDexOptHelper.performDexOptMode(packageName, checkProfiles, targetCompilerFilter,
- force, bootComplete, splitName);
- }
-
- /**
- * Ask the package manager to perform a dex-opt with the given compiler filter on the secondary
- * dex files belonging to the given package.
- * <p>
- * Note: exposed only for the shell command to allow moving packages explicitly to a definite
- * state.
- */
- @Override
- @Deprecated
- public final boolean performDexOptSecondary(String packageName, String compilerFilter,
- boolean force) {
- return mDexOptHelper.performDexOptSecondary(packageName, compilerFilter, force);
- }
-
- @Override
- @Deprecated
- public final @NonNull
- ParceledListSlice<ResolveInfo> queryIntentActivities(Intent intent,
- String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
- try {
- Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities");
-
- return new ParceledListSlice<>(snapshot().queryIntentActivitiesInternal(intent,
- resolvedType, flags, userId));
- } finally {
- Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
- }
- }
-
- @NonNull
- @Override
- @Deprecated
- public final ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName,
- int uid, @PackageManager.ComponentInfoFlagsBits long flags,
- @Nullable String metaDataKey) {
- return snapshot().queryContentProviders(processName, uid, flags, metaDataKey);
- }
-
- @NonNull
- @Override
- @Deprecated
- public final ParceledListSlice<InstrumentationInfo> queryInstrumentation(
- @NonNull String targetPackage, int flags) {
- return snapshot().queryInstrumentation(targetPackage, flags);
- }
-
- @Override
- @Deprecated
- public final @NonNull
- ParceledListSlice<ResolveInfo> queryIntentActivityOptions(
- ComponentName caller, Intent[] specifics, String[] specificTypes, Intent intent,
- String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
- return new ParceledListSlice<>(mResolveIntentHelper.queryIntentActivityOptionsInternal(
- snapshot(), caller, specifics, specificTypes, intent, resolvedType, flags,
- userId));
- }
-
- @Override
- @Deprecated
- public final @NonNull
- ParceledListSlice<ResolveInfo> queryIntentContentProviders(Intent intent,
- String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
- return new ParceledListSlice<>(mResolveIntentHelper.queryIntentContentProvidersInternal(
- snapshot(), intent, resolvedType, flags, userId));
- }
-
- @Override
- @Deprecated
- public final @NonNull
- ParceledListSlice<ResolveInfo> queryIntentReceivers(Intent intent,
- String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
- return new ParceledListSlice<>(mResolveIntentHelper.queryIntentReceiversInternal(
- snapshot(), intent, resolvedType, flags, userId, Binder.getCallingUid()));
- }
-
- @Override
- @Deprecated
- public final @NonNull
- ParceledListSlice<ResolveInfo> queryIntentServices(Intent intent,
- String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
- final int callingUid = Binder.getCallingUid();
- return new ParceledListSlice<>(snapshot().queryIntentServicesInternal(
- intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/));
- }
-
- @Override
- @Deprecated
- public final void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) {
- snapshot().querySyncProviders(isSafeMode(), outNames, outInfo);
- }
-
- @Override
- @Deprecated
- public final void removePermission(String permName) {
- // Because this is accessed via the package manager service AIDL,
- // go through the permission manager service AIDL
- mContext.getSystemService(PermissionManager.class).removePermission(permName);
- }
-
- @Override
- @Deprecated
- public final void replacePreferredActivity(IntentFilter filter, int match,
- ComponentName[] set, ComponentName activity, int userId) {
- mPreferredActivityHelper.replacePreferredActivity(snapshot(),
- new WatchedIntentFilter(filter), match, set, activity, userId);
- }
-
- @Override
- @Deprecated
- public final ProviderInfo resolveContentProvider(String name,
- @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
- return snapshot().resolveContentProvider(name, flags, userId, Binder.getCallingUid());
- }
-
- @Override
- @Deprecated
- public final void resetApplicationPreferences(int userId) {
- mPreferredActivityHelper.resetApplicationPreferences(userId);
- }
-
- @Override
- @Deprecated
- public final ResolveInfo resolveIntent(Intent intent, String resolvedType,
- @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
- return mResolveIntentHelper.resolveIntentInternal(snapshot(), intent,
- resolvedType, flags, 0 /*privateResolveFlags*/, userId, false,
- Binder.getCallingUid());
- }
-
- @Override
- @Deprecated
- public final ResolveInfo resolveService(Intent intent, String resolvedType,
- @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
- final int callingUid = Binder.getCallingUid();
- return mResolveIntentHelper.resolveServiceInternal(snapshot(), intent,
- resolvedType, flags, userId, callingUid);
- }
-
- @Override
- @Deprecated
- public final void restoreDefaultApps(byte[] backup, int userId) {
- mPreferredActivityHelper.restoreDefaultApps(backup, userId);
- }
-
- @Override
- @Deprecated
- public final void restorePreferredActivities(byte[] backup, int userId) {
- mPreferredActivityHelper.restorePreferredActivities(backup, userId);
- }
-
- @Override
- @Deprecated
- public final void setHomeActivity(ComponentName comp, int userId) {
- mPreferredActivityHelper.setHomeActivity(snapshot(), comp, userId);
- }
-
- @Override
- @Deprecated
- public final void setLastChosenActivity(Intent intent, String resolvedType, int flags,
- IntentFilter filter, int match, ComponentName activity) {
- mPreferredActivityHelper.setLastChosenActivity(snapshot(), intent, resolvedType,
- flags, new WatchedIntentFilter(filter), match, activity);
- }
-
- @Override
- @Deprecated
- public final boolean updateIntentVerificationStatus(String packageName, int status,
- int userId) {
- return mDomainVerificationManager.setLegacyUserState(packageName, userId, status);
- }
-
- @Override
- @Deprecated
- public final void verifyIntentFilter(int id, int verificationCode, List<String> failedDomains) {
- DomainVerificationProxyV1.queueLegacyVerifyResult(mContext, mDomainVerificationConnection,
- id, verificationCode, failedDomains, Binder.getCallingUid());
- }
-
- @Override
- @Deprecated
- public final boolean canPackageQuery(@NonNull String sourcePackageName,
- @NonNull String targetPackageName, @UserIdInt int userId) {
- return snapshot().canPackageQuery(sourcePackageName, targetPackageName, userId);
- }
-
- @Override
- @Deprecated
- public final void deletePreloadsFileCache() throws RemoteException {
- mService.deletePreloadsFileCache();
- }
-
- @Override
- @Deprecated
- public final void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden)
- throws RemoteException {
- mService.setSystemAppHiddenUntilInstalled(snapshot(), packageName, hidden);
- }
-
- @Override
- @Deprecated
- public final boolean setSystemAppInstallState(String packageName,
- boolean installed, int userId) throws RemoteException {
- return mService.setSystemAppInstallState(snapshot(), packageName, installed, userId);
- }
-
- @Override
- @Deprecated
- public final void finishPackageInstall(int token, boolean didLaunch) throws RemoteException {
- mService.finishPackageInstall(token, didLaunch);
- }
-}
diff --git a/services/core/java/com/android/server/pm/IncrementalProgressListener.java b/services/core/java/com/android/server/pm/IncrementalProgressListener.java
index 703bbda92182..fa11924218d4 100644
--- a/services/core/java/com/android/server/pm/IncrementalProgressListener.java
+++ b/services/core/java/com/android/server/pm/IncrementalProgressListener.java
@@ -33,8 +33,7 @@ final class IncrementalProgressListener extends IPackageLoadingProgressCallback.
@Override
public void onPackageLoadingProgressChanged(float progress) {
- PackageStateInternal packageState = mPm.snapshotComputer()
- .getPackageStateInternal(mPackageName);
+ PackageStateInternal packageState = mPm.getPackageStateInternal(mPackageName);
if (packageState == null) {
return;
}
diff --git a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java
index 91750dee7688..8d7762410b27 100644
--- a/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InitAndSystemPackageHelper.java
@@ -171,7 +171,7 @@ final class InitAndSystemPackageHelper {
}
}
OverlayConfig overlayConfig = OverlayConfig.initializeSystemInstance(
- consumer -> mPm.forEachPackage(mPm.snapshotComputer(),
+ consumer -> mPm.forEachPackage(
pkg -> consumer.accept(pkg, pkg.isSystem(),
apkInApexPreInstalledPaths.get(pkg.getPackageName()))));
// Prune any system packages that no longer exist.
diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java
index b39b24f6defa..8667ffd7930c 100644
--- a/services/core/java/com/android/server/pm/InstallPackageHelper.java
+++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java
@@ -527,10 +527,8 @@ final class InstallPackageHelper {
+ android.Manifest.permission.INSTALL_PACKAGES + ".");
}
PackageSetting pkgSetting;
- final Computer preLockSnapshot = mPm.snapshotComputer();
- preLockSnapshot.enforceCrossUserPermission(callingUid, userId,
- true /* requireFullPermission */, true /* checkShell */,
- "installExistingPackage for user " + userId);
+ mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
+ true /* checkShell */, "installExistingPackage for user " + userId);
if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) {
return PackageManager.INSTALL_FAILED_USER_RESTRICTED;
}
@@ -545,12 +543,11 @@ final class InstallPackageHelper {
// writer
synchronized (mPm.mLock) {
- final Computer snapshot = mPm.snapshotComputer();
pkgSetting = mPm.mSettings.getPackageLPr(packageName);
if (pkgSetting == null) {
return PackageManager.INSTALL_FAILED_INVALID_URI;
}
- if (!snapshot.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) {
+ if (!mPm.canViewInstantApps(callingUid, UserHandle.getUserId(callingUid))) {
// only allow the existing package to be used if it's installed as a full
// application for at least one user
boolean installAllowed = false;
@@ -600,8 +597,7 @@ final class InstallPackageHelper {
mAppDataHelper.prepareAppDataAfterInstallLIF(pkgSetting.getPkg());
}
}
- mPm.sendPackageAddedForUser(mPm.snapshotComputer(), packageName, pkgSetting, userId,
- DataLoaderType.NONE);
+ mPm.sendPackageAddedForUser(packageName, pkgSetting, userId, DataLoaderType.NONE);
synchronized (mPm.mLock) {
mPm.updateSequenceNumberLP(pkgSetting, new int[]{ userId });
}
@@ -1906,8 +1902,8 @@ final class InstallPackageHelper {
AndroidPackage oldPackage = mPm.mPackages.get(packageName);
// Set the update and install times
- PackageStateInternal deletedPkgSetting = mPm.snapshotComputer()
- .getPackageStateInternal(oldPackage.getPackageName());
+ PackageStateInternal deletedPkgSetting = mPm.getPackageStateInternal(
+ oldPackage.getPackageName());
reconciledPkg.mPkgSetting
.setFirstInstallTimeFromReplaced(deletedPkgSetting, request.mAllUsers)
.setLastUpdateTime(System.currentTimeMillis());
@@ -2575,10 +2571,9 @@ final class InstallPackageHelper {
size = i;
mPm.mPendingBroadcasts.clear();
}
- final Computer snapshot = mPm.snapshotComputer();
// Send broadcasts
for (int i = 0; i < size; i++) {
- mPm.sendPackageChangedBroadcast(snapshot, packages[i], true /* dontKillApp */,
+ mPm.sendPackageChangedBroadcast(packages[i], true /* dontKillApp */,
components[i], uids[i], null /* reason */);
}
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
@@ -2597,7 +2592,7 @@ final class InstallPackageHelper {
final boolean update = res.mRemovedInfo != null && res.mRemovedInfo.mRemovedPackage != null;
final String packageName = res.mName;
final PackageStateInternal pkgSetting =
- succeeded ? mPm.snapshotComputer().getPackageStateInternal(packageName) : null;
+ succeeded ? mPm.getPackageStateInternal(packageName) : null;
final boolean removedBeforeUpdate = (pkgSetting == null)
|| (pkgSetting.isSystem() && !pkgSetting.getPath().getPath().equals(
res.mPkg.getPath()));
@@ -2695,9 +2690,9 @@ final class InstallPackageHelper {
// sendPackageAddedForNewUsers also deals with system apps
int appId = UserHandle.getAppId(res.mUid);
boolean isSystem = res.mPkg.isSystem();
- mPm.sendPackageAddedForNewUsers(mPm.snapshotComputer(), packageName,
- isSystem || virtualPreload, virtualPreload /*startReceiver*/, appId,
- firstUserIds, firstInstantUserIds, dataLoaderType);
+ mPm.sendPackageAddedForNewUsers(packageName, isSystem || virtualPreload,
+ virtualPreload /*startReceiver*/, appId, firstUserIds, firstInstantUserIds,
+ dataLoaderType);
// Send added for users that don't see the package for the first time
Bundle extras = new Bundle();
@@ -2710,8 +2705,7 @@ final class InstallPackageHelper {
final SparseArray<int[]> newBroadcastAllowList;
synchronized (mPm.mLock) {
newBroadcastAllowList = mPm.mAppsFilter.getVisibilityAllowList(
- mPm.snapshotComputer()
- .getPackageStateInternal(packageName, Process.SYSTEM_UID),
+ mPm.getPackageStateInternal(packageName, Process.SYSTEM_UID),
updateUserIds, mPm.mSettings.getPackagesLocked());
}
mPm.sendPackageBroadcast(Intent.ACTION_PACKAGE_ADDED, packageName,
@@ -2813,12 +2807,11 @@ final class InstallPackageHelper {
}
} else if (!ArrayUtils.isEmpty(res.mLibraryConsumers)) { // if static shared lib
// No need to kill consumers if it's installation of new version static shared lib.
- final Computer snapshot = mPm.snapshotComputer();
final boolean dontKillApp = !update && res.mPkg.getStaticSharedLibName() != null;
for (int i = 0; i < res.mLibraryConsumers.size(); i++) {
AndroidPackage pkg = res.mLibraryConsumers.get(i);
// send broadcast that all consumers of the static shared library have changed
- mPm.sendPackageChangedBroadcast(snapshot, pkg.getPackageName(), dontKillApp,
+ mPm.sendPackageChangedBroadcast(pkg.getPackageName(), dontKillApp,
new ArrayList<>(Collections.singletonList(pkg.getPackageName())),
pkg.getUid(), null);
}
diff --git a/services/core/java/com/android/server/pm/ModuleInfoProvider.java b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
index 230f5558b37d..0ffc1ed9e90c 100644
--- a/services/core/java/com/android/server/pm/ModuleInfoProvider.java
+++ b/services/core/java/com/android/server/pm/ModuleInfoProvider.java
@@ -16,7 +16,6 @@
package com.android.server.pm;
-import android.annotation.NonNull;
import android.content.Context;
import android.content.pm.IPackageManager;
import android.content.pm.ModuleInfo;
@@ -26,7 +25,6 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.UserHandle;
import android.text.TextUtils;
import android.util.ArrayMap;
@@ -60,7 +58,7 @@ public class ModuleInfoProvider {
private static final String MODULE_METADATA_KEY = "android.content.pm.MODULE_METADATA";
private final Context mContext;
- private IPackageManager mPackageManager;
+ private final IPackageManager mPackageManager;
private final ApexManager mApexManager;
private final Map<String, ModuleInfo> mModuleInfo;
@@ -68,8 +66,9 @@ public class ModuleInfoProvider {
private volatile boolean mMetadataLoaded;
private volatile String mPackageName;
- ModuleInfoProvider(Context context) {
+ ModuleInfoProvider(Context context, IPackageManager packageManager) {
mContext = context;
+ mPackageManager = packageManager;
mApexManager = ApexManager.getInstance();
mModuleInfo = new ArrayMap<>();
}
@@ -78,20 +77,12 @@ public class ModuleInfoProvider {
public ModuleInfoProvider(
XmlResourceParser metadata, Resources resources, ApexManager apexManager) {
mContext = null;
+ mPackageManager = null;
mApexManager = apexManager;
mModuleInfo = new ArrayMap<>();
loadModuleMetadata(metadata, resources);
}
- @NonNull
- private IPackageManager getPackageManager() {
- if (mPackageManager == null) {
- mPackageManager = IPackageManager.Stub.asInterface(
- ServiceManager.getService("package"));
- }
- return mPackageManager;
- }
-
/** Called by the {@code PackageManager} when it has completed its boot sequence */
public void systemReady() {
mPackageName = mContext.getResources().getString(
@@ -104,7 +95,7 @@ public class ModuleInfoProvider {
final Resources packageResources;
final PackageInfo pi;
try {
- pi = getPackageManager().getPackageInfo(mPackageName,
+ pi = mPackageManager.getPackageInfo(mPackageName,
PackageManager.GET_META_DATA, UserHandle.USER_SYSTEM);
Context packageContext = mContext.createPackageContext(mPackageName, 0);
@@ -192,7 +183,7 @@ public class ModuleInfoProvider {
List<PackageInfo> allPackages;
try {
- allPackages = getPackageManager().getInstalledPackages(
+ allPackages = mPackageManager.getInstalledPackages(
flags | PackageManager.MATCH_APEX, UserHandle.getCallingUserId()).getList();
} catch (RemoteException e) {
Slog.w(TAG, "Unable to retrieve all package names", e);
diff --git a/services/core/java/com/android/server/pm/MovePackageHelper.java b/services/core/java/com/android/server/pm/MovePackageHelper.java
index c5ca06cc7b84..5fc90b1d994f 100644
--- a/services/core/java/com/android/server/pm/MovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/MovePackageHelper.java
@@ -57,8 +57,6 @@ import com.android.internal.os.SomeArgs;
import com.android.internal.util.FrameworkStatsLog;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.parsing.pkg.AndroidPackageUtils;
-import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.pm.pkg.PackageStateUtils;
import java.io.File;
import java.util.Objects;
@@ -79,74 +77,81 @@ public final class MovePackageHelper {
final StorageManager storage = mPm.mInjector.getSystemService(StorageManager.class);
final PackageManager pm = mPm.mContext.getPackageManager();
- Computer snapshot = mPm.snapshotComputer();
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
- if (packageState == null
- || packageState.getPkg() == null
- || snapshot.shouldFilterApplication(packageState, callingUid, user.getIdentifier())) {
- throw new PackageManagerException(MOVE_FAILED_DOESNT_EXIST, "Missing package");
- }
- final AndroidPackage pkg = packageState.getPkg();
- if (pkg.isSystem()) {
- throw new PackageManagerException(MOVE_FAILED_SYSTEM_PACKAGE,
- "Cannot move system application");
- }
-
- final boolean isInternalStorage = VolumeInfo.ID_PRIVATE_INTERNAL.equals(volumeUuid);
- final boolean allow3rdPartyOnInternal = mPm.mContext.getResources().getBoolean(
- com.android.internal.R.bool.config_allow3rdPartyAppOnInternal);
- if (isInternalStorage && !allow3rdPartyOnInternal) {
- throw new PackageManagerException(MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL,
- "3rd party apps are not allowed on internal storage");
- }
+ final String currentVolumeUuid;
+ final File codeFile;
+ final InstallSource installSource;
+ final String packageAbiOverride;
+ final int appId;
+ final String seinfo;
+ final String label;
+ final int targetSdkVersion;
+ final PackageFreezer freezer;
+ final int[] installedUserIds;
+ final boolean isCurrentLocationExternal;
+ final String fromCodePath;
+ // reader
+ synchronized (mPm.mLock) {
+ final AndroidPackage pkg = mPm.mPackages.get(packageName);
+ final PackageSetting ps = mPm.mSettings.getPackageLPr(packageName);
+ if (pkg == null
+ || ps == null
+ || mPm.shouldFilterApplication(ps, callingUid, user.getIdentifier())) {
+ throw new PackageManagerException(MOVE_FAILED_DOESNT_EXIST, "Missing package");
+ }
+ if (pkg.isSystem()) {
+ throw new PackageManagerException(MOVE_FAILED_SYSTEM_PACKAGE,
+ "Cannot move system application");
+ }
- final String currentVolumeUuid = packageState.getVolumeUuid();
+ final boolean isInternalStorage = VolumeInfo.ID_PRIVATE_INTERNAL.equals(volumeUuid);
+ final boolean allow3rdPartyOnInternal = mPm.mContext.getResources().getBoolean(
+ com.android.internal.R.bool.config_allow3rdPartyAppOnInternal);
+ if (isInternalStorage && !allow3rdPartyOnInternal) {
+ throw new PackageManagerException(MOVE_FAILED_3RD_PARTY_NOT_ALLOWED_ON_INTERNAL,
+ "3rd party apps are not allowed on internal storage");
+ }
- final File probe = new File(pkg.getPath());
- final File probeOat = new File(probe, "oat");
- if (!probe.isDirectory() || !probeOat.isDirectory()) {
- throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
- "Move only supported for modern cluster style installs");
- }
+ currentVolumeUuid = ps.getVolumeUuid();
- if (Objects.equals(currentVolumeUuid, volumeUuid)) {
- throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
- "Package already moved to " + volumeUuid);
- }
- if (!pkg.isExternalStorage()
- && mPm.isPackageDeviceAdminOnAnyUser(snapshot, packageName)) {
- throw new PackageManagerException(MOVE_FAILED_DEVICE_ADMIN,
- "Device admin cannot be moved");
- }
+ final File probe = new File(pkg.getPath());
+ final File probeOat = new File(probe, "oat");
+ if (!probe.isDirectory() || !probeOat.isDirectory()) {
+ throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
+ "Move only supported for modern cluster style installs");
+ }
- if (snapshot.getFrozenPackages().containsKey(packageName)) {
- throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING,
- "Failed to move already frozen package");
- }
+ if (Objects.equals(currentVolumeUuid, volumeUuid)) {
+ throw new PackageManagerException(MOVE_FAILED_INTERNAL_ERROR,
+ "Package already moved to " + volumeUuid);
+ }
+ if (!pkg.isExternalStorage() && mPm.isPackageDeviceAdminOnAnyUser(packageName)) {
+ throw new PackageManagerException(MOVE_FAILED_DEVICE_ADMIN,
+ "Device admin cannot be moved");
+ }
- final boolean isCurrentLocationExternal = pkg.isExternalStorage();
- final File codeFile = new File(pkg.getPath());
- final InstallSource installSource = packageState.getInstallSource();
- final String packageAbiOverride = packageState.getCpuAbiOverride();
- final int appId = UserHandle.getAppId(pkg.getUid());
- final String seinfo = AndroidPackageUtils.getSeInfo(pkg, packageState);
- final String label = String.valueOf(pm.getApplicationLabel(
- AndroidPackageUtils.generateAppInfoWithoutState(pkg)));
- final int targetSdkVersion = pkg.getTargetSdkVersion();
- final int[] installedUserIds = PackageStateUtils.queryInstalledUsers(packageState,
- mPm.mUserManager.getUserIds(), true);
- final String fromCodePath;
- if (codeFile.getParentFile().getName().startsWith(
- PackageManagerService.RANDOM_DIR_PREFIX)) {
- fromCodePath = codeFile.getParentFile().getAbsolutePath();
- } else {
- fromCodePath = codeFile.getAbsolutePath();
- }
+ if (mPm.mFrozenPackages.containsKey(packageName)) {
+ throw new PackageManagerException(MOVE_FAILED_OPERATION_PENDING,
+ "Failed to move already frozen package");
+ }
- final PackageFreezer freezer;
- synchronized (mPm.mLock) {
+ isCurrentLocationExternal = pkg.isExternalStorage();
+ codeFile = new File(pkg.getPath());
+ installSource = ps.getInstallSource();
+ packageAbiOverride = ps.getCpuAbiOverride();
+ appId = UserHandle.getAppId(pkg.getUid());
+ seinfo = AndroidPackageUtils.getSeInfo(pkg, ps);
+ label = String.valueOf(pm.getApplicationLabel(
+ AndroidPackageUtils.generateAppInfoWithoutState(pkg)));
+ targetSdkVersion = pkg.getTargetSdkVersion();
freezer = mPm.freezePackage(packageName, "movePackageInternal");
+ installedUserIds = ps.queryInstalledUsers(mPm.mUserManager.getUserIds(), true);
+ if (codeFile.getParentFile().getName().startsWith(
+ PackageManagerService.RANDOM_DIR_PREFIX)) {
+ fromCodePath = codeFile.getParentFile().getAbsolutePath();
+ } else {
+ fromCodePath = codeFile.getAbsolutePath();
+ }
}
final Bundle extras = new Bundle();
diff --git a/services/core/java/com/android/server/pm/OtaDexoptService.java b/services/core/java/com/android/server/pm/OtaDexoptService.java
index cc4a76034b2b..bd0091480caf 100644
--- a/services/core/java/com/android/server/pm/OtaDexoptService.java
+++ b/services/core/java/com/android/server/pm/OtaDexoptService.java
@@ -131,9 +131,8 @@ public class OtaDexoptService extends IOtaDexopt.Stub {
Predicate<PackageStateInternal> isPlatformPackage = pkgSetting ->
PLATFORM_PACKAGE_NAME.equals(pkgSetting.getPkg().getPackageName());
// Important: the packages we need to run with ab-ota compiler-reason.
- final Computer snapshot = mPackageManagerService.snapshotComputer();
final Collection<? extends PackageStateInternal> allPackageStates =
- snapshot.getPackageStates().values();
+ mPackageManagerService.getPackageStates().values();
important = DexOptHelper.getPackagesForDexopt(allPackageStates,mPackageManagerService,
DEBUG_DEXOPT);
// Remove Platform Package from A/B OTA b/160735835.
@@ -166,7 +165,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) {
- mPackageManagerService.deleteOatArtifactsOfPackage(snapshot, pkg.getPackageName());
+ mPackageManagerService.deleteOatArtifactsOfPackage(pkg.getPackageName());
}
}
long spaceAvailableNow = getAvailableSpace();
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 4e702e2c9df5..6613f016f66a 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -597,8 +597,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
String installerAttributionTag, int userId)
throws IOException {
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = mPm.snapshotComputer();
- snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "createSession");
+ mPm.enforceCrossUserPermission(
+ callingUid, userId, true, true, "createSession");
if (mPm.isUserRestricted(userId, UserManager.DISALLOW_INSTALL_APPS)) {
throw new SecurityException("User restriction prevents installing");
@@ -663,7 +663,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
params.installFlags &= ~PackageManager.INSTALL_ALL_USERS;
params.installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
if ((params.installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0
- && !mPm.isCallerVerifier(snapshot, callingUid)) {
+ && !mPm.isCallerVerifier(callingUid)) {
params.installFlags &= ~PackageManager.INSTALL_VIRTUAL_PRELOAD;
}
if (mContext.checkCallingOrSelfPermission(
@@ -676,7 +676,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
String originatingPackageName = null;
if (params.originatingUid != SessionParams.UID_UNKNOWN
&& params.originatingUid != callingUid) {
- String[] packages = snapshot.getPackagesForUid(params.originatingUid);
+ String[] packages = mPm.mIPackageManager.getPackagesForUid(params.originatingUid);
if (packages != null && packages.length > 0) {
// Choose an arbitrary representative package in the case of a shared UID.
originatingPackageName = packages[0];
@@ -727,7 +727,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
if ((params.installFlags & PackageManager.INSTALL_INSTANT_APP) != 0
&& !isCalledBySystemOrShell(callingUid)
- && (snapshot.getFlagsForUid(callingUid) & ApplicationInfo.FLAG_SYSTEM)
+ && (mPm.mIPackageManager.getFlagsForUid(callingUid) & ApplicationInfo.FLAG_SYSTEM)
== 0) {
throw new SecurityException(
"Only system apps could use the PackageManager.INSTALL_INSTANT_APP flag.");
@@ -1038,12 +1038,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
return "smdl" + sessionId + ".tmp";
}
- private boolean shouldFilterSession(@NonNull Computer snapshot, int uid, SessionInfo info) {
+ private boolean shouldFilterSession(int uid, SessionInfo info) {
if (info == null) {
return false;
}
- return uid != info.getInstallerUid()
- && !snapshot.canQueryPackage(uid, info.getAppPackageName());
+ return uid != info.getInstallerUid() && !mPm.canQueryPackage(uid, info.getAppPackageName());
}
@Override
@@ -1056,7 +1055,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
? session.generateInfoForCaller(true /* includeIcon */, callingUid)
: null;
}
- return shouldFilterSession(mPm.snapshotComputer(), callingUid, result) ? null : result;
+ return shouldFilterSession(callingUid, result) ? null : result;
}
@Override
@@ -1071,16 +1070,15 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
}
}
}
- final Computer snapshot = mPm.snapshotComputer();
- result.removeIf(info -> shouldFilterSession(snapshot, callingUid, info));
+ result.removeIf(info -> shouldFilterSession(callingUid, info));
return new ParceledListSlice<>(result);
}
@Override
public ParceledListSlice<SessionInfo> getAllSessions(int userId) {
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = mPm.snapshotComputer();
- snapshot.enforceCrossUserPermission(callingUid, userId, true, false, "getAllSessions");
+ mPm.enforceCrossUserPermission(
+ callingUid, userId, true, false, "getAllSessions");
final List<SessionInfo> result = new ArrayList<>();
synchronized (mSessions) {
@@ -1092,16 +1090,15 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
}
}
}
- result.removeIf(info -> shouldFilterSession(snapshot, callingUid, info));
+ result.removeIf(info -> shouldFilterSession(callingUid, info));
return new ParceledListSlice<>(result);
}
@Override
public ParceledListSlice<SessionInfo> getMySessions(String installerPackageName, int userId) {
- final Computer snapshot = mPm.snapshotComputer();
- final int callingUid = Binder.getCallingUid();
- snapshot.enforceCrossUserPermission(callingUid, userId, true, false, "getMySessions");
- mAppOps.checkPackage(callingUid, installerPackageName);
+ mPm.enforceCrossUserPermission(
+ Binder.getCallingUid(), userId, true, false, "getMySessions");
+ mAppOps.checkPackage(Binder.getCallingUid(), installerPackageName);
final List<SessionInfo> result = new ArrayList<>();
synchronized (mSessions) {
@@ -1123,9 +1120,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
@Override
public void uninstall(VersionedPackage versionedPackage, String callerPackageName, int flags,
IntentSender statusReceiver, int userId) {
- final Computer snapshot = mPm.snapshotComputer();
final int callingUid = Binder.getCallingUid();
- snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
+ mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) {
mAppOps.checkPackage(callingUid, callerPackageName);
}
@@ -1158,7 +1154,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
.setAdmin(callerPackageName)
.write();
} else {
- ApplicationInfo appInfo = snapshot.getApplicationInfo(callerPackageName, 0, userId);
+ ApplicationInfo appInfo = mPm.mIPackageManager
+ .getApplicationInfo(callerPackageName, 0, userId);
if (appInfo.targetSdkVersion >= Build.VERSION_CODES.P) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.REQUEST_DELETE_PACKAGES,
null);
@@ -1177,8 +1174,7 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
String callerPackageName, IntentSender statusReceiver, int userId) {
final int callingUid = Binder.getCallingUid();
mContext.enforceCallingOrSelfPermission(Manifest.permission.DELETE_PACKAGES, null);
- final Computer snapshot = mPm.snapshotComputer();
- snapshot.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
+ mPm.enforceCrossUserPermission(callingUid, userId, true, true, "uninstall");
if ((callingUid != Process.SHELL_UID) && (callingUid != Process.ROOT_UID)) {
mAppOps.checkPackage(callingUid, callerPackageName);
}
@@ -1210,9 +1206,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
@Override
public void registerCallback(IPackageInstallerCallback callback, int userId) {
- final Computer snapshot = mPm.snapshotComputer();
- snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false,
- "registerCallback");
+ mPm.enforceCrossUserPermission(
+ Binder.getCallingUid(), userId, true, false, "registerCallback");
registerCallback(callback, eventUserId -> userId == eventUserId);
}
@@ -1300,13 +1295,13 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
}
}
- private boolean shouldFilterSession(@NonNull Computer snapshot, int uid, int sessionId) {
+ private boolean shouldFilterSession(int uid, int sessionId) {
final PackageInstallerSession session = getSession(sessionId);
if (session == null) {
return false;
}
return uid != session.getInstallerUid()
- && !snapshot.canQueryPackage(uid, session.getPackageName());
+ && !mPm.canQueryPackage(uid, session.getPackageName());
}
static class PackageDeleteObserverAdapter extends PackageDeleteObserver {
@@ -1459,12 +1454,11 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
final int sessionId = msg.arg1;
final int userId = msg.arg2;
final int n = mCallbacks.beginBroadcast();
- final Computer snapshot = mPm.snapshotComputer();
for (int i = 0; i < n; i++) {
final IPackageInstallerCallback callback = mCallbacks.getBroadcastItem(i);
final BroadcastCookie cookie = (BroadcastCookie) mCallbacks.getBroadcastCookie(i);
if (cookie.userCheck.test(userId)
- && !shouldFilterSession(snapshot, cookie.callingUid, sessionId)) {
+ && !shouldFilterSession(cookie.callingUid, sessionId)) {
try {
invokeCallback(callback, msg);
} catch (RemoteException ignored) {
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
index 68be64fdba0d..bcda046c2abe 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -860,8 +860,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
return USER_ACTION_NOT_NEEDED;
}
- if (snapshot.isInstallDisabledForPackage(getInstallerPackageName(), mInstallerUid,
- userId)) {
+ if (mPm.isInstallDisabledForPackage(getInstallerPackageName(), mInstallerUid, userId)) {
// show the installer to account for device poslicy or unknown sources use cases
return USER_ACTION_REQUIRED;
}
@@ -3756,8 +3755,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
};
if (!manualStartAndDestroy) {
- final PerUidReadTimeouts[] perUidReadTimeouts =
- mPm.getPerUidReadTimeouts(mPm.snapshotComputer());
+ final PerUidReadTimeouts[] perUidReadTimeouts = mPm.getPerUidReadTimeouts();
final StorageHealthCheckParams healthCheckParams = new StorageHealthCheckParams();
healthCheckParams.blockedTimeoutMs = INCREMENTAL_STORAGE_BLOCKED_TIMEOUT_MS;
diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java
deleted file mode 100644
index 2b733754685e..000000000000
--- a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java
+++ /dev/null
@@ -1,751 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.pm;
-
-import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
-import static android.content.pm.PackageManager.RESTRICTION_NONE;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.UserIdInt;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.Intent;
-import android.content.pm.ActivityInfo;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.AuxiliaryResolveInfo;
-import android.content.pm.Checksum;
-import android.content.pm.IOnChecksumsReadyListener;
-import android.content.pm.PackageInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
-import android.content.pm.ProcessInfo;
-import android.content.pm.ProviderInfo;
-import android.content.pm.ResolveInfo;
-import android.content.pm.SuspendDialogInfo;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Process;
-import android.os.storage.StorageManager;
-import android.util.ArrayMap;
-import android.util.ArraySet;
-import android.util.SparseArray;
-
-import com.android.server.pm.dex.DexManager;
-import com.android.server.pm.dex.DynamicCodeLogger;
-import com.android.server.pm.parsing.pkg.AndroidPackage;
-import com.android.server.pm.permission.PermissionManagerServiceInternal;
-import com.android.server.pm.pkg.AndroidPackageApi;
-import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.pm.pkg.PackageStateUtils;
-import com.android.server.pm.pkg.SharedUserApi;
-import com.android.server.pm.pkg.component.ParsedMainComponent;
-import com.android.server.pm.pkg.mutate.PackageStateMutator;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.concurrent.Executor;
-import java.util.function.Consumer;
-
-/**
- * Internal manager variant of {@link IPackageManagerBase}. See that class for info.
- * {@link PackageManagerInternal} should eventually passing in a snapshot instance, deprecating
- * this class, but that requires much larger refactor.
- */
-abstract class PackageManagerInternalBase extends PackageManagerInternal {
-
- @NonNull
- private final PackageManagerService mService;
-
- public PackageManagerInternalBase(@NonNull PackageManagerService service) {
- mService = service;
- }
-
- @NonNull protected abstract Context getContext();
- @NonNull protected abstract PermissionManagerServiceInternal getPermissionManager();
- @NonNull protected abstract AppDataHelper getAppDataHelper();
- @NonNull protected abstract PackageObserverHelper getPackageObserverHelper();
- @NonNull protected abstract ResolveIntentHelper getResolveIntentHelper();
- @NonNull protected abstract SuspendPackageHelper getSuspendPackageHelper();
- @NonNull protected abstract ProtectedPackages getProtectedPackages();
- @NonNull protected abstract UserNeedsBadgingCache getUserNeedsBadging();
- @NonNull protected abstract InstantAppRegistry getInstantAppRegistry();
- @NonNull protected abstract ApexManager getApexManager();
- @NonNull protected abstract DexManager getDexManager();
-
- @Override
- public final Computer snapshot() {
- return mService.snapshotComputer();
- }
-
- @Override
- @Deprecated
- public final List<ApplicationInfo> getInstalledApplications(
- @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) {
- return snapshot().getInstalledApplications(flags, userId, callingUid);
- }
-
- @Override
- @Deprecated
- public final boolean isInstantApp(String packageName, int userId) {
- return snapshot().isInstantApp(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final String getInstantAppPackageName(int uid) {
- return snapshot().getInstantAppPackageName(uid);
- }
-
- @Override
- @Deprecated
- public final boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
- return snapshot().filterAppAccess(pkg, callingUid, userId);
- }
-
- @Override
- @Deprecated
- public final boolean filterAppAccess(String packageName, int callingUid, int userId) {
- return snapshot().filterAppAccess(packageName, callingUid, userId);
- }
-
- @Override
- @Deprecated
- public final boolean filterAppAccess(int uid, int callingUid) {
- return snapshot().filterAppAccess(uid, callingUid);
- }
-
- @Nullable
- @Override
- @Deprecated
- public final int[] getVisibilityAllowList(@NonNull String packageName, int userId) {
- return snapshot().getVisibilityAllowList(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final boolean canQueryPackage(int callingUid, @Nullable String packageName) {
- return snapshot().canQueryPackage(callingUid, packageName);
- }
-
- @Override
- @Deprecated
- public final AndroidPackage getPackage(String packageName) {
- return snapshot().getPackage(packageName);
- }
-
- @Nullable
- @Override
- @Deprecated
- public final AndroidPackageApi getAndroidPackage(@NonNull String packageName) {
- return snapshot().getPackage(packageName);
- }
-
- @Override
- @Deprecated
- public final AndroidPackage getPackage(int uid) {
- return snapshot().getPackage(uid);
- }
-
- @Override
- @Deprecated
- public final List<AndroidPackage> getPackagesForAppId(int appId) {
- return snapshot().getPackagesForAppId(appId);
- }
-
- @Nullable
- @Override
- @Deprecated
- public final PackageStateInternal getPackageStateInternal(String packageName) {
- return snapshot().getPackageStateInternal(packageName);
- }
-
- @NonNull
- @Override
- @Deprecated
- public final ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
- return snapshot().getPackageStates();
- }
-
- @Override
- @Deprecated
- public final void removePackageListObserver(PackageListObserver observer) {
- getPackageObserverHelper().removeObserver(observer);
- }
-
- @Override
- @Deprecated
- public final PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) {
- return snapshot().getDisabledSystemPackage(packageName);
- }
-
- @Override
- @Deprecated
- public final @NonNull String[] getKnownPackageNames(int knownPackage, int userId) {
- return mService.getKnownPackageNamesInternal(snapshot(), knownPackage, userId);
- }
-
- @Override
- @Deprecated
- public final void setKeepUninstalledPackages(final List<String> packageList) {
- mService.setKeepUninstalledPackagesInternal(snapshot(), packageList);
- }
-
- @Override
- @Deprecated
- public final boolean isPermissionsReviewRequired(String packageName, int userId) {
- return getPermissionManager().isPermissionsReviewRequired(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final PackageInfo getPackageInfo(String packageName,
- @PackageManager.PackageInfoFlagsBits long flags, int filterCallingUid, int userId) {
- return snapshot().getPackageInfoInternal(packageName,
- PackageManager.VERSION_CODE_HIGHEST, flags, filterCallingUid, userId);
- }
-
- @Override
- @Deprecated
- public final Bundle getSuspendedPackageLauncherExtras(String packageName, int userId) {
- return getSuspendPackageHelper().getSuspendedPackageLauncherExtras(snapshot(), packageName,
- userId, Binder.getCallingUid());
- }
-
- @Override
- @Deprecated
- public final boolean isPackageSuspended(String packageName, int userId) {
- return getSuspendPackageHelper().isPackageSuspended(snapshot(), packageName, userId,
- Binder.getCallingUid());
- }
-
- @Override
- @Deprecated
- public final void removeNonSystemPackageSuspensions(String packageName, int userId) {
- getSuspendPackageHelper().removeSuspensionsBySuspendingPackage(snapshot(),
- new String[]{packageName},
- (suspendingPackage) -> !PackageManagerService.PLATFORM_PACKAGE_NAME.equals(
- suspendingPackage),
- userId);
- }
-
- @Override
- @Deprecated
- public final void removeDistractingPackageRestrictions(String packageName, int userId) {
- mService.removeDistractingPackageRestrictions(snapshot(), new String[]{packageName},
- userId);
- }
-
- @Override
- @Deprecated
- public final void removeAllDistractingPackageRestrictions(int userId) {
- mService.removeAllDistractingPackageRestrictions(snapshot(), userId);
- }
-
- @Override
- @Deprecated
- public final String getSuspendingPackage(String suspendedPackage, int userId) {
- return getSuspendPackageHelper().getSuspendingPackage(snapshot(), suspendedPackage, userId,
- Binder.getCallingUid());
- }
-
- @Override
- @Deprecated
- public final SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage,
- String suspendingPackage, int userId) {
- return getSuspendPackageHelper().getSuspendedDialogInfo(snapshot(), suspendedPackage,
- suspendingPackage, userId, Binder.getCallingUid());
- }
-
- @Override
- @Deprecated
- public final int getDistractingPackageRestrictions(String packageName, int userId) {
- final PackageStateInternal packageState = getPackageStateInternal(packageName);
- return (packageState == null) ? RESTRICTION_NONE
- : packageState.getUserStateOrDefault(userId).getDistractionFlags();
- }
-
- @Override
- @Deprecated
- public final int getPackageUid(String packageName,
- @PackageManager.PackageInfoFlagsBits long flags, int userId) {
- return snapshot().getPackageUidInternal(packageName, flags, userId, Process.SYSTEM_UID);
- }
-
- @Override
- @Deprecated
- public final ApplicationInfo getApplicationInfo(String packageName,
- @PackageManager.ApplicationInfoFlagsBits long flags, int filterCallingUid, int userId) {
- return snapshot().getApplicationInfoInternal(packageName, flags, filterCallingUid, userId);
- }
-
- @Override
- @Deprecated
- public final ActivityInfo getActivityInfo(ComponentName component,
- @PackageManager.ComponentInfoFlagsBits long flags, int filterCallingUid, int userId) {
- return snapshot().getActivityInfoInternal(component, flags, filterCallingUid, userId);
- }
-
- @Override
- @Deprecated
- public final List<ResolveInfo> queryIntentActivities(
- Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
- int filterCallingUid, int userId) {
- return snapshot().queryIntentActivitiesInternal(intent, resolvedType, flags, userId);
- }
-
- @Override
- @Deprecated
- public final List<ResolveInfo> queryIntentReceivers(Intent intent,
- String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
- int filterCallingUid, int userId) {
- return getResolveIntentHelper().queryIntentReceiversInternal(
- snapshot(), intent, resolvedType, flags, userId, filterCallingUid);
- }
-
- @Override
- @Deprecated
- public final List<ResolveInfo> queryIntentServices(
- Intent intent, @PackageManager.ResolveInfoFlagsBits long flags, int callingUid,
- int userId) {
- final String resolvedType = intent.resolveTypeIfNeeded(getContext().getContentResolver());
- return snapshot().queryIntentServicesInternal(intent, resolvedType, flags, userId,
- callingUid, false);
- }
-
- @Override
- @Deprecated
- public final ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
- int userId) {
- return snapshot().getHomeActivitiesAsUser(allHomeCandidates, userId);
- }
-
- @Override
- @Deprecated
- public final ComponentName getDefaultHomeActivity(int userId) {
- return snapshot().getDefaultHomeActivity(userId);
- }
-
- @Override
- @Deprecated
- public final ComponentName getSystemUiServiceComponent() {
- return ComponentName.unflattenFromString(getContext().getResources().getString(
- com.android.internal.R.string.config_systemUIServiceComponent));
- }
-
- @Override
- @Deprecated
- public final void setDeviceOwnerProtectedPackages(
- String deviceOwnerPackageName, List<String> packageNames) {
- getProtectedPackages().setDeviceOwnerProtectedPackages(
- deviceOwnerPackageName, packageNames);
- }
-
- @Override
- @Deprecated
- public final boolean isPackageDataProtected(int userId, String packageName) {
- return getProtectedPackages().isPackageDataProtected(userId, packageName);
- }
-
- @Override
- @Deprecated
- public final boolean isPackageStateProtected(String packageName, int userId) {
- return getProtectedPackages().isPackageStateProtected(userId, packageName);
- }
-
- @Override
- @Deprecated
- public final boolean isPackageEphemeral(int userId, String packageName) {
- final PackageStateInternal packageState = getPackageStateInternal(packageName);
- return packageState != null
- && packageState.getUserStateOrDefault(userId).isInstantApp();
- }
-
- @Override
- @Deprecated
- public final boolean wasPackageEverLaunched(String packageName, int userId) {
- final PackageStateInternal packageState = getPackageStateInternal(packageName);
- if (packageState == null) {
- throw new IllegalArgumentException("Unknown package: " + packageName);
- }
- return !packageState.getUserStateOrDefault(userId).isNotLaunched();
- }
-
- @Override
- @Deprecated
- public final boolean isEnabledAndMatches(ParsedMainComponent component, long flags, int userId) {
- return PackageStateUtils.isEnabledAndMatches(
- getPackageStateInternal(component.getPackageName()), component, flags, userId);
- }
-
- @Override
- @Deprecated
- public final boolean userNeedsBadging(int userId) {
- return getUserNeedsBadging().get(userId);
- }
-
- @Override
- @Deprecated
- public final String getNameForUid(int uid) {
- return snapshot().getNameForUid(uid);
- }
-
- @Override
- @Deprecated
- public final void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
- Intent origIntent, String resolvedType, String callingPackage,
- @Nullable String callingFeatureId, boolean isRequesterInstantApp,
- Bundle verificationBundle, int userId) {
- mService.requestInstantAppResolutionPhaseTwo(responseObj, origIntent,
- resolvedType, callingPackage, callingFeatureId, isRequesterInstantApp,
- verificationBundle, userId);
- }
-
- @Override
- @Deprecated
- public final void grantImplicitAccess(int userId, Intent intent,
- int recipientAppId, int visibleUid, boolean direct) {
- grantImplicitAccess(userId, intent, recipientAppId, visibleUid, direct,
- false /* retainOnUpdate */);
- }
-
- @Override
- @Deprecated
- public final void grantImplicitAccess(int userId, Intent intent,
- int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) {
- mService.grantImplicitAccess(snapshot(), userId, intent,
- recipientAppId, visibleUid, direct, retainOnUpdate);
- }
-
- @Override
- @Deprecated
- public final boolean isInstantAppInstallerComponent(ComponentName component) {
- final ActivityInfo instantAppInstallerActivity = mService.mInstantAppInstallerActivity;
- return instantAppInstallerActivity != null
- && instantAppInstallerActivity.getComponentName().equals(component);
- }
-
- @Override
- @Deprecated
- public final void pruneInstantApps() {
- getInstantAppRegistry().pruneInstantApps(snapshot());
- }
-
- @Override
- @Deprecated
- public final String getSetupWizardPackageName() {
- return mService.mSetupWizardPackage;
- }
-
- @Override
- @Deprecated
- public final ResolveInfo resolveIntent(Intent intent, String resolvedType,
- @PackageManager.ResolveInfoFlagsBits long flags,
- @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int userId,
- boolean resolveForStart, int filterCallingUid) {
- return getResolveIntentHelper().resolveIntentInternal(snapshot(),
- intent, resolvedType, flags, privateResolveFlags, userId, resolveForStart,
- filterCallingUid);
- }
-
- @Override
- @Deprecated
- public final ResolveInfo resolveService(Intent intent, String resolvedType,
- @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) {
- return getResolveIntentHelper().resolveServiceInternal(snapshot(), intent,
- resolvedType, flags, userId, callingUid);
- }
-
- @Override
- @Deprecated
- public final ProviderInfo resolveContentProvider(String name,
- @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) {
- return snapshot().resolveContentProvider(name, flags, userId,callingUid);
- }
-
- @Override
- @Deprecated
- public final int getUidTargetSdkVersion(int uid) {
- return snapshot().getUidTargetSdkVersion(uid);
- }
-
- @Override
- @Deprecated
- public final int getPackageTargetSdkVersion(String packageName) {
- final PackageStateInternal packageState = getPackageStateInternal(packageName);
- if (packageState != null && packageState.getPkg() != null) {
- return packageState.getPkg().getTargetSdkVersion();
- }
- return Build.VERSION_CODES.CUR_DEVELOPMENT;
- }
-
- @Override
- @Deprecated
- public final boolean canAccessInstantApps(int callingUid, @UserIdInt int userId) {
- return snapshot().canViewInstantApps(callingUid, userId);
- }
-
- @Override
- @Deprecated
- public final boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
- @UserIdInt int userId) {
- return snapshot().canAccessComponent(callingUid, component, userId);
- }
-
- @Override
- @Deprecated
- public final boolean hasInstantApplicationMetadata(String packageName, int userId) {
- return getInstantAppRegistry().hasInstantApplicationMetadata(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final SparseArray<String> getAppsWithSharedUserIds() {
- return snapshot().getAppsWithSharedUserIds();
- }
-
- @Override
- @NonNull
- @Deprecated
- public final String[] getSharedUserPackagesForPackage(String packageName, int userId) {
- return snapshot().getSharedUserPackagesForPackage(packageName, userId);
- }
-
- @Override
- @Deprecated
- public final ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) {
- return snapshot().getProcessesForUid(uid);
- }
-
- @Override
- @Deprecated
- public final int[] getPermissionGids(String permissionName, int userId) {
- return getPermissionManager().getPermissionGids(permissionName, userId);
- }
-
- @Override
- @Deprecated
- public final boolean isOnlyCoreApps() {
- return mService.isOnlyCoreApps();
- }
-
- @Override
- @Deprecated
- public final void freeStorage(String volumeUuid, long bytes,
- @StorageManager.AllocateFlags int flags) throws IOException {
- mService.freeStorage(volumeUuid, bytes, flags);
- }
-
- @Override
- @Deprecated
- public final void freeAllAppCacheAboveQuota(@NonNull String volumeUuid) throws IOException {
- mService.freeAllAppCacheAboveQuota(volumeUuid);
- }
-
- @Override
- @Deprecated
- public final void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
- mService.forEachPackageSetting(actionLocked);
- }
-
- @Override
- @Deprecated
- public final void forEachPackageState(Consumer<PackageStateInternal> action) {
- mService.forEachPackageState(snapshot(), action);
- }
-
- @Override
- @Deprecated
- public final void forEachPackage(Consumer<AndroidPackage> action) {
- mService.forEachPackage(snapshot(), action);
- }
-
- @Override
- @Deprecated
- public final void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action,
- @UserIdInt int userId) {
- mService.forEachInstalledPackage(snapshot(), action, userId);
- }
-
- @Override
- @Deprecated
- public final ArraySet<String> getEnabledComponents(String packageName, int userId) {
- final PackageStateInternal packageState = getPackageStateInternal(packageName);
- if (packageState == null) {
- return new ArraySet<>();
- }
- return packageState.getUserStateOrDefault(userId).getEnabledComponents();
- }
-
- @Override
- @Deprecated
- public final ArraySet<String> getDisabledComponents(String packageName, int userId) {
- final PackageStateInternal packageState = getPackageStateInternal(packageName);
- if (packageState == null) {
- return new ArraySet<>();
- }
- return packageState.getUserStateOrDefault(userId).getDisabledComponents();
- }
-
- @Override
- @Deprecated
- public final @PackageManager.EnabledState int getApplicationEnabledState(
- String packageName, int userId) {
- final PackageStateInternal packageState = getPackageStateInternal(packageName);
- if (packageState == null) {
- return COMPONENT_ENABLED_STATE_DEFAULT;
- }
- return packageState.getUserStateOrDefault(userId).getEnabledState();
- }
-
- @Override
- @Deprecated
- public final @PackageManager.EnabledState int getComponentEnabledSetting(
- @NonNull ComponentName componentName, int callingUid, int userId) {
- return snapshot().getComponentEnabledSettingInternal(
- componentName, callingUid, userId);
- }
-
- @Override
- @Deprecated
- public final void setEnableRollbackCode(int token, int enableRollbackCode) {
- mService.setEnableRollbackCode(token, enableRollbackCode);
- }
-
- @Override
- @Deprecated
- public final void finishPackageInstall(int token, boolean didLaunch) {
- mService.finishPackageInstall(token, didLaunch);
- }
-
- @Override
- @Deprecated
- public final boolean isApexPackage(String packageName) {
- return getApexManager().isApexPackage(packageName);
- }
-
- @Override
- @Deprecated
- public final List<String> getApksInApex(String apexPackageName) {
- return getApexManager().getApksInApex(apexPackageName);
- }
-
- @Override
- @Deprecated
- public final boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) {
- return snapshot().isCallerInstallerOfRecord(pkg, callingUid);
- }
-
- @Override
- @Deprecated
- public final List<String> getMimeGroup(String packageName, String mimeGroup) {
- return mService.getMimeGroupInternal(snapshot(), packageName, mimeGroup);
- }
-
- @Override
- @Deprecated
- public final boolean isSystemPackage(@NonNull String packageName) {
- return packageName.equals(mService.ensureSystemPackageName(snapshot(), packageName));
- }
-
- @Override
- @Deprecated
- public final void unsuspendForSuspendingPackage(final String packageName, int affectedUser) {
- mService.unsuspendForSuspendingPackage(snapshot(), packageName, affectedUser);
- }
-
- @Override
- @Deprecated
- public final boolean isSuspendingAnyPackages(String suspendingPackage, int userId) {
- return snapshot().isSuspendingAnyPackages(suspendingPackage, userId);
- }
-
- @Override
- @Deprecated
- public final void requestChecksums(@NonNull String packageName, boolean includeSplits,
- @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
- @Nullable List trustedInstallers,
- @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId,
- @NonNull Executor executor, @NonNull Handler handler) {
- mService.requestChecksumsInternal(snapshot(), packageName, includeSplits, optional,
- required, trustedInstallers, onChecksumsReadyListener, userId, executor,
- handler);
- }
-
- @Override
- @Deprecated
- public final boolean isPackageFrozen(@NonNull String packageName,
- int callingUid, int userId) {
- return snapshot().getPackageStartability(mService.getSafeMode(), packageName, callingUid, userId)
- == PackageManagerService.PACKAGE_STARTABILITY_FROZEN;
- }
-
- @Override
- @Deprecated
- public final long deleteOatArtifactsOfPackage(String packageName) {
- return mService.deleteOatArtifactsOfPackage(snapshot(), packageName);
- }
-
- @Override
- @Deprecated
- public final void reconcileAppsData(int userId, @StorageManager.StorageFlags int flags,
- boolean migrateAppsData) {
- getAppDataHelper().reconcileAppsData(userId, flags, migrateAppsData);
- }
-
- @Override
- @NonNull
- public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) {
- return snapshot().getSharedUserPackages(sharedUserAppId);
- }
-
- @Override
- @Nullable
- public SharedUserApi getSharedUserApi(int sharedUserAppId) {
- return snapshot().getSharedUser(sharedUserAppId);
- }
-
- @NonNull
- @Override
- @Deprecated
- public final PackageStateMutator.InitialState recordInitialState() {
- return mService.recordInitialState();
- }
-
- @Nullable
- @Override
- @Deprecated
- public final PackageStateMutator.Result commitPackageStateMutation(
- @Nullable PackageStateMutator.InitialState state,
- @NonNull Consumer<PackageStateMutator> consumer) {
- return mService.commitPackageStateMutation(state, consumer);
- }
-
- @Override
- @Deprecated
- public final void shutdown() {
- mService.shutdown();
- }
-
- @Override
- @Deprecated
- public final DynamicCodeLogger getDynamicCodeLogger() {
- return getDexManager().getDynamicCodeLogger();
- }
-}
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 99c9c689544d..e20a861e2eae 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -29,6 +29,7 @@ import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
import static android.content.pm.PackageManager.MATCH_FACTORY_ONLY;
import static android.content.pm.PackageManager.MATCH_SYSTEM_ONLY;
import static android.content.pm.PackageManager.PERMISSION_GRANTED;
+import static android.content.pm.PackageManager.RESTRICTION_NONE;
import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER;
import static android.os.storage.StorageManager.FLAG_STORAGE_CE;
import static android.os.storage.StorageManager.FLAG_STORAGE_DE;
@@ -82,15 +83,21 @@ import android.content.pm.IDexModuleRegisterCallback;
import android.content.pm.IOnChecksumsReadyListener;
import android.content.pm.IPackageChangeObserver;
import android.content.pm.IPackageDataObserver;
+import android.content.pm.IPackageDeleteObserver;
import android.content.pm.IPackageDeleteObserver2;
import android.content.pm.IPackageInstallObserver2;
+import android.content.pm.IPackageInstaller;
import android.content.pm.IPackageLoadingProgressCallback;
import android.content.pm.IPackageManager;
import android.content.pm.IPackageMoveObserver;
+import android.content.pm.IPackageStatsObserver;
import android.content.pm.IncrementalStatesInfo;
import android.content.pm.InstallSourceInfo;
import android.content.pm.InstantAppInfo;
import android.content.pm.InstantAppRequest;
+import android.content.pm.InstrumentationInfo;
+import android.content.pm.IntentFilterVerificationInfo;
+import android.content.pm.KeySet;
import android.content.pm.ModuleInfo;
import android.content.pm.PackageChangeEvent;
import android.content.pm.PackageInfo;
@@ -102,8 +109,11 @@ import android.content.pm.PackageManagerInternal;
import android.content.pm.PackagePartitions;
import android.content.pm.ParceledListSlice;
import android.content.pm.PermissionGroupInfo;
+import android.content.pm.PermissionInfo;
+import android.content.pm.ProcessInfo;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
import android.content.pm.SharedLibraryInfo;
import android.content.pm.Signature;
import android.content.pm.SigningDetails;
@@ -112,6 +122,7 @@ import android.content.pm.TestUtilityService;
import android.content.pm.UserInfo;
import android.content.pm.VerifierDeviceIdentity;
import android.content.pm.VersionedPackage;
+import android.content.pm.dex.IArtManager;
import android.content.pm.overlay.OverlayPaths;
import android.content.pm.parsing.PackageLite;
import android.content.res.Resources;
@@ -202,6 +213,7 @@ import com.android.server.pm.Settings.VersionInfo;
import com.android.server.pm.dex.ArtManagerService;
import com.android.server.pm.dex.ArtUtils;
import com.android.server.pm.dex.DexManager;
+import com.android.server.pm.dex.DynamicCodeLogger;
import com.android.server.pm.dex.ViewCompiler;
import com.android.server.pm.parsing.PackageCacher;
import com.android.server.pm.parsing.PackageInfoUtils;
@@ -213,7 +225,10 @@ import com.android.server.pm.permission.LegacyPermissionManagerInternal;
import com.android.server.pm.permission.LegacyPermissionManagerService;
import com.android.server.pm.permission.PermissionManagerService;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
+import com.android.server.pm.pkg.AndroidPackageApi;
+import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.PackageStateInternal;
+import com.android.server.pm.pkg.PackageStateUtils;
import com.android.server.pm.pkg.PackageUserState;
import com.android.server.pm.pkg.PackageUserStateInternal;
import com.android.server.pm.pkg.SharedUserApi;
@@ -398,8 +413,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
public @interface ScanFlags {}
/**
- * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
- * int)}.
+ * Used as the result code of the {@link #getPackageStartability}.
*/
@IntDef(value = {
PACKAGE_STARTABILITY_OK,
@@ -412,43 +426,40 @@ public class PackageManagerService implements PackageSender, TestUtilityService
public @interface PackageStartability {}
/**
- * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
- * int)} to indicate the given package is allowed to start.
+ * Used as the result code of the {@link #getPackageStartability} to indicate
+ * the given package is allowed to start.
*/
public static final int PACKAGE_STARTABILITY_OK = 0;
/**
- * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
- * int)} to indicate the given package is <b>not</b> allowed to start because it's not found
+ * Used as the result code of the {@link #getPackageStartability} to indicate
+ * the given package is <b>not</b> allowed to start because it's not found
* (could be due to that package is invisible to the given user).
*/
public static final int PACKAGE_STARTABILITY_NOT_FOUND = 1;
/**
- * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
- * int)} to indicate the given package is <b>not</b> allowed to start because it's not a system
- * app and the system is running in safe mode.
+ * Used as the result code of the {@link #getPackageStartability} to indicate
+ * the given package is <b>not</b> allowed to start because it's not a system app
+ * and the system is running in safe mode.
*/
public static final int PACKAGE_STARTABILITY_NOT_SYSTEM = 2;
/**
- * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
- * int)} to indicate the given package is <b>not</b> allowed to start because it's currently
- * frozen.
+ * Used as the result code of the {@link #getPackageStartability} to indicate
+ * the given package is <b>not</b> allowed to start because it's currently frozen.
*/
public static final int PACKAGE_STARTABILITY_FROZEN = 3;
/**
- * Used as the result code of the {@link Computer#getPackageStartability(boolean, String, int,
- * int)} to indicate the given package is <b>not</b> allowed to start because it doesn't support
+ * Used as the result code of the {@link #getPackageStartability} to indicate
+ * the given package is <b>not</b> allowed to start because it doesn't support
* direct boot.
*/
public static final int PACKAGE_STARTABILITY_DIRECT_BOOT_UNSUPPORTED = 4;
private static final String STATIC_SHARED_LIB_DELIMITER = "_";
- /**
- * Extension of the compressed packages
- */
+ /** Extension of the compressed packages */
public final static String COMPRESSED_EXTENSION = ".gz";
/** Suffix of stub packages on the system partition */
public final static String STUB_SUFFIX = "-Stub";
@@ -633,6 +644,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
*/
boolean mPromoteSystemApps;
+ // TODO: Make IPackageManager reference private to hide discouraged APIs
+ final IPackageManagerImpl mIPackageManager;
+ private final PackageManagerInternal mPmInternal;
private final TestUtilityService mTestUtilityService;
@Watched
@@ -1043,6 +1057,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
// A lock-free cache for frequently called functions.
private volatile Computer mSnapshotComputer;
+ // A trampoline that directs callers to either the live or snapshot computer.
+ final ComputerTracker mComputer = new ComputerTracker(this);
+
// If true, the snapshot is invalid (stale). The attribute is static since it may be
// set from outside classes. The attribute may be set to true anywhere, although it
// should only be set true while holding mLock. However, the attribute id guaranteed
@@ -1071,8 +1088,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
* Return the cached computer. The method will rebuild the cached computer if necessary.
* The live computer will be returned if snapshots are disabled.
*/
- @VisibleForTesting(visibility = Visibility.PACKAGE)
- @NonNull
public Computer snapshotComputer() {
if (Thread.holdsLock(mLock)) {
// If the current thread holds mLock then it may have modified state but not
@@ -1232,15 +1247,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService
ApkChecksums.Injector injector = new ApkChecksums.Injector(
() -> mContext,
() -> handler,
- mInjector::getIncrementalManager,
- () -> mInjector.getLocalService(PackageManagerInternal.class));
+ () -> mInjector.getIncrementalManager(),
+ () -> mPmInternal);
ApkChecksums.getChecksums(filesToChecksum, optional, required, installerPackageName,
trustedCerts, onChecksumsReadyListener, injector);
});
}
- void requestChecksumsInternal(@NonNull Computer snapshot, @NonNull String packageName,
- boolean includeSplits, @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
+ private void requestChecksumsInternal(@NonNull String packageName, boolean includeSplits,
+ @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
@Nullable List trustedInstallers,
@NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId,
@NonNull Executor executor, @NonNull Handler handler) {
@@ -1249,12 +1264,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
Objects.requireNonNull(executor);
Objects.requireNonNull(handler);
- final ApplicationInfo applicationInfo = snapshot.getApplicationInfoInternal(packageName, 0,
+ final ApplicationInfo applicationInfo = getApplicationInfoInternal(packageName, 0,
Binder.getCallingUid(), userId);
if (applicationInfo == null) {
throw new ParcelableException(new PackageManager.NameNotFoundException(packageName));
}
- final InstallSourceInfo installSourceInfo = snapshot.getInstallSourceInfo(packageName);
+ final InstallSourceInfo installSourceInfo =
+ mIPackageManager.getInstallSourceInfo(packageName);
final String installerPackageName =
installSourceInfo != null ? installSourceInfo.getInitiatingPackageName() : null;
@@ -1278,8 +1294,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
ApkChecksums.Injector injector = new ApkChecksums.Injector(
() -> mContext,
() -> handler,
- mInjector::getIncrementalManager,
- () -> mInjector.getLocalService(PackageManagerInternal.class));
+ () -> mInjector.getIncrementalManager(),
+ () -> mPmInternal);
ApkChecksums.getChecksums(filesToChecksum, optional, required, installerPackageName,
trustedCerts, onChecksumsReadyListener, injector);
});
@@ -1424,15 +1440,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService
RuntimePermissionsPersistence.createInstance(),
i.getPermissionManagerServiceInternal(),
domainVerificationService, lock),
- (i, pm) -> AppsFilter.create(i, i.getLocalService(PackageManagerInternal.class)),
+ (i, pm) -> AppsFilter.create(pm.mPmInternal, i),
(i, pm) -> (PlatformCompat) ServiceManager.getService("platform_compat"),
(i, pm) -> SystemConfig.getInstance(),
(i, pm) -> new PackageDexOptimizer(i.getInstaller(), i.getInstallLock(),
i.getContext(), "*dexopt*"),
- (i, pm) -> new DexManager(i.getContext(), i.getPackageDexOptimizer(),
+ (i, pm) -> new DexManager(i.getContext(), pm.mIPackageManager,
+ i.getPackageDexOptimizer(), i.getInstaller(), i.getInstallLock()),
+ (i, pm) -> new ArtManagerService(i.getContext(), pm.mIPackageManager,
i.getInstaller(), i.getInstallLock()),
- (i, pm) -> new ArtManagerService(i.getContext(), i.getInstaller(),
- i.getInstallLock()),
(i, pm) -> ApexManager.getInstance(),
(i, pm) -> new ViewCompiler(i.getInstallLock(), i.getInstaller()),
(i, pm) -> (IncrementalManager)
@@ -1454,7 +1470,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
i.getContext(), pm, i::getScanningPackageParser),
(i, pm, cn) -> new InstantAppResolverConnection(
i.getContext(), cn, Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE),
- (i, pm) -> new ModuleInfoProvider(i.getContext()),
+ (i, pm) -> new ModuleInfoProvider(i.getContext(), pm.mIPackageManager),
(i, pm) -> LegacyPermissionManagerService.create(i.getContext()),
(i, pm) -> domainVerificationService,
(i, pm) -> {
@@ -1482,15 +1498,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final CompatChange.ChangeListener selinuxChangeListener = packageName -> {
synchronized (m.mInstallLock) {
- final Computer snapshot = m.snapshotComputer();
- final PackageStateInternal packageState =
- snapshot.getPackageStateInternal(packageName);
+ final PackageStateInternal packageState = m.getPackageStateInternal(packageName);
if (packageState == null) {
Slog.e(TAG, "Failed to find package setting " + packageName);
return;
}
AndroidPackage pkg = packageState.getPkg();
- SharedUserApi sharedUser = snapshot.getSharedUser(
+ SharedUserApi sharedUser = m.mComputer.getSharedUser(
packageState.getSharedUserAppId());
String oldSeInfo = AndroidPackageUtils.getSeInfo(pkg, packageState);
@@ -1517,12 +1531,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
selinuxChangeListener);
m.installAllowlistedSystemPackages();
- IPackageManagerImpl iPackageManager = m.new IPackageManagerImpl();
- ServiceManager.addService("package", iPackageManager);
+ ServiceManager.addService("package", m.mIPackageManager);
final PackageManagerNative pmn = new PackageManagerNative(m);
ServiceManager.addService("package_native", pmn);
LocalManagerRegistry.addManager(PackageManagerLocal.class, m.new PackageManagerLocalImpl());
- return Pair.create(m, iPackageManager);
+ return Pair.create(m, m.mIPackageManager);
}
/** Install/uninstall system packages for all users based on their user-type, as applicable. */
@@ -1628,6 +1641,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mPackageDexOptimizer = testParams.packageDexOptimizer;
mPackageParserCallback = testParams.packageParserCallback;
mPendingBroadcasts = testParams.pendingPackageBroadcasts;
+ mIPackageManager = new IPackageManagerImpl();
+ mPmInternal = testParams.pmInternal;
mTestUtilityService = testParams.testUtilityService;
mProcessLoggingHandler = testParams.processLoggingHandler;
mProtectedPackages = testParams.protectedPackages;
@@ -1688,6 +1703,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
public PackageManagerService(PackageManagerServiceInjector injector, boolean onlyCore,
boolean factoryTest, final String buildFingerprint, final boolean isEngBuild,
final boolean isUserDebugBuild, final int sdkVersion, final String incrementalVersion) {
+ mIPackageManager = new IPackageManagerImpl();
mIsEngBuild = isEngBuild;
mIsUserDebugBuild = isUserDebugBuild;
mSdkVersion = sdkVersion;
@@ -1718,9 +1734,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService
t.traceBegin("createSubComponents");
// Expose private service for system components to use.
- LocalServices.addService(PackageManagerInternal.class, new PackageManagerInternalImpl());
+ mPmInternal = new PackageManagerInternalImpl();
LocalServices.addService(TestUtilityService.class, this);
mTestUtilityService = LocalServices.getService(TestUtilityService.class);
+ LocalServices.addService(PackageManagerInternal.class, mPmInternal);
mUserManager = injector.getUserManagerService();
mUserNeedsBadging = new UserNeedsBadgingCache(mUserManager);
mComponentResolver = injector.getComponentResolver();
@@ -1738,7 +1755,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override
public boolean hasFeature(String feature) {
- return PackageManagerService.this.hasSystemFeature(feature, 0);
+ return PackageManagerService.this.mIPackageManager.hasSystemFeature(feature, 0);
}
};
@@ -1868,10 +1885,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final int dependencyCount = entry.dependencies.length;
for (int j = 0; j < dependencyCount; j++) {
final SharedLibraryInfo dependency =
- computer.getSharedLibraryInfo(entry.dependencies[j], undefinedVersion);
+ getSharedLibraryInfo(entry.dependencies[j], undefinedVersion);
if (dependency != null) {
- computer.getSharedLibraryInfo(name, undefinedVersion)
- .addDependency(dependency);
+ getSharedLibraryInfo(name, undefinedVersion).addDependency(dependency);
}
}
}
@@ -1883,7 +1899,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
t.traceEnd();
t.traceBegin("read user settings");
- mFirstBoot = !mSettings.readLPw(computer,
+ mFirstBoot = !mSettings.readLPw(mLiveComputer,
mInjector.getUserManagerInternal().getUsers(
/* excludePartial= */ true,
/* excludeDying= */ false,
@@ -1964,26 +1980,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService
// Resolve protected action filters. Only the setup wizard is allowed to
// have a high priority filter for these actions.
mSetupWizardPackage = getSetupWizardPackageNameImpl(computer);
- mComponentResolver.fixProtectedFilterPriorities(mSetupWizardPackage);
-
- mDefaultTextClassifierPackage = ensureSystemPackageName(computer,
- mContext.getString(R.string.config_servicesExtensionPackage));
- mSystemTextClassifierPackageName = ensureSystemPackageName(computer,
- mContext.getString(R.string.config_defaultTextClassifierPackage));
- mConfiguratorPackage = ensureSystemPackageName(computer,
- mContext.getString(R.string.config_deviceConfiguratorPackageName));
- mAppPredictionServicePackage = ensureSystemPackageName(computer,
- getPackageFromComponentString(R.string.config_defaultAppPredictionService));
- mIncidentReportApproverPackage = ensureSystemPackageName(computer,
- mContext.getString(R.string.config_incidentReportApproverPackage));
+ mComponentResolver.fixProtectedFilterPriorities(mPmInternal.getSetupWizardPackageName());
+
+ mDefaultTextClassifierPackage = mIPackageManager.getDefaultTextClassifierPackageName();
+ mSystemTextClassifierPackageName =
+ mIPackageManager.getSystemTextClassifierPackageName();
+ mConfiguratorPackage = getDeviceConfiguratorPackageName();
+ mAppPredictionServicePackage = mIPackageManager.getAppPredictionServicePackageName();
+ mIncidentReportApproverPackage =
+ mIPackageManager.getIncidentReportApproverPackageName();
mRetailDemoPackage = getRetailDemoPackageName();
- mOverlayConfigSignaturePackage = ensureSystemPackageName(computer,
- mInjector.getSystemConfig().getOverlayConfigSignaturePackage());
- mRecentsPackage = ensureSystemPackageName(computer,
- getPackageFromComponentString(R.string.config_recentsComponentName));
- mAmbientContextDetectionPackage = ensureSystemPackageName(computer,
- getPackageFromComponentString(
- R.string.config_defaultAmbientContextDetectionService));
+ mOverlayConfigSignaturePackage = getOverlayConfigSignaturePackageName();
+ mRecentsPackage = getRecentsPackageName();
+ mAmbientContextDetectionPackage = getAmbientContextDetectionPackageName();
// Now that we know all of the shared libraries, update all clients to have
// the correct library paths.
@@ -2117,8 +2126,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mDomainVerificationManager.setProxy(domainVerificationProxy);
- mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr(computer);
- mSharedSystemSharedLibraryPackageName = getRequiredSharedLibrary(computer,
+ mServicesExtensionPackageName = getRequiredServicesExtensionPackageLPr();
+ mSharedSystemSharedLibraryPackageName = getRequiredSharedLibrary(
PackageManager.SYSTEM_SHARED_LIBRARY_SHARED,
SharedLibraryInfo.VERSION_UNDEFINED);
} else {
@@ -2134,11 +2143,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mRequiredPermissionControllerPackage = getRequiredPermissionControllerLPr(computer);
mSettings.setPermissionControllerVersion(
- computer.getPackageInfo(mRequiredPermissionControllerPackage, 0,
+ mIPackageManager.getPackageInfo(mRequiredPermissionControllerPackage, 0,
UserHandle.USER_SYSTEM).getLongVersionCode());
// Resolve the sdk sandbox package
- mRequiredSdkSandboxPackage = getRequiredSdkSandboxPackageName(computer);
+ mRequiredSdkSandboxPackage = getRequiredSdkSandboxPackageName();
// Initialize InstantAppRegistry's Instant App list for all users.
for (AndroidPackage pkg : mPackages.values()) {
@@ -2146,8 +2155,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
continue;
}
for (int userId : userIds) {
- final PackageStateInternal ps =
- computer.getPackageStateInternal(pkg.getPackageName());
+ final PackageStateInternal ps = getPackageStateInternal(pkg.getPackageName());
if (ps == null || !ps.getUserStateOrDefault(userId).isInstantApp()
|| !ps.getUserStateOrDefault(userId).isInstalled()) {
continue;
@@ -2157,7 +2165,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
mInstallerService = mInjector.getPackageInstallerService();
- final ComponentName instantAppResolverComponent = getInstantAppResolver(computer);
+ final ComponentName instantAppResolverComponent = getInstantAppResolver();
if (instantAppResolverComponent != null) {
if (DEBUG_INSTANT) {
Slog.d(TAG, "Set ephemeral resolver: " + instantAppResolverComponent);
@@ -2183,7 +2191,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
// scanning).
final Map<Integer, List<PackageInfo>> userPackages = new HashMap<>();
for (int userId : userIds) {
- userPackages.put(userId, computer.getInstalledPackages(/*flags*/ 0, userId)
+ userPackages.put(userId, mIPackageManager.getInstalledPackages(/*flags*/ 0, userId)
.getList());
}
mDexManager.load(userPackages);
@@ -2194,7 +2202,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
SystemClock.uptimeMillis() - startTime);
}
- // Rebuild the live computer since some attributes have been rebuilt.
+ // Rebild the live computer since some attributes have been rebuilt.
mLiveComputer = createLiveComputer();
} // synchronized (mLock)
@@ -2202,7 +2210,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
// CHECKSTYLE:ON IndentationCheck
mModuleInfoProvider = mInjector.getModuleInfoProvider();
-
mInjector.getSystemWrapper().enablePackageCaches();
// Now after opening every single application zip, make sure they
@@ -2274,9 +2281,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@NonNull
- private String getRequiredSharedLibrary(@NonNull Computer snapshot, @NonNull String name,
- int version) {
- SharedLibraryInfo libraryInfo = snapshot.getSharedLibraryInfo(name, version);
+ private String getRequiredSharedLibrary(@NonNull String name, int version) {
+ SharedLibraryInfo libraryInfo = getSharedLibraryInfo(name, version);
if (libraryInfo == null) {
throw new IllegalStateException("Missing required shared library:" + name);
}
@@ -2288,9 +2294,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@NonNull
- private String getRequiredServicesExtensionPackageLPr(@NonNull Computer computer) {
+ private String getRequiredServicesExtensionPackageLPr() {
String servicesExtensionPackage =
- ensureSystemPackageName(computer,
+ ensureSystemPackageName(
mContext.getString(R.string.config_servicesExtensionPackage));
if (TextUtils.isEmpty(servicesExtensionPackage)) {
throw new RuntimeException(
@@ -2369,7 +2375,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
for (int i = 0; i < N; i++) {
final ResolveInfo cur = matches.get(i);
final String packageName = cur.getComponentInfo().packageName;
- if (checkPermission(
+ if (mIPackageManager.checkPermission(
android.Manifest.permission.INTENT_FILTER_VERIFICATION_AGENT, packageName,
UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) {
continue;
@@ -2399,7 +2405,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
for (int i = 0; i < N; i++) {
final ResolveInfo cur = matches.get(i);
final String packageName = cur.getComponentInfo().packageName;
- if (checkPermission(
+ if (mIPackageManager.checkPermission(
android.Manifest.permission.DOMAIN_VERIFICATION_AGENT, packageName,
UserHandle.USER_SYSTEM) != PackageManager.PERMISSION_GRANTED) {
Slog.w(TAG, "Domain verification agent found but does not hold permission: "
@@ -2408,7 +2414,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
if (best == null || cur.priority > best.priority) {
- if (computer.isComponentEffectivelyEnabled(cur.getComponentInfo(),
+ if (mComputer.isComponentEffectivelyEnabled(cur.getComponentInfo(),
UserHandle.USER_SYSTEM)) {
best = cur;
} else {
@@ -2424,7 +2430,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return null;
}
- @Nullable ComponentName getInstantAppResolver(@NonNull Computer snapshot) {
+ private @Nullable ComponentName getInstantAppResolver() {
final String[] packageArray =
mContext.getResources().getStringArray(R.array.config_ephemeralResolverPackage);
if (packageArray.length == 0 && !Build.IS_DEBUGGABLE) {
@@ -2440,7 +2446,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
| MATCH_DIRECT_BOOT_UNAWARE
| (!Build.IS_DEBUGGABLE ? MATCH_SYSTEM_ONLY : 0);
final Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE);
- List<ResolveInfo> resolvers = snapshot.queryIntentServicesInternal(resolverIntent, null,
+ List<ResolveInfo> resolvers = queryIntentServicesInternal(resolverIntent, null,
resolveFlags, UserHandle.USER_SYSTEM, callingUid, false /*includeInstantApps*/);
final int N = resolvers.size();
if (N == 0) {
@@ -2513,7 +2519,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
Iterator<ResolveInfo> iter = matches.iterator();
while (iter.hasNext()) {
final ResolveInfo rInfo = iter.next();
- if (checkPermission(
+ if (mIPackageManager.checkPermission(
Manifest.permission.INSTALL_PACKAGES,
rInfo.activityInfo.packageName, 0) == PERMISSION_GRANTED || mIsEngBuild) {
continue;
@@ -2544,6 +2550,48 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return matches.get(0).getComponentInfo().getComponentName();
}
+ /**
+ * @see #shouldFilterApplication(PackageStateInternal, int, ComponentName, int, int)
+ */
+ boolean shouldFilterApplication(
+ @Nullable PackageStateInternal ps, int callingUid, int userId) {
+ return mComputer.shouldFilterApplication(
+ ps, callingUid, userId);
+ }
+
+ private @PackageStartability int getPackageStartability(String packageName,
+ int callingUid, int userId) {
+ return mComputer.getPackageStartability(mSafeMode, packageName, callingUid, userId);
+ }
+
+ /**
+ * Returns whether or not a full application can see an instant application.
+ * <p>
+ * Currently, there are four cases in which this can occur:
+ * <ol>
+ * <li>The calling application is a "special" process. Special processes
+ * are those with a UID < {@link Process#FIRST_APPLICATION_UID}.</li>
+ * <li>The calling application has the permission
+ * {@link android.Manifest.permission#ACCESS_INSTANT_APPS}.</li>
+ * <li>The calling application is the default launcher on the
+ * system partition.</li>
+ * <li>The calling application is the default app prediction service.</li>
+ * </ol>
+ */
+ boolean canViewInstantApps(int callingUid, int userId) {
+ return mComputer.canViewInstantApps(callingUid, userId);
+ }
+
+ private PackageInfo generatePackageInfo(@NonNull PackageStateInternal ps,
+ @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+ return mComputer.generatePackageInfo(ps, flags, userId);
+ }
+
+ int getPackageUidInternal(String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, int userId, int callingUid) {
+ return mComputer.getPackageUidInternal(packageName, flags, userId, callingUid);
+ }
+
public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) {
// Because this is accessed via the package manager service AIDL,
// go through the permission manager service AIDL
@@ -2552,6 +2600,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
/**
+ * Important: The provided filterCallingUid is used exclusively to filter out applications
+ * that can be seen based on user state. It's typically the original caller uid prior
+ * to clearing. Because it can only be provided by trusted code, its value can be
+ * trusted and will be used as-is; unlike userId which will be validated by this method.
+ */
+ private ApplicationInfo getApplicationInfoInternal(String packageName,
+ @PackageManager.ApplicationInfoFlagsBits long flags,
+ int filterCallingUid, int userId) {
+ return mComputer.getApplicationInfoInternal(packageName, flags,
+ filterCallingUid, userId);
+ }
+
+ /**
* Blocking call to clear all cached app data above quota.
*/
public void freeAllAppCacheAboveQuota(String volumeUuid) throws IOException {
@@ -2587,7 +2648,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
// 2. Consider preloaded data (after 1w honeymoon, unless aggressive)
if (internalVolume && (aggressive || SystemProperties
.getBoolean("persist.sys.preloads.file_cache_expired", false))) {
- deletePreloadsFileCache();
+ mIPackageManager.deletePreloadsFileCache();
if (file.getUsableSpace() >= bytes) return;
}
@@ -2708,6 +2769,43 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return recommendedInstallLocation;
}
+ /**
+ * Update given flags when being used to request {@link ResolveInfo}.
+ * <p>Instant apps are resolved specially, depending upon context. Minimally,
+ * {@code}flags{@code} must have the {@link PackageManager#MATCH_INSTANT}
+ * flag set. However, this flag is only honoured in three circumstances:
+ * <ul>
+ * <li>when called from a system process</li>
+ * <li>when the caller holds the permission {@code android.permission.ACCESS_INSTANT_APPS}</li>
+ * <li>when resolution occurs to start an activity with a {@code android.intent.action.VIEW}
+ * action and a {@code android.intent.category.BROWSABLE} category</li>
+ * </ul>
+ */
+ long updateFlagsForResolve(long flags, int userId, int callingUid,
+ boolean wantInstantApps, boolean isImplicitImageCaptureIntentAndNotSetByDpc) {
+ return mComputer.updateFlagsForResolve(flags, userId, callingUid,
+ wantInstantApps, isImplicitImageCaptureIntentAndNotSetByDpc);
+ }
+
+ /**
+ * Important: The provided filterCallingUid is used exclusively to filter out activities
+ * that can be seen based on user state. It's typically the original caller uid prior
+ * to clearing. Because it can only be provided by trusted code, its value can be
+ * trusted and will be used as-is; unlike userId which will be validated by this method.
+ */
+ private ActivityInfo getActivityInfoInternal(ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, int filterCallingUid, int userId) {
+ return mComputer.getActivityInfoInternal(component, flags,
+ filterCallingUid, userId);
+ }
+
+ @Nullable
+ List<VersionedPackage> getPackagesUsingSharedLibrary(
+ SharedLibraryInfo libInfo, @PackageManager.PackageInfoFlagsBits long flags,
+ int callingUid, int userId) {
+ return mComputer.getPackagesUsingSharedLibrary(libInfo, flags, callingUid, userId);
+ }
+
public ModuleInfo getModuleInfo(String packageName, @PackageManager.ModuleInfoFlags int flags) {
return mModuleInfoProvider.getModuleInfo(packageName, flags);
}
@@ -2742,7 +2840,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return mRequiredInstallerPackage;
}
- void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
+ private void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
Intent origIntent, String resolvedType, String callingPackage,
@Nullable String callingFeatureId, boolean isRequesterInstantApp,
Bundle verificationBundle, int userId) {
@@ -2754,6 +2852,31 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mHandler.sendMessage(msg);
}
+ /**
+ * From Android R, camera intents have to match system apps. The only exception to this is if
+ * the DPC has set the camera persistent preferred activity. This case was introduced
+ * because it is important that the DPC has the ability to set both system and non-system
+ * camera persistent preferred activities.
+ *
+ * @return {@code true} if the intent is a camera intent and the persistent preferred
+ * activity was not set by the DPC.
+ */
+ @GuardedBy("mLock")
+ boolean isImplicitImageCaptureIntentAndNotSetByDpcLocked(Intent intent, int userId,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags) {
+ return mComputer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
+ resolvedType, flags);
+ }
+
+ @GuardedBy("mLock")
+ ResolveInfo findPersistentPreferredActivityLP(Intent intent,
+ String resolvedType,
+ @PackageManager.ResolveInfoFlagsBits long flags, List<ResolveInfo> query, boolean debug,
+ int userId) {
+ return mComputer.findPersistentPreferredActivityLP(intent,
+ resolvedType, flags, query, debug, userId);
+ }
+
// findPreferredActivityBody returns two items: a "things changed" flag and a
// ResolveInfo, which is the preferred activity itself.
static class FindPreferredActivityBodyResult {
@@ -2761,6 +2884,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService
ResolveInfo mPreferredResolveInfo;
}
+ FindPreferredActivityBodyResult findPreferredActivityInternal(
+ Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+ List<ResolveInfo> query, boolean always,
+ boolean removeMatches, boolean debug, int userId, boolean queryMayBeFiltered) {
+ return mComputer.findPreferredActivityInternal(
+ intent, resolvedType, flags,
+ query, always,
+ removeMatches, debug, userId, queryMayBeFiltered);
+ }
+
+ /**
+ * Returns the package name of the calling Uid if it's an instant app. If it isn't
+ * instant, returns {@code null}.
+ */
+ String getInstantAppPackageName(int callingUid) {
+ return mComputer.getInstantAppPackageName(callingUid);
+ }
+
public @NonNull ParceledListSlice<ResolveInfo> queryIntentReceivers(@NonNull Computer snapshot,
Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
@UserIdInt int userId) {
@@ -2768,6 +2909,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService
snapshot, intent, resolvedType, flags, userId, Binder.getCallingUid()));
}
+ @NonNull List<ResolveInfo> queryIntentServicesInternal(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId,
+ int callingUid, boolean includeInstantApps) {
+ return mComputer.queryIntentServicesInternal(intent,
+ resolvedType, flags, userId, callingUid,
+ includeInstantApps);
+ }
+
+ private boolean isInstantAppInternal(String packageName, @UserIdInt int userId,
+ int callingUid) {
+ return mComputer.isInstantAppInternal(packageName, userId,
+ callingUid);
+ }
+
+ boolean isCallerSameApp(String packageName, int uid) {
+ return mComputer.isCallerSameApp(packageName, uid);
+ }
+
public static void reportSettingsProblem(int priority, String msg) {
logCriticalInfo(priority, msg);
}
@@ -2784,6 +2943,39 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return packageName + STATIC_SHARED_LIB_DELIMITER + libraryVersion;
}
+ /**
+ * Enforces the request is from the system or an app that has INTERACT_ACROSS_USERS
+ * or INTERACT_ACROSS_USERS_FULL permissions, if the {@code userId} is not for the caller.
+ *
+ * @param checkShell whether to prevent shell from access if there's a debugging restriction
+ * @param message the message to log on security exception
+ */
+ void enforceCrossUserPermission(int callingUid, @UserIdInt int userId,
+ boolean requireFullPermission, boolean checkShell, String message) {
+ mComputer.enforceCrossUserPermission(callingUid, userId,
+ requireFullPermission, checkShell, message);
+ }
+
+ /**
+ * Checks if the request is from the system or an app that has the appropriate cross-user
+ * permissions defined as follows:
+ * <ul>
+ * <li>INTERACT_ACROSS_USERS_FULL if {@code requireFullPermission} is true.</li>
+ * <li>INTERACT_ACROSS_USERS if the given {@code userId} is in a different profile group
+ * to the caller.</li>
+ * <li>Otherwise, INTERACT_ACROSS_PROFILES if the given {@code userId} is in the same profile
+ * group as the caller.</li>
+ * </ul>
+ *
+ * @param checkShell whether to prevent shell from access if there's a debugging restriction
+ * @param message the message to log on security exception
+ */
+ private void enforceCrossUserOrProfilePermission(int callingUid, @UserIdInt int userId,
+ boolean requireFullPermission, boolean checkShell, String message) {
+ mComputer.enforceCrossUserOrProfilePermission(callingUid, userId,
+ requireFullPermission, checkShell, message);
+ }
+
public void performFstrimIfNeeded() {
PackageManagerServiceUtils.enforceSystemOrRoot("Only the system can request fstrim");
@@ -2841,6 +3033,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return mDexManager;
}
+ @NonNull
+ List<PackageStateInternal> findSharedNonSystemLibraries(
+ @NonNull PackageStateInternal pkgSetting) {
+ return mComputer.findSharedNonSystemLibraries(pkgSetting);
+ }
+
+ @Nullable
+ SharedLibraryInfo getSharedLibraryInfo(String name, long version) {
+ return mComputer.getSharedLibraryInfo(name, version);
+ }
+
public void shutdown() {
mCompilerStats.writeNow();
mDexManager.writePackageDexUsageNow();
@@ -2938,14 +3141,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mPackageObserverHelper.notifyRemoved(packageName, uid);
}
- void sendPackageAddedForUser(@NonNull Computer snapshot, String packageName,
- @NonNull PackageStateInternal packageState, int userId, int dataLoaderType) {
+ void sendPackageAddedForUser(String packageName, @NonNull PackageStateInternal packageState,
+ int userId, int dataLoaderType) {
final PackageUserStateInternal userState = packageState.getUserStateOrDefault(userId);
final boolean isSystem = packageState.isSystem();
final boolean isInstantApp = userState.isInstantApp();
final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId };
final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY;
- sendPackageAddedForNewUsers(snapshot, packageName, isSystem /*sendBootCompleted*/,
+ sendPackageAddedForNewUsers(packageName, isSystem /*sendBootCompleted*/,
false /*startReceiver*/, packageState.getAppId(), userIds, instantUserIds,
dataLoaderType);
@@ -2957,15 +3160,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
- public void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName,
- boolean sendBootCompleted, boolean includeStopped, @AppIdInt int appId, int[] userIds,
- int[] instantUserIds, int dataLoaderType) {
+ public void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted,
+ boolean includeStopped, @AppIdInt int appId, int[] userIds, int[] instantUserIds,
+ int dataLoaderType) {
if (ArrayUtils.isEmpty(userIds) && ArrayUtils.isEmpty(instantUserIds)) {
return;
}
SparseArray<int[]> broadcastAllowList = mAppsFilter.getVisibilityAllowList(
- snapshot.getPackageStateInternal(packageName, Process.SYSTEM_UID),
- userIds, snapshot.getPackageStates());
+ getPackageStateInternal(packageName, Process.SYSTEM_UID),
+ userIds, getPackageStates());
mHandler.post(() -> mBroadcastHelper.sendPackageAddedForNewUsers(
packageName, appId, userIds, instantUserIds, dataLoaderType, broadcastAllowList));
if (sendBootCompleted && !ArrayUtils.isEmpty(userIds)) {
@@ -2999,8 +3202,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return false;
}
- private void enforceCanSetPackagesSuspendedAsUser(@NonNull Computer snapshot,
- String callingPackage, int callingUid, int userId, String callingMethod) {
+ private void enforceCanSetPackagesSuspendedAsUser(String callingPackage, int callingUid,
+ int userId, String callingMethod) {
if (callingUid == Process.ROOT_UID
// Need to compare app-id to allow system dialogs access on secondary users
|| UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
@@ -3009,7 +3212,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId);
if (ownerPackage != null) {
- final int ownerUid = snapshot.getPackageUid(ownerPackage, 0, userId);
+ final int ownerUid = mIPackageManager.getPackageUid(ownerPackage, 0, userId);
if (ownerUid == callingUid) {
return;
}
@@ -3018,7 +3221,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.SUSPEND_APPS,
callingMethod);
- final int packageUid = snapshot.getPackageUid(callingPackage, 0, userId);
+ final int packageUid = mIPackageManager.getPackageUid(callingPackage, 0, userId);
final boolean allowedPackageUid = packageUid == callingUid;
// TODO(b/139383163): remove special casing for shell and enforce INTERACT_ACROSS_USERS_FULL
final boolean allowedShell = callingUid == SHELL_UID
@@ -3039,9 +3242,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
allPackages, suspendingPackage::equals, userId);
}
- void removeAllDistractingPackageRestrictions(@NonNull Computer snapshot, int userId) {
- final String[] allPackages = snapshot.getAllAvailablePackageNames();
- removeDistractingPackageRestrictions(snapshot, allPackages, userId);
+ private boolean isSuspendingAnyPackages(String suspendingPackage, int userId) {
+ return mComputer.isSuspendingAnyPackages(suspendingPackage, userId);
+ }
+
+ void removeAllDistractingPackageRestrictions(int userId) {
+ final String[] allPackages = mComputer.getAllAvailablePackageNames();
+ removeDistractingPackageRestrictions(allPackages, userId);
}
/**
@@ -3053,12 +3260,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
* @param packagesToChange The packages on which restrictions are to be removed.
* @param userId the user for which changes are taking place.
*/
- void removeDistractingPackageRestrictions(@NonNull Computer snapshot,
- String[] packagesToChange, int userId) {
+ private void removeDistractingPackageRestrictions(String[] packagesToChange, int userId) {
final List<String> changedPackages = new ArrayList<>();
final IntArray changedUids = new IntArray();
for (String packageName : packagesToChange) {
- final PackageStateInternal ps = snapshot.getPackageStateInternal(packageName);
+ final PackageStateInternal ps = getPackageStateInternal(packageName);
if (ps != null && ps.getUserStateOrDefault(userId).getDistractionFlags() != 0) {
changedPackages.add(ps.getPackageName());
changedUids.add(UserHandle.getUid(userId, ps.getAppId()));
@@ -3081,7 +3287,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- void setEnableRollbackCode(int token, int enableRollbackCode) {
+ private void setEnableRollbackCode(int token, int enableRollbackCode) {
final Message msg = mHandler.obtainMessage(ENABLE_ROLLBACK_STATUS);
msg.arg1 = token;
msg.arg2 = enableRollbackCode;
@@ -3128,7 +3334,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
if (DEBUG_BACKUP) {
Slog.i(TAG, "Package " + packageName + " sending normal FIRST_LAUNCH");
}
- final boolean isInstantApp = snapshotComputer().isInstantAppInternal(
+ final boolean isInstantApp = isInstantAppInternal(
packageName, userId, Process.SYSTEM_UID);
final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId };
final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY;
@@ -3178,22 +3384,30 @@ public class PackageManagerService implements PackageSender, TestUtilityService
versionedPackage, observer, userId, deleteFlags, false);
}
- boolean isCallerVerifier(@NonNull Computer snapshot, int callingUid) {
+ private String resolveExternalPackageName(AndroidPackage pkg) {
+ return mComputer.resolveExternalPackageName(pkg);
+ }
+
+ String resolveInternalPackageName(String packageName, long versionCode) {
+ return mComputer.resolveInternalPackageName(packageName, versionCode);
+ }
+
+ boolean isCallerVerifier(int callingUid) {
final int callingUserId = UserHandle.getUserId(callingUid);
- return mRequiredVerifierPackage != null && callingUid == snapshot.getPackageUid(
+ return mRequiredVerifierPackage != null && callingUid == mIPackageManager.getPackageUid(
mRequiredVerifierPackage, 0, callingUserId);
}
- public boolean isPackageDeviceAdminOnAnyUser(@NonNull Computer snapshot, String packageName) {
+ public boolean isPackageDeviceAdminOnAnyUser(String packageName) {
final int callingUid = Binder.getCallingUid();
- if (snapshot.checkUidPermission(android.Manifest.permission.MANAGE_USERS, callingUid)
- != PERMISSION_GRANTED) {
+ if (mIPackageManager.checkUidPermission(android.Manifest.permission.MANAGE_USERS,
+ callingUid) != PERMISSION_GRANTED) {
EventLog.writeEvent(0x534e4554, "128599183", -1, "");
throw new SecurityException(android.Manifest.permission.MANAGE_USERS
+ " permission is required to call this API");
}
- if (snapshot.getInstantAppPackageName(callingUid) != null
- && !snapshot.isCallerSameApp(packageName, callingUid)) {
+ if (getInstantAppPackageName(callingUid) != null
+ && !isCallerSameApp(packageName, callingUid)) {
return false;
}
return isPackageDeviceAdmin(packageName, UserHandle.USER_ALL);
@@ -3242,15 +3456,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return mDevicePolicyManager;
}
- private boolean clearApplicationUserDataLIF(@NonNull Computer snapshot, String packageName,
- int userId) {
+ private boolean clearApplicationUserDataLIF(String packageName, int userId) {
if (packageName == null) {
Slog.w(TAG, "Attempt to delete null packageName.");
return false;
}
// Try finding details about the requested package
- AndroidPackage pkg = snapshot.getPackage(packageName);
+ AndroidPackage pkg = getPackage(packageName);
if (pkg == null) {
Slog.w(TAG, "Package named '" + packageName + "' doesn't exist.");
return false;
@@ -3273,8 +3486,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
} else {
flags = 0;
}
- mAppDataHelper.prepareAppDataContentsLIF(pkg, snapshot.getPackageStateInternal(packageName),
- userId, flags);
+ mAppDataHelper.prepareAppDataContentsLIF(pkg, getPackageStateInternal(packageName), userId,
+ flags);
return true;
}
@@ -3325,6 +3538,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
+ int getUidTargetSdkVersion(int uid) {
+ return mComputer.getUidTargetSdkVersion(uid);
+ }
+
void postPreferredActivityChangedBroadcast(int userId) {
mHandler.post(() -> mBroadcastHelper.sendPreferredActivityChangedBroadcast(userId));
}
@@ -3345,19 +3562,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService
// Persistent preferred activity might have came into effect due to this
// install.
- mPreferredActivityHelper.updateDefaultHomeNotLocked(snapshotComputer(), userId);
+ mPreferredActivityHelper.updateDefaultHomeNotLocked(userId);
}
/**
* Variant that takes a {@link WatchedIntentFilter}
*/
- public void addCrossProfileIntentFilter(@NonNull Computer snapshot,
- WatchedIntentFilter intentFilter, String ownerPackage, int sourceUserId,
- int targetUserId, int flags) {
+ public void addCrossProfileIntentFilter(WatchedIntentFilter intentFilter, String ownerPackage,
+ int sourceUserId, int targetUserId, int flags) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
int callingUid = Binder.getCallingUid();
- enforceOwnerRights(snapshot, ownerPackage, callingUid);
+ enforceOwnerRights(ownerPackage, callingUid);
PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
if (intentFilter.countActions() == 0) {
@@ -3385,18 +3601,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
// Enforcing that callingUid is owning pkg on userId
- private void enforceOwnerRights(@NonNull Computer snapshot, String pkg, int callingUid) {
+ private void enforceOwnerRights(String pkg, int callingUid) {
// The system owns everything.
if (UserHandle.getAppId(callingUid) == Process.SYSTEM_UID) {
return;
}
- final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid);
+ final String[] callerPackageNames = mIPackageManager.getPackagesForUid(callingUid);
if (!ArrayUtils.contains(callerPackageNames, pkg)) {
throw new SecurityException("Calling uid " + callingUid
+ " does not own package " + pkg);
}
final int callingUserId = UserHandle.getUserId(callingUid);
- PackageInfo pi = snapshot.getPackageInfo(pkg, 0, callingUserId);
+ PackageInfo pi = mIPackageManager.getPackageInfo(pkg, 0, callingUserId);
if (pi == null) {
throw new IllegalArgumentException("Unknown package " + pkg + " on user "
+ callingUserId);
@@ -3410,13 +3626,29 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
final UserInfo parent = ums.getProfileParent(userId);
final int launcherUid = (parent != null) ? parent.id : userId;
- // TODO: Should this snapshot be moved further up?
- final ComponentName launcherComponent = snapshotComputer()
- .getDefaultHomeActivity(launcherUid);
+ final ComponentName launcherComponent = getDefaultHomeActivity(launcherUid);
mBroadcastHelper.sendSessionCommitBroadcast(sessionInfo, userId, launcherUid,
launcherComponent, mAppPredictionServicePackage);
}
+ /**
+ * Report the 'Home' activity which is currently set as "always use this one". If non is set
+ * then reports the most likely home activity or null if there are more than one.
+ */
+ private ComponentName getDefaultHomeActivity(int userId) {
+ return mComputer.getDefaultHomeActivity(userId);
+ }
+
+ Intent getHomeIntent() {
+ return mComputer.getHomeIntent();
+ }
+
+ ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
+ int userId) {
+ return mComputer.getHomeActivitiesAsUser(allHomeCandidates,
+ userId);
+ }
+
private @Nullable String getSetupWizardPackageNameImpl(@NonNull Computer computer) {
final Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_SETUP_WIZARD);
@@ -3450,11 +3682,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- @NonNull
- private static String getRequiredSdkSandboxPackageName(@NonNull Computer computer) {
+ private @NonNull String getRequiredSdkSandboxPackageName() {
final Intent intent = new Intent(SdkSandboxManagerLocal.SERVICE_INTERFACE);
- final List<ResolveInfo> matches = computer.queryIntentServicesInternal(
+ final List<ResolveInfo> matches = queryIntentServicesInternal(
intent,
/* resolvedType= */ null,
MATCH_SYSTEM_ONLY | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE,
@@ -3470,6 +3701,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Nullable
+ private String getDeviceConfiguratorPackageName() {
+ return ensureSystemPackageName(mContext.getString(
+ R.string.config_deviceConfiguratorPackageName));
+ }
+
+ public @Nullable String getAmbientContextDetectionPackageName() {
+ return ensureSystemPackageName(getPackageFromComponentString(
+ R.string.config_defaultAmbientContextDetectionService));
+ }
+
+ public String getOverlayConfigSignaturePackageName() {
+ return ensureSystemPackageName(mInjector.getSystemConfig()
+ .getOverlayConfigSignaturePackage());
+ }
+
+ @Nullable
private String getRetailDemoPackageName() {
final String predefinedPkgName = mContext.getString(R.string.config_retailDemoPackage);
final String predefinedSignature = mContext.getString(
@@ -3505,7 +3752,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Nullable
- String getPackageFromComponentString(@StringRes int stringResId) {
+ private String getRecentsPackageName() {
+ return ensureSystemPackageName(
+ getPackageFromComponentString(R.string.config_recentsComponentName));
+
+ }
+
+ @Nullable
+ private String getPackageFromComponentString(@StringRes int stringResId) {
final String componentString = mContext.getString(stringResId);
if (TextUtils.isEmpty(componentString)) {
return null;
@@ -3518,17 +3772,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Nullable
- String ensureSystemPackageName(@NonNull Computer snapshot,
- @Nullable String packageName) {
+ private String ensureSystemPackageName(@Nullable String packageName) {
if (packageName == null) {
return null;
}
final long token = Binder.clearCallingIdentity();
try {
- if (snapshot.getPackageInfo(packageName, MATCH_FACTORY_ONLY,
+ if (mIPackageManager.getPackageInfo(packageName, MATCH_FACTORY_ONLY,
UserHandle.USER_SYSTEM) == null) {
PackageInfo packageInfo =
- snapshot.getPackageInfo(packageName, 0, UserHandle.USER_SYSTEM);
+ mIPackageManager.getPackageInfo(packageName, 0, UserHandle.USER_SYSTEM);
if (packageInfo != null) {
EventLog.writeEvent(0x534e4554, "145981139", packageInfo.applicationInfo.uid,
"");
@@ -3610,10 +3863,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
private void setEnabledSettings(List<ComponentEnabledSetting> settings, int userId,
String callingPackage) {
final int callingUid = Binder.getCallingUid();
- // TODO: This method is not properly snapshotified beyond this call
- final Computer preLockSnapshot = snapshotComputer();
- preLockSnapshot.enforceCrossUserPermission(callingUid, userId,
- false /* requireFullPermission */, true /* checkShell */, "set enabled");
+ enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */,
+ true /* checkShell */, "set enabled");
final int targetSize = settings.size();
for (int i = 0; i < targetSize; i++) {
@@ -3669,7 +3920,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final Map<String, PackageSetting> pkgSettings = new ArrayMap<>(targetSize);
// reader
synchronized (mLock) {
- final Computer snapshot = snapshotComputer();
// Checks for target packages
for (int i = 0; i < targetSize; i++) {
final ComponentEnabledSetting setting = settings.get(i);
@@ -3679,13 +3929,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
continue;
}
final boolean isCallerTargetApp = ArrayUtils.contains(
- snapshot.getPackagesForUid(callingUid), packageName);
+ mIPackageManager.getPackagesForUid(callingUid), packageName);
final PackageSetting pkgSetting = mSettings.getPackageLPr(packageName);
// Limit who can change which apps
if (!isCallerTargetApp) {
// Don't allow apps that don't have permission to modify other apps
if (!allowedByPermission
- || snapshot.shouldFilterApplication(pkgSetting, callingUid, userId)) {
+ || shouldFilterApplication(pkgSetting, callingUid, userId)) {
throw new SecurityException("Attempt to change component state; "
+ "pid=" + Binder.getCallingPid()
+ ", uid=" + callingUid
@@ -3858,13 +4108,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final long callingId = Binder.clearCallingIdentity();
try {
- final Computer newSnapshot = snapshotComputer();
for (int i = 0; i < sendNowBroadcasts.size(); i++) {
final String packageName = sendNowBroadcasts.keyAt(i);
final ArrayList<String> components = sendNowBroadcasts.valueAt(i);
final int packageUid = UserHandle.getUid(
userId, pkgSettings.get(packageName).getAppId());
- sendPackageChangedBroadcast(newSnapshot, packageName, false /* dontKillApp */,
+ sendPackageChangedBroadcast(packageName, false /* dontKillApp */,
components, packageUid, null /* reason */);
}
} finally {
@@ -3888,13 +4137,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
pkgSetting.setEnabled(newState, userId, callingPackage);
if ((newState == COMPONENT_ENABLED_STATE_DISABLED_USER
|| newState == COMPONENT_ENABLED_STATE_DISABLED)
- && checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId)
- == PERMISSION_GRANTED) {
+ && mIPackageManager.checkPermission(Manifest.permission.SUSPEND_APPS,
+ packageName, userId) == PERMISSION_GRANTED) {
// This app should not generally be allowed to get disabled by the UI, but
// if it ever does, we don't want to end up with some of the user's apps
// permanently suspended.
unsuspendForSuspendingPackage(computer, packageName, userId);
- removeAllDistractingPackageRestrictions(computer, userId);
+ removeAllDistractingPackageRestrictions(userId);
}
success = true;
} else {
@@ -3945,20 +4194,25 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- void sendPackageChangedBroadcast(@NonNull Computer snapshot, String packageName,
+ void sendPackageChangedBroadcast(String packageName,
boolean dontKillApp, ArrayList<String> componentNames, int packageUid, String reason) {
final int userId = UserHandle.getUserId(packageUid);
- final boolean isInstantApp =
- snapshot.isInstantAppInternal(packageName, userId, Process.SYSTEM_UID);
+ final boolean isInstantApp = isInstantAppInternal(packageName, userId, Process.SYSTEM_UID);
final int[] userIds = isInstantApp ? EMPTY_INT_ARRAY : new int[] { userId };
final int[] instantUserIds = isInstantApp ? new int[] { userId } : EMPTY_INT_ARRAY;
- final SparseArray<int[]> broadcastAllowList = snapshot.getBroadcastAllowList(
+ final SparseArray<int[]> broadcastAllowList = getBroadcastAllowList(
packageName, userIds, isInstantApp);
mHandler.post(() -> mBroadcastHelper.sendPackageChangedBroadcast(
packageName, dontKillApp, componentNames, packageUid, reason, userIds,
instantUserIds, broadcastAllowList));
}
+ @Nullable
+ private SparseArray<int[]> getBroadcastAllowList(@NonNull String packageName,
+ @UserIdInt int[] userIds, boolean isInstantApp) {
+ return mComputer.getBroadcastAllowList(packageName, userIds, isInstantApp);
+ }
+
/**
* Used by SystemServer
*/
@@ -4042,7 +4296,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
// Now that we're mostly running, clean up stale users and apps
mUserManager.reconcileUsers(StorageManager.UUID_PRIVATE_INTERNAL);
- storageEventHelper.reconcileApps(snapshotComputer(), StorageManager.UUID_PRIVATE_INTERNAL);
+ storageEventHelper.reconcileApps(StorageManager.UUID_PRIVATE_INTERNAL);
mPermissionManager.onSystemReady();
@@ -4054,7 +4308,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final int livingUserCount = livingUsers.size();
for (int i = 0; i < livingUserCount; i++) {
final int userId = livingUsers.get(i).id;
- if (mSettings.isPermissionUpgradeNeeded(userId)) {
+ if (mPmInternal.isPermissionUpgradeNeeded(userId)) {
grantPermissionsUserIds = ArrayUtils.appendInt(
grantPermissionsUserIds, userId);
}
@@ -4096,12 +4350,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
if (packageName == null) {
return;
}
- final Computer snapshot = snapshotComputer();
- AndroidPackage pkg = snapshot.getPackage(packageName);
+ AndroidPackage pkg = mPackages.get(packageName);
if (pkg == null) {
return;
}
- sendPackageChangedBroadcast(snapshot, pkg.getPackageName(),
+ sendPackageChangedBroadcast(pkg.getPackageName(),
true /* dontKillApp */,
new ArrayList<>(Collections.singletonList(pkg.getPackageName())),
pkg.getUid(),
@@ -4154,6 +4407,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mSnapshotStatistics.dump(pw, " ", now, hits, -1, isBrief);
}
+ /**
+ * Dump package manager states to the file according to a given dumping type of
+ * {@link DumpState}.
+ */
+ void dumpComputer(int type, FileDescriptor fd, PrintWriter pw, DumpState dumpState) {
+ mComputer.dump(type, fd, pw, dumpState);
+ }
+
//TODO: b/111402650
private void disableSkuSpecificApps() {
String[] apkList = mContext.getResources().getStringArray(
@@ -4167,11 +4428,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService
if (!TextUtils.isEmpty(sku) && ArrayUtils.contains(skuArray, sku)) {
return;
}
- final Computer snapshot = snapshotComputer();
for (String packageName : apkList) {
- setSystemAppHiddenUntilInstalled(snapshot, packageName, true);
+ mIPackageManager.setSystemAppHiddenUntilInstalled(packageName, true);
for (UserInfo user : mInjector.getUserManagerInternal().getUsers(false)) {
- setSystemAppInstallState(snapshot, packageName, false, user.id);
+ mIPackageManager.setSystemAppInstallState(packageName, false, user.id);
}
}
}
@@ -4264,7 +4524,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mPermissionManager.writeLegacyPermissionStateTEMP();
mSettings.readPermissionStateForUserSyncLPr(userId);
mPermissionManager.readLegacyPermissionStateTEMP();
- return mSettings.isPermissionUpgradeNeeded(userId);
+ return mPmInternal.isPermissionUpgradeNeeded(userId);
}
}
@@ -4284,8 +4544,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- private void deletePackageIfUnused(@NonNull Computer snapshot, final String packageName) {
- PackageStateInternal ps = snapshot.getPackageStateInternal(packageName);
+ boolean userNeedsBadging(int userId) {
+ return mUserNeedsBadging.get(userId);
+ }
+
+ private void deletePackageIfUnused(final String packageName) {
+ PackageStateInternal ps = getPackageStateInternal(packageName);
if (ps == null) {
return;
}
@@ -4303,101 +4567,41 @@ public class PackageManagerService implements PackageSender, TestUtilityService
0, PackageManager.DELETE_ALL_USERS, true /*removedBySystem*/));
}
- void deletePreloadsFileCache() {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CLEAR_APP_CACHE,
- "deletePreloadsFileCache");
- File dir = Environment.getDataPreloadsFileCacheDirectory();
- Slog.i(PackageManagerService.TAG, "Deleting preloaded file cache " + dir);
- FileUtils.deleteContents(dir);
+ private AndroidPackage getPackage(String packageName) {
+ return mComputer.getPackage(packageName);
}
- void setSystemAppHiddenUntilInstalled(@NonNull Computer snapshot, String packageName,
- boolean hidden) {
- final int callingUid = Binder.getCallingUid();
- final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID
- || callingUid == Process.SYSTEM_UID;
- if (!calledFromSystemOrPhone) {
- mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
- "setSystemAppHiddenUntilInstalled");
- }
-
- final PackageStateInternal stateRead = snapshot.getPackageStateInternal(packageName);
- if (stateRead == null || !stateRead.isSystem() || stateRead.getPkg() == null) {
- return;
- }
- if (stateRead.getPkg().isCoreApp() && !calledFromSystemOrPhone) {
- throw new SecurityException("Only system or phone callers can modify core apps");
- }
-
- commitPackageStateMutation(null, mutator -> {
- mutator.forPackage(packageName)
- .setHiddenUntilInstalled(hidden);
- mutator.forDisabledSystemPackage(packageName)
- .setHiddenUntilInstalled(hidden);
- });
+ private AndroidPackage getPackage(int uid) {
+ return mComputer.getPackage(uid);
}
- boolean setSystemAppInstallState(@NonNull Computer snapshot, String packageName,
- boolean installed, int userId) {
- final int callingUid = Binder.getCallingUid();
- final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID
- || callingUid == Process.SYSTEM_UID;
- if (!calledFromSystemOrPhone) {
- mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
- "setSystemAppHiddenUntilInstalled");
- }
+ private SigningDetails getSigningDetails(@NonNull String packageName) {
+ return mComputer.getSigningDetails(packageName);
+ }
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
- // The target app should always be in system
- if (packageState == null || !packageState.isSystem() || packageState.getPkg() == null) {
- return false;
- }
- if (packageState.getPkg().isCoreApp() && !calledFromSystemOrPhone) {
- throw new SecurityException("Only system or phone callers can modify core apps");
- }
- // Check if the install state is the same
- if (packageState.getUserStateOrDefault(userId).isInstalled() == installed) {
- return false;
- }
+ private SigningDetails getSigningDetails(int uid) {
+ return mComputer.getSigningDetails(uid);
+ }
- final long callingId = Binder.clearCallingIdentity();
- try {
- if (installed) {
- // install the app from uninstalled state
- mInstallPackageHelper.installExistingPackageAsUser(
- packageName,
- userId,
- PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
- PackageManager.INSTALL_REASON_DEVICE_SETUP,
- null,
- null);
- return true;
- }
+ private boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
+ return mComputer.filterAppAccess(pkg, callingUid, userId);
+ }
- // uninstall the app from installed state
- deletePackageVersioned(
- new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST),
- new PackageManager.LegacyPackageDeleteObserver(null).getBinder(),
- userId,
- PackageManager.DELETE_SYSTEM_APP);
- return true;
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
+ private boolean filterAppAccess(String packageName, int callingUid, int userId) {
+ return mComputer.filterAppAccess(packageName, callingUid, userId);
}
- void finishPackageInstall(int token, boolean didLaunch) {
- PackageManagerServiceUtils.enforceSystemOrRoot(
- "Only the system is allowed to finish installs");
+ private boolean filterAppAccess(int uid, int callingUid) {
+ return mComputer.filterAppAccess(uid, callingUid);
+ }
- if (PackageManagerService.DEBUG_INSTALL) {
- Slog.v(PackageManagerService.TAG, "BM finishing package install for " + token);
- }
- Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
+ @Nullable
+ private int[] getVisibilityAllowList(@NonNull String packageName, @UserIdInt int userId) {
+ return mComputer.getVisibilityAllowList(packageName, userId);
+ }
- final Message msg = mHandler.obtainMessage(PackageManagerService.POST_INSTALL, token,
- didLaunch ? 1 : 0);
- mHandler.sendMessage(msg);
+ boolean canQueryPackage(int callingUid, @Nullable String targetPackageName) {
+ return mComputer.canQueryPackage(callingUid, targetPackageName);
}
void checkPackageStartable(@NonNull Computer snapshot, @NonNull String packageName,
@@ -4485,15 +4689,71 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- public class IPackageManagerImpl extends IPackageManagerBase {
+ public class IPackageManagerImpl extends IPackageManager.Stub {
- public IPackageManagerImpl() {
- super(PackageManagerService.this, mContext, mDexOptHelper, mModuleInfoProvider,
- mPreferredActivityHelper, mResolveIntentHelper, mDomainVerificationManager,
- mDomainVerificationConnection, mInstallerService, mPackageProperty,
- mResolveComponentName, mInstantAppResolverSettingsComponent,
- mRequiredSdkSandboxPackage, mServicesExtensionPackageName,
- mSharedSystemSharedLibraryPackageName);
+ @Override
+ public boolean activitySupportsIntent(ComponentName component, Intent intent,
+ String resolvedType) {
+ return mComputer.activitySupportsIntent(mResolveComponentName, component, intent,
+ resolvedType);
+ }
+
+ @Override
+ public void addCrossProfileIntentFilter(IntentFilter intentFilter, String ownerPackage,
+ int sourceUserId, int targetUserId, int flags) {
+ PackageManagerService.this.addCrossProfileIntentFilter(
+ new WatchedIntentFilter(intentFilter), ownerPackage, sourceUserId, targetUserId,
+ flags);
+ }
+
+ // NOTE: Can't remove due to unsupported app usage
+ @Override
+ public boolean addPermission(PermissionInfo info) {
+ // Because this is accessed via the package manager service AIDL,
+ // go through the permission manager service AIDL
+ return mContext.getSystemService(PermissionManager.class).addPermission(info, false);
+ }
+
+ // NOTE: Can't remove due to unsupported app usage
+ @Override
+ public boolean addPermissionAsync(PermissionInfo info) {
+ // Because this is accessed via the package manager service AIDL,
+ // go through the permission manager service AIDL
+ return mContext.getSystemService(PermissionManager.class).addPermission(info, true);
+ }
+
+ @Override
+ public void addPersistentPreferredActivity(IntentFilter filter, ComponentName activity,
+ int userId) {
+ mPreferredActivityHelper.addPersistentPreferredActivity(new WatchedIntentFilter(filter),
+ activity, userId);
+ }
+
+ @Override
+ public void addPreferredActivity(IntentFilter filter, int match,
+ ComponentName[] set, ComponentName activity, int userId, boolean removeExisting) {
+ mPreferredActivityHelper.addPreferredActivity(new WatchedIntentFilter(filter), match,
+ set, activity, true, userId, "Adding preferred", removeExisting);
+ }
+
+ /*
+ * Returns if intent can be forwarded from the sourceUserId to the targetUserId
+ */
+ @Override
+ public boolean canForwardTo(@NonNull Intent intent, @Nullable String resolvedType,
+ @UserIdInt int sourceUserId, @UserIdInt int targetUserId) {
+ return mComputer.canForwardTo(intent, resolvedType, sourceUserId, targetUserId);
+ }
+
+ @Override
+ public boolean canRequestPackageInstalls(String packageName, int userId) {
+ return mComputer.canRequestPackageInstalls(packageName, Binder.getCallingUid(), userId,
+ true /* throwIfPermNotDeclared*/);
+ }
+
+ @Override
+ public String[] canonicalToCurrentPackageNames(String[] names) {
+ return mComputer.canonicalToCurrentPackageNames(names);
}
@Override
@@ -4502,13 +4762,33 @@ public class PackageManagerService implements PackageSender, TestUtilityService
.checkPackageStartable(snapshotComputer(), packageName, userId);
}
+ // NOTE: Can't remove due to unsupported app usage
+ @Override
+ public int checkPermission(String permName, String pkgName, int userId) {
+ return PackageManagerService.this.checkPermission(permName, pkgName, userId);
+ }
+
+ @Override
+ public int checkSignatures(@NonNull String pkg1, @NonNull String pkg2) {
+ return mComputer.checkSignatures(pkg1, pkg2);
+ }
+
+ @Override
+ public int checkUidPermission(String permName, int uid) {
+ return mComputer.checkUidPermission(permName, uid);
+ }
+
+ @Override
+ public int checkUidSignatures(int uid1, int uid2) {
+ return mComputer.checkUidSignatures(uid1, uid2);
+ }
+
@Override
public void clearApplicationProfileData(String packageName) {
PackageManagerServiceUtils.enforceSystemOrRoot(
"Only the system can clear all profile data");
- final Computer snapshot = snapshotComputer();
- final AndroidPackage pkg = snapshot.getPackage(packageName);
+ final AndroidPackage pkg = getPackage(packageName);
try (PackageFreezer ignored = freezePackage(packageName, "clearApplicationProfileData")) {
synchronized (mInstallLock) {
mAppDataHelper.clearAppProfilesLIF(pkg);
@@ -4523,11 +4803,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService
android.Manifest.permission.CLEAR_APP_USER_DATA, null);
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshotComputer();
- snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
+ enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
false /* checkShell */, "clear application data");
- if (snapshot.getPackageStateFiltered(packageName, callingUid, userId) == null) {
+ if (mComputer.getPackageStateFiltered(packageName, callingUid, userId) == null) {
if (observer != null) {
mHandler.post(() -> {
try {
@@ -4552,8 +4831,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
try (PackageFreezer freezer = freezePackage(packageName,
"clearApplicationUserData")) {
synchronized (mInstallLock) {
- succeeded = clearApplicationUserDataLIF(snapshotComputer(), packageName,
- userId);
+ succeeded = clearApplicationUserDataLIF(packageName, userId);
}
mInstantAppRegistry.deleteInstantApplicationMetadata(packageName, userId);
synchronized (mLock) {
@@ -4571,9 +4849,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
if (checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId)
== PERMISSION_GRANTED) {
- final Computer snapshot = snapshotComputer();
- unsuspendForSuspendingPackage(snapshot, packageName, userId);
- removeAllDistractingPackageRestrictions(snapshot, userId);
+ unsuspendForSuspendingPackage(snapshotComputer(), packageName, userId);
+ removeAllDistractingPackageRestrictions(userId);
flushPackageRestrictionsAsUserInternalLocked(userId);
}
}
@@ -4593,8 +4870,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERACT_ACROSS_USERS_FULL, null);
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshotComputer();
- enforceOwnerRights(snapshot, ownerPackage, callingUid);
+ enforceOwnerRights(ownerPackage, callingUid);
PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
synchronized (mLock) {
@@ -4612,7 +4888,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
- public final void deleteApplicationCacheFiles(final String packageName,
+ public void clearPackagePersistentPreferredActivities(String packageName, int userId) {
+ mPreferredActivityHelper.clearPackagePersistentPreferredActivities(packageName, userId);
+ }
+
+ @Override
+ public void clearPackagePreferredActivities(String packageName) {
+ mPreferredActivityHelper.clearPackagePreferredActivities(packageName);
+ }
+
+ @Override
+ public String[] currentToCanonicalPackageNames(String[] names) {
+ return mComputer.currentToCanonicalPackageNames(names);
+ }
+
+ @Override
+ public void deleteApplicationCacheFiles(final String packageName,
final IPackageDataObserver observer) {
final int userId = UserHandle.getCallingUserId();
deleteApplicationCacheFilesAsUser(packageName, userId, observer);
@@ -4637,18 +4928,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.INTERNAL_DELETE_CACHE_FILES, null);
}
- final Computer snapshot = snapshotComputer();
- snapshot.enforceCrossUserPermission(callingUid, userId, /* requireFullPermission= */ true,
+ enforceCrossUserPermission(callingUid, userId, /* requireFullPermission= */ true,
/* checkShell= */ false, "delete application cache files");
final int hasAccessInstantApps = mContext.checkCallingOrSelfPermission(
android.Manifest.permission.ACCESS_INSTANT_APPS);
+ final AndroidPackage pkg = getPackage(packageName);
+
// Queue up an async operation since the package deletion may take a little while.
mHandler.post(() -> {
- // Snapshot in the Handler Runnable since this may be deferred quite a bit
- // TODO: Is this and the later mInstallLock re-snapshot necessary?
- final Computer newSnapshot = snapshotComputer();
- final PackageStateInternal ps = newSnapshot.getPackageStateInternal(packageName);
+ final PackageStateInternal ps =
+ pkg == null ? null : getPackageStateInternal(pkg.getPackageName());
boolean doClearData = true;
if (ps != null) {
final boolean targetIsInstantApp =
@@ -4659,8 +4949,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService
if (doClearData) {
synchronized (mInstallLock) {
final int flags = FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL;
- // Snapshot again after mInstallLock?
- final AndroidPackage pkg = snapshotComputer().getPackage(packageName);
// We're only clearing cache files, so we don't care if the
// app is unfrozen and still able to run
mAppDataHelper.clearAppDataLIF(pkg, userId,
@@ -4680,18 +4968,47 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public void deleteExistingPackageAsUser(VersionedPackage versionedPackage,
+ final IPackageDeleteObserver2 observer, final int userId) {
+ PackageManagerService.this.deleteExistingPackageAsUser(versionedPackage, observer,
+ userId);
+ }
+
+ @Override
+ public void deletePackageAsUser(String packageName, int versionCode,
+ IPackageDeleteObserver observer, int userId, int flags) {
+ deletePackageVersioned(new VersionedPackage(packageName, versionCode),
+ new PackageManager.LegacyPackageDeleteObserver(observer).getBinder(), userId, flags);
+ }
+
+ @Override
+ public void deletePackageVersioned(VersionedPackage versionedPackage,
+ final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
+ PackageManagerService.this.deletePackageVersioned(versionedPackage, observer,
+ userId, deleteFlags);
+ }
+
+ @Override
+ public void deletePreloadsFileCache() {
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CLEAR_APP_CACHE,
+ "deletePreloadsFileCache");
+ File dir = Environment.getDataPreloadsFileCacheDirectory();
+ Slog.i(PackageManagerService.TAG, "Deleting preloaded file cache " + dir);
+ FileUtils.deleteContents(dir);
+ }
+
+ @Override
public void dumpProfiles(String packageName) {
/* Only the shell, root, or the app user should be able to dump profiles. */
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshotComputer();
- final String[] callerPackageNames = snapshot.getPackagesForUid(callingUid);
+ final String[] callerPackageNames = getPackagesForUid(callingUid);
if (callingUid != Process.SHELL_UID
&& callingUid != Process.ROOT_UID
&& !ArrayUtils.contains(callerPackageNames, packageName)) {
throw new SecurityException("dumpProfiles");
}
- AndroidPackage pkg = snapshot.getPackage(packageName);
+ AndroidPackage pkg = mComputer.getPackage(packageName);
if (pkg == null) {
throw new IllegalArgumentException("Unknown package: " + packageName);
}
@@ -4745,25 +5062,46 @@ public class PackageManagerService implements PackageSender, TestUtilityService
});
}
+ @Override
+ public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) {
+ return mPreferredActivityHelper.findPersistentPreferredActivity(intent, userId);
+ }
+
+ @Override
+ public void finishPackageInstall(int token, boolean didLaunch) {
+ PackageManagerServiceUtils.enforceSystemOrRoot(
+ "Only the system is allowed to finish installs");
+
+ if (PackageManagerService.DEBUG_INSTALL) {
+ Slog.v(PackageManagerService.TAG, "BM finishing package install for " + token);
+ }
+ Trace.asyncTraceEnd(TRACE_TAG_PACKAGE_MANAGER, "restore", token);
+
+ final Message msg = mHandler.obtainMessage(PackageManagerService.POST_INSTALL, token, didLaunch ? 1 : 0);
+ mHandler.sendMessage(msg);
+ }
+
@WorkerThread
@Override
public void flushPackageRestrictionsAsUser(int userId) {
- final Computer snapshot = snapshotComputer();
- final int callingUid = Binder.getCallingUid();
- if (snapshot.getInstantAppPackageName(callingUid) != null) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return;
}
if (!mUserManager.exists(userId)) {
return;
}
- snapshot.enforceCrossUserPermission(callingUid, userId,
- false /* requireFullPermission*/, false /* checkShell */,
- "flushPackageRestrictions");
+ enforceCrossUserPermission(Binder.getCallingUid(), userId, false /* requireFullPermission*/,
+ false /* checkShell */, "flushPackageRestrictions");
synchronized (mLock) {
flushPackageRestrictionsAsUserInternalLocked(userId);
}
}
+ @Override
+ public void forceDexOpt(String packageName) {
+ mDexOptHelper.forceDexOpt(packageName);
+ }
+
@Override
public void freeStorage(final String volumeUuid, final long freeStorageSize,
@@ -4812,17 +5150,83 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public ActivityInfo getActivityInfo(ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
+ return mComputer.getActivityInfo(component, flags, userId);
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName) {
+ return mComputer.getAllIntentFilters(packageName);
+ }
+
+ @Override
+ public List<String> getAllPackages() {
+ return mComputer.getAllPackages();
+ }
+
+ // NOTE: Can't remove due to unsupported app usage
+ @NonNull
+ @Override
+ public String[] getAppOpPermissionPackages(@NonNull String permissionName) {
+ return mComputer.getAppOpPermissionPackages(permissionName);
+ }
+
+ @Override
+ public String getAppPredictionServicePackageName() {
+ return ensureSystemPackageName(
+ getPackageFromComponentString(R.string.config_defaultAppPredictionService));
+ }
+
+ @PackageManager.EnabledState
+ @Override
+ public int getApplicationEnabledSetting(@NonNull String packageName, @UserIdInt int userId) {
+ return mComputer.getApplicationEnabledSetting(packageName, userId);
+ }
+
+ /**
+ * Returns true if application is not found or there was an error. Otherwise it returns
+ * the hidden state of the package for the given user.
+ */
+ @Override
+ public boolean getApplicationHiddenSettingAsUser(@NonNull String packageName,
+ @UserIdInt int userId) {
+ return mComputer.getApplicationHiddenSettingAsUser(packageName, userId);
+ }
+
+ @Override
+ public ApplicationInfo getApplicationInfo(String packageName,
+ @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
+ return mComputer.getApplicationInfo(packageName, flags, userId);
+ }
+
+ @Override
+ public IArtManager getArtManager() {
+ return mArtManagerService;
+ }
+
+ @Override
+ public @Nullable String getAttentionServicePackageName() {
+ return ensureSystemPackageName(
+ getPackageFromComponentString(R.string.config_defaultAttentionService));
+ }
+
+ @Override
+ public boolean getBlockUninstallForUser(@NonNull String packageName, @UserIdInt int userId) {
+ return mComputer.getBlockUninstallForUser(packageName, userId);
+ }
+
+ @Override
public ChangedPackages getChangedPackages(int sequenceNumber, int userId) {
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshotComputer();
- if (snapshot.getInstantAppPackageName(callingUid) != null) {
+ if (getInstantAppPackageName(callingUid) != null) {
return null;
}
if (!mUserManager.exists(userId)) {
return null;
}
- snapshot.enforceCrossUserPermission(callingUid, userId, false, false,
- "getChangedPackages");
+ enforceCrossUserPermission(callingUid, userId, false, false, "getChangedPackages");
final ChangedPackages changedPackages = mChangedPackagesTracker.getChangedPackages(
sequenceNumber, userId);
@@ -4830,9 +5234,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final List<String> packageNames = changedPackages.getPackageNames();
for (int index = packageNames.size() - 1; index >= 0; index--) {
// Filter out the changes if the calling package should not be able to see it.
- final PackageStateInternal packageState =
- snapshot.getPackageStateInternal(packageNames.get(index));
- if (snapshot.shouldFilterApplication(packageState, callingUid, userId)) {
+ final PackageSetting ps = mSettings.getPackageLPr(packageNames.get(index));
+ if (shouldFilterApplication(ps, callingUid, userId)) {
packageNames.remove(index);
}
}
@@ -4842,6 +5245,41 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public int getComponentEnabledSetting(@NonNull ComponentName component, int userId) {
+ return mComputer.getComponentEnabledSetting(component, Binder.getCallingUid(), userId);
+ }
+
+ @Override
+ public String getContentCaptureServicePackageName() {
+ return ensureSystemPackageName(
+ getPackageFromComponentString(R.string.config_defaultContentCaptureService));
+ }
+
+ @Nullable
+ @Override
+ public ParceledListSlice<SharedLibraryInfo> getDeclaredSharedLibraries(
+ @NonNull String packageName, @PackageManager.PackageInfoFlagsBits long flags,
+ @NonNull int userId) {
+ return mComputer.getDeclaredSharedLibraries(packageName, flags, userId);
+ }
+
+ /**
+ * Non-Binder method, support for the backup/restore mechanism: write the
+ * default browser (etc) settings in its canonical XML format. Returns the default
+ * browser XML representation as a byte array, or null if there is none.
+ */
+ @Override
+ public byte[] getDefaultAppsBackup(int userId) {
+ return mPreferredActivityHelper.getDefaultAppsBackup(userId);
+ }
+
+ @Override
+ public String getDefaultTextClassifierPackageName() {
+ return ensureSystemPackageName(
+ mContext.getString(R.string.config_servicesExtensionPackage));
+ }
+
+ @Override
public byte[] getDomainVerificationBackup(int userId) {
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
throw new SecurityException("Only the system may call getDomainVerificationBackup()");
@@ -4863,6 +5301,17 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public int getFlagsForUid(int uid) {
+ return mComputer.getFlagsForUid(uid);
+ }
+
+ @Nullable
+ @Override
+ public CharSequence getHarmfulAppWarning(@NonNull String packageName, @UserIdInt int userId) {
+ return mComputer.getHarmfulAppWarning(packageName, userId);
+ }
+
+ @Override
public IBinder getHoldLockToken() {
if (!Build.IS_DEBUGGABLE) {
throw new SecurityException("getHoldLockToken requires a debuggable build");
@@ -4878,15 +5327,72 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
+ return getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getCallingUserId());
+ }
+
+ public String getIncidentReportApproverPackageName() {
+ return ensureSystemPackageName(mContext.getString(
+ R.string.config_incidentReportApproverPackage));
+ }
+
+ @Override
+ public int getInstallLocation() {
+ // allow instant app access
+ return android.provider.Settings.Global.getInt(mContext.getContentResolver(),
+ android.provider.Settings.Global.DEFAULT_INSTALL_LOCATION,
+ InstallLocationUtils.APP_INSTALL_AUTO);
+ }
+
+ @PackageManager.InstallReason
+ @Override
+ public int getInstallReason(@NonNull String packageName, @UserIdInt int userId) {
+ return mComputer.getInstallReason(packageName, userId);
+ }
+
+ @Override
+ @Nullable
+ public InstallSourceInfo getInstallSourceInfo(@NonNull String packageName) {
+ return mComputer.getInstallSourceInfo(packageName);
+ }
+
+ @Override
+ public ParceledListSlice<ApplicationInfo> getInstalledApplications(
+ @PackageManager.ApplicationInfoFlagsBits long flags, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ return new ParceledListSlice<>(
+ mComputer.getInstalledApplications(flags, userId, callingUid));
+ }
+
+ @Override
+ public List<ModuleInfo> getInstalledModules(int flags) {
+ return mModuleInfoProvider.getInstalledModules(flags);
+ }
+
+ @Override
+ public ParceledListSlice<PackageInfo> getInstalledPackages(
+ @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+ return mComputer.getInstalledPackages(flags, userId);
+ }
+
+ @Nullable
+ @Override
+ public String getInstallerPackageName(@NonNull String packageName) {
+ return mComputer.getInstallerPackageName(packageName);
+ }
+
+ @Override
public String getInstantAppAndroidId(String packageName, int userId) {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.ACCESS_INSTANT_APPS, "getInstantAppAndroidId");
- final Computer snapshot = snapshotComputer();
- snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_INSTANT_APPS,
+ "getInstantAppAndroidId");
+ enforceCrossUserPermission(Binder.getCallingUid(), userId,
true /* requireFullPermission */, false /* checkShell */,
"getInstantAppAndroidId");
// Make sure the target is an Instant App.
- if (!snapshot.isInstantApp(packageName, userId)) {
+ if (!isInstantApp(packageName, userId)) {
return null;
}
return mInstantAppRegistry.getInstantAppAndroidId(packageName, userId);
@@ -4898,14 +5404,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return null;
}
- final Computer snapshot = snapshotComputer();
- snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ enforceCrossUserPermission(Binder.getCallingUid(), userId,
true /* requireFullPermission */, false /* checkShell */,
"getInstantAppCookie");
- if (!snapshot.isCallerSameApp(packageName, Binder.getCallingUid())) {
+ if (!isCallerSameApp(packageName, Binder.getCallingUid())) {
return null;
}
- PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ PackageStateInternal packageState = getPackageStateInternal(packageName);
if (packageState == null || packageState.getPkg() == null) {
return null;
}
@@ -4918,12 +5423,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return null;
}
- final Computer snapshot = snapshotComputer();
- if (!snapshot.canViewInstantApps(Binder.getCallingUid(), userId)) {
+ if (!canViewInstantApps(Binder.getCallingUid(), userId)) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
"getInstantAppIcon");
}
- snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ enforceCrossUserPermission(Binder.getCallingUid(), userId,
true /* requireFullPermission */, false /* checkShell */,
"getInstantAppIcon");
@@ -4931,31 +5435,76 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
- public ParceledListSlice<InstantAppInfo> getInstantApps(int userId) {
- if (HIDE_EPHEMERAL_APIS) {
+ public ComponentName getInstantAppInstallerComponent() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return null;
}
+ return mInstantAppInstallerActivity == null
+ ? null : mInstantAppInstallerActivity.getComponentName();
+ }
- final Computer snapshot = snapshotComputer();
- if (!snapshot.canViewInstantApps(Binder.getCallingUid(), userId)) {
+ @Override
+ public @Nullable ComponentName getInstantAppResolverComponent() {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
+ return getInstantAppResolver();
+ }
+
+ @Override
+ public ComponentName getInstantAppResolverSettingsComponent() {
+ return mInstantAppResolverSettingsComponent;
+ }
+
+ @Override
+ public ParceledListSlice<InstantAppInfo> getInstantApps(int userId) {
+ if (PackageManagerService.HIDE_EPHEMERAL_APIS) {
+ return null;
+ }
+ if (!canViewInstantApps(Binder.getCallingUid(), userId)) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.ACCESS_INSTANT_APPS,
"getEphemeralApplications");
}
- snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ enforceCrossUserPermission(Binder.getCallingUid(), userId,
true /* requireFullPermission */, false /* checkShell */,
"getEphemeralApplications");
- List<InstantAppInfo> instantApps = mInstantAppRegistry.getInstantApps(snapshot, userId);
+ Computer computer = snapshotComputer();
+ List<InstantAppInfo> instantApps = mInstantAppRegistry.getInstantApps(computer, userId);
if (instantApps != null) {
return new ParceledListSlice<>(instantApps);
}
return null;
}
+ @Nullable
+ @Override
+ public InstrumentationInfo getInstrumentationInfo(@NonNull ComponentName component, int flags) {
+ return mComputer.getInstrumentationInfo(component, flags);
+ }
+
+ @Deprecated
+ @Override
+ public @NonNull ParceledListSlice<IntentFilterVerificationInfo> getIntentFilterVerifications(
+ String packageName) {
+ return ParceledListSlice.emptyList();
+ }
+
+ @Deprecated
+ @Override
+ public int getIntentVerificationStatus(String packageName, int userId) {
+ return mDomainVerificationManager.getLegacyState(packageName, userId);
+ }
+
+ @Nullable
+ @Override
+ public KeySet getKeySetByAlias(@NonNull String packageName, @NonNull String alias) {
+ return mComputer.getKeySetByAlias(packageName, alias);
+ }
+
@Override
public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) {
- return mPreferredActivityHelper.getLastChosenActivity(snapshotComputer(), intent,
- resolvedType, flags);
+ return mPreferredActivityHelper.getLastChosenActivity(intent, resolvedType, flags);
}
@Override
@@ -4967,9 +5516,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override
public List<String> getMimeGroup(String packageName, String mimeGroup) {
- final Computer snapshot = snapshotComputer();
- enforceOwnerRights(snapshot, packageName, Binder.getCallingUid());
- return getMimeGroupInternal(snapshot, packageName, mimeGroup);
+ enforceOwnerRights(packageName, Binder.getCallingUid());
+ return getMimeGroupInternal(packageName, mimeGroup);
+ }
+
+ @Override
+ public ModuleInfo getModuleInfo(String packageName, @PackageManager.ModuleInfoFlags int flags) {
+ return PackageManagerService.this.getModuleInfo(packageName, flags);
}
@Override
@@ -4979,11 +5532,99 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return mMoveCallbacks.mLastStatus.get(moveId);
}
+ @Nullable
+ @Override
+ public String getNameForUid(int uid) {
+ return mComputer.getNameForUid(uid);
+ }
+
+ @Nullable
+ @Override
+ public String[] getNamesForUids(@NonNull int[] uids) {
+ return mComputer.getNamesForUids(uids);
+ }
+
+ @Override
+ public int[] getPackageGids(String packageName, @PackageManager.PackageInfoFlagsBits long flags,
+ int userId) {
+ return mComputer.getPackageGids(packageName, flags, userId);
+ }
+
+ @Override
+ public PackageInfo getPackageInfo(String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+ return mComputer.getPackageInfo(packageName, flags, userId);
+ }
+
+ @Override
+ public PackageInfo getPackageInfoVersioned(VersionedPackage versionedPackage,
+ @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+ return mComputer.getPackageInfoInternal(versionedPackage.getPackageName(),
+ versionedPackage.getLongVersionCode(), flags, Binder.getCallingUid(), userId);
+ }
+
+ @Override
+ public IPackageInstaller getPackageInstaller() {
+ // Return installer service for internal calls.
+ if (PackageManagerServiceUtils.isSystemOrRoot()) {
+ return mInstallerService;
+ }
+ // Return null for InstantApps.
+ if (snapshotComputer().getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return null;
+ }
+ return mInstallerService;
+ }
+
+ @Override
+ public void getPackageSizeInfo(final String packageName, int userId,
+ final IPackageStatsObserver observer) {
+ throw new UnsupportedOperationException(
+ "Shame on you for calling the hidden API getPackageSizeInfo(). Shame!");
+ }
+
+ @Override
+ public int getPackageUid(@NonNull String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, @UserIdInt int userId) {
+ return mComputer.getPackageUid(packageName, flags, userId);
+ }
+
+ /**
+ * <em>IMPORTANT:</em> Not all packages returned by this method may be known
+ * to the system. There are two conditions in which this may occur:
+ * <ol>
+ * <li>The package is on adoptable storage and the device has been removed</li>
+ * <li>The package is being removed and the internal structures are partially updated</li>
+ * </ol>
+ * The second is an artifact of the current data structures and should be fixed. See
+ * b/111075456 for one such instance.
+ * This binder API is cached. If the algorithm in this method changes,
+ * or if the underlying objecs (as returned by getSettingLPr()) change
+ * then the logic that invalidates the cache must be revisited. See
+ * calls to invalidateGetPackagesForUidCache() to locate the points at
+ * which the cache is invalidated.
+ */
+ @Override
+ public String[] getPackagesForUid(int uid) {
+ final int callingUid = Binder.getCallingUid();
+ final int userId = UserHandle.getUserId(uid);
+ mComputer.enforceCrossUserOrProfilePermission(callingUid, userId,
+ /* requireFullPermission */ false,
+ /* checkShell */ false, "getPackagesForUid");
+ return mComputer.getPackagesForUid(uid);
+ }
+
+ @Override
+ public ParceledListSlice<PackageInfo> getPackagesHoldingPermissions(
+ @NonNull String[] permissions, @PackageManager.PackageInfoFlagsBits long flags,
+ @UserIdInt int userId) {
+ return mComputer.getPackagesHoldingPermissions(permissions, flags, userId);
+ }
+
@Override
public String getPermissionControllerPackageName() {
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshotComputer();
- if (snapshot.getPackageStateFiltered(mRequiredPermissionControllerPackage,
+ if (mComputer.getPackageStateFiltered(mRequiredPermissionControllerPackage,
callingUid, UserHandle.getUserId(callingUid)) != null) {
return mRequiredPermissionControllerPackage;
}
@@ -4991,6 +5632,73 @@ public class PackageManagerService implements PackageSender, TestUtilityService
throw new IllegalStateException("PermissionController is not found");
}
+ // NOTE: Can't remove due to unsupported app usage
+ @Override
+ public PermissionGroupInfo getPermissionGroupInfo(String groupName, int flags) {
+ return PackageManagerService.this.getPermissionGroupInfo(groupName, flags);
+ }
+
+ @Override
+ public @NonNull ParceledListSlice<ApplicationInfo> getPersistentApplications(int flags) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ return ParceledListSlice.emptyList();
+ }
+ return new ParceledListSlice<>(mComputer.getPersistentApplications(mSafeMode, flags));
+ }
+
+ @Override
+ public int getPreferredActivities(List<IntentFilter> outFilters,
+ List<ComponentName> outActivities, String packageName) {
+ return mPreferredActivityHelper.getPreferredActivities(outFilters, outActivities,
+ packageName, snapshotComputer());
+ }
+
+ /**
+ * Non-Binder method, support for the backup/restore mechanism: write the
+ * full set of preferred activities in its canonical XML format. Returns the
+ * XML output as a byte array, or null if there is none.
+ */
+ @Override
+ public byte[] getPreferredActivityBackup(int userId) {
+ return mPreferredActivityHelper.getPreferredActivityBackup(userId);
+ }
+
+ @Override
+ public int getPrivateFlagsForUid(int uid) {
+ return mComputer.getPrivateFlagsForUid(uid);
+ }
+
+ @Override
+ public PackageManager.Property getProperty(String propertyName, String packageName, String className) {
+ Objects.requireNonNull(propertyName);
+ Objects.requireNonNull(packageName);
+ PackageStateInternal packageState = mComputer.getPackageStateFiltered(packageName,
+ Binder.getCallingUid(), UserHandle.getCallingUserId());
+ if (packageState == null) {
+ return null;
+ }
+ return mPackageProperty.getProperty(propertyName, packageName, className);
+ }
+
+ @Nullable
+ @Override
+ public ProviderInfo getProviderInfo(@NonNull ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
+ return mComputer.getProviderInfo(component, flags, userId);
+ }
+
+ @Override
+ public ActivityInfo getReceiverInfo(ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, int userId) {
+ return mComputer.getReceiverInfo(component, flags, userId);
+ }
+
+ @Override
+ public @Nullable String getRotationResolverPackageName() {
+ return ensureSystemPackageName(
+ getPackageFromComponentString(R.string.config_defaultRotationResolverService));
+ }
+
@Override
public int getRuntimePermissionsVersion(@UserIdInt int userId) {
Preconditions.checkArgumentNonnegative(userId);
@@ -4999,25 +5707,65 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return mSettings.getDefaultRuntimePermissionsVersion(userId);
}
+ @Nullable
+ @Override
+ public ServiceInfo getServiceInfo(@NonNull ComponentName component,
+ @PackageManager.ComponentInfoFlagsBits long flags, @UserIdInt int userId) {
+ return mComputer.getServiceInfo(component, flags, userId);
+ }
+
+ @Override
+ public @NonNull String getServicesSystemSharedLibraryPackageName() {
+ return mServicesExtensionPackageName;
+ }
+
+ @Override
+ public String getSetupWizardPackageName() {
+ if (Binder.getCallingUid() != Process.SYSTEM_UID) {
+ throw new SecurityException("Non-system caller");
+ }
+ return mPmInternal.getSetupWizardPackageName();
+ }
+
+ @Override
+ public ParceledListSlice<SharedLibraryInfo> getSharedLibraries(String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+ return mComputer.getSharedLibraries(packageName, flags, userId);
+ }
+
+ @Override
+ public @NonNull String getSharedSystemSharedLibraryPackageName() {
+ return mSharedSystemSharedLibraryPackageName;
+ }
+
+ @Nullable
+ @Override
+ public KeySet getSigningKeySet(@NonNull String packageName) {
+ return mComputer.getSigningKeySet(packageName);
+ }
+
@Override
public String getSplashScreenTheme(@NonNull String packageName, int userId) {
- final Computer snapshot = snapshotComputer();
- PackageStateInternal packageState = filterPackageStateForInstalledAndFiltered(snapshot,
- packageName, Binder.getCallingUid(), userId);
+ PackageStateInternal packageState =
+ getPackageStateInstalledFiltered(packageName, Binder.getCallingUid(), userId);
return packageState == null ? null
: packageState.getUserStateOrDefault(userId).getSplashScreenTheme();
}
@Override
+ public String getSdkSandboxPackageName() {
+ return mRequiredSdkSandboxPackage;
+ }
+
+ @Override
public Bundle getSuspendedPackageAppExtras(String packageName, int userId) {
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshot();
- if (snapshot.getPackageUid(packageName, 0, userId) != callingUid) {
+ if (getPackageUid(packageName, 0, userId) != callingUid) {
throw new SecurityException("Calling package " + packageName
+ " does not belong to calling uid " + callingUid);
}
- return mSuspendPackageHelper
- .getSuspendedPackageAppExtras(snapshot, packageName, userId, callingUid);
+ return mSuspendPackageHelper.getSuspendedPackageAppExtras(
+ packageName, userId, callingUid);
}
@Override
@@ -5037,6 +5785,34 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public String getSystemCaptionsServicePackageName() {
+ return ensureSystemPackageName(
+ getPackageFromComponentString(R.string.config_defaultSystemCaptionsService));
+ }
+
+ @Nullable
+ @Override
+ public String[] getSystemSharedLibraryNames() {
+ return mComputer.getSystemSharedLibraryNames();
+ }
+
+ @Override
+ public String getSystemTextClassifierPackageName() {
+ return ensureSystemPackageName(
+ mContext.getString(R.string.config_defaultTextClassifierPackage));
+ }
+
+ @Override
+ public int getTargetSdkVersion(@NonNull String packageName) {
+ return mComputer.getTargetSdkVersion(packageName);
+ }
+
+ @Override
+ public int getUidForSharedUser(@NonNull String sharedUserName) {
+ return mComputer.getUidForSharedUser(sharedUserName);
+ }
+
+ @Override
public String[] getUnsuspendablePackagesForUser(String[] packageNames, int userId) {
Objects.requireNonNull(packageNames, "packageNames cannot be null");
mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
@@ -5062,6 +5838,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public String getWellbeingPackageName() {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ return CollectionUtils.firstOrNull(
+ mContext.getSystemService(RoleManager.class).getRoleHolders(
+ RoleManager.ROLE_SYSTEM_WELLBEING));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
public void grantImplicitAccess(int recipientUid, @NonNull String visibleAuthority) {
final Computer snapshot = snapshotComputer();
final int recipientUserId = UserHandle.getUserId(recipientUid);
@@ -5076,6 +5864,38 @@ public class PackageManagerService implements PackageSender, TestUtilityService
false /*direct*/, false /* retainOnUpdate */);
}
+ // NOTE: Can't remove due to unsupported app usage
+ @Override
+ public void grantRuntimePermission(String packageName, String permName, final int userId) {
+ // Because this is accessed via the package manager service AIDL,
+ // go through the permission manager service AIDL
+ mContext.getSystemService(PermissionManager.class)
+ .grantRuntimePermission(packageName, permName, UserHandle.of(userId));
+ }
+
+ @Override
+ public boolean hasSigningCertificate(@NonNull String packageName, @NonNull byte[] certificate,
+ @PackageManager.CertificateInputType int type) {
+ return mComputer.hasSigningCertificate(packageName, certificate, type);
+ }
+
+ @Override
+ public boolean hasSystemFeature(String name, int version) {
+ return PackageManagerService.this.hasSystemFeature(name, version);
+ }
+
+ @Override
+ public boolean hasSystemUidErrors() {
+ // allow instant applications
+ return false;
+ }
+
+ @Override
+ public boolean hasUidSigningCertificate(int uid, @NonNull byte[] certificate,
+ @PackageManager.CertificateInputType int type) {
+ return mComputer.hasUidSigningCertificate(uid, certificate, type);
+ }
+
@Override
public void holdLock(IBinder token, int durationMs) {
mTestUtilityService.verifyHoldLockToken(token);
@@ -5104,17 +5924,55 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public boolean isDeviceUpgrading() {
+ return PackageManagerService.this.isDeviceUpgrading();
+ }
+
+ @Override
+ public boolean isFirstBoot() {
+ return PackageManagerService.this.isFirstBoot();
+ }
+
+ @Override
+ public boolean isInstantApp(String packageName, int userId) {
+ return mComputer.isInstantApp(packageName, userId);
+ }
+
+ @Override
+ public boolean isOnlyCoreApps() {
+ return PackageManagerService.this.isOnlyCoreApps();
+ }
+
+ @Override
+ public boolean isPackageAvailable(String packageName, int userId) {
+ return mComputer.isPackageAvailable(packageName, userId);
+ }
+
+ @Override
+ public boolean isPackageDeviceAdminOnAnyUser(String packageName) {
+ return PackageManagerService.this.isPackageDeviceAdminOnAnyUser(packageName);
+ }
+
+ @Override
+ public boolean isPackageSignedByKeySet(@NonNull String packageName, @NonNull KeySet ks) {
+ return mComputer.isPackageSignedByKeySet(packageName, ks);
+ }
+
+ @Override
+ public boolean isPackageSignedByKeySetExactly(@NonNull String packageName, @NonNull KeySet ks) {
+ return mComputer.isPackageSignedByKeySetExactly(packageName, ks);
+ }
+
+ @Override
public boolean isPackageStateProtected(@NonNull String packageName, @UserIdInt int userId) {
final int callingUid = Binder.getCallingUid();
final int callingAppId = UserHandle.getAppId(callingUid);
- final Computer snapshot = snapshotComputer();
- snapshot.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/,
+ enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/,
true /*checkShell*/, "isPackageStateProtected");
if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID
- && snapshot.checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid)
- != PERMISSION_GRANTED) {
+ && checkUidPermission(MANAGE_DEVICE_ADMINS, callingUid) != PERMISSION_GRANTED) {
throw new SecurityException("Caller must have the "
+ MANAGE_DEVICE_ADMINS + " permission.");
}
@@ -5123,6 +5981,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public boolean isPackageSuspendedForUser(@NonNull String packageName, @UserIdInt int userId) {
+ return mComputer.isPackageSuspendedForUser(packageName, userId);
+ }
+
+ @Override
public boolean isProtectedBroadcast(String actionName) {
if (actionName != null) {
// TODO: remove these terrible hacks
@@ -5139,6 +6002,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
+ @Override
+ public boolean isSafeMode() {
+ // allow instant applications
+ return mSafeMode;
+ }
+
+ @Override
+ public boolean isStorageLow() {
+ return PackageManagerService.this.isStorageLow();
+ }
+
+ @Override
+ public boolean isUidPrivileged(int uid) {
+ return mComputer.isUidPrivileged(uid);
+ }
+
/**
* Logs process start information (including base APK hash) to the security log.
* @hide
@@ -5146,15 +6025,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override
public void logAppProcessStartIfNeeded(String packageName, String processName, int uid,
String seinfo, String apkFile, int pid) {
- final Computer snapshot = snapshotComputer();
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return;
}
if (!SecurityLog.isLoggingEnabled()) {
return;
}
- mProcessLoggingHandler.logAppProcessStart(mContext,
- LocalServices.getService(PackageManagerInternal.class), apkFile, packageName,
+ mProcessLoggingHandler.logAppProcessStart(mContext, mPmInternal, apkFile, packageName,
processName, uid, seinfo, pid);
}
@@ -5206,29 +6083,25 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
- public void notifyDexLoad(String loadingPackageName,
- Map<String, String> classLoaderContextMap,
+ public void notifyDexLoad(String loadingPackageName, Map<String, String> classLoaderContextMap,
String loaderIsa) {
int callingUid = Binder.getCallingUid();
- if (PackageManagerService.PLATFORM_PACKAGE_NAME.equals(loadingPackageName)
- && callingUid != Process.SYSTEM_UID) {
- Slog.w(PackageManagerService.TAG,
- "Non System Server process reporting dex loads as system server. uid="
- + callingUid);
+ if (PackageManagerService.PLATFORM_PACKAGE_NAME.equals(loadingPackageName) && callingUid != Process.SYSTEM_UID) {
+ Slog.w(PackageManagerService.TAG, "Non System Server process reporting dex loads as system server. uid="
+ + callingUid);
// Do not record dex loads from processes pretending to be system server.
// Only the system server should be assigned the package "android", so reject calls
// that don't satisfy the constraint.
//
// notifyDexLoad is a PM API callable from the app process. So in theory, apps could
- // craft calls to this API and pretend to be system server. Doing so poses no
- // particular danger for dex load reporting or later dexopt, however it is a
- // sensible check to do in order to verify the expectations.
+ // craft calls to this API and pretend to be system server. Doing so poses no particular
+ // danger for dex load reporting or later dexopt, however it is a sensible check to do
+ // in order to verify the expectations.
return;
}
int userId = UserHandle.getCallingUserId();
- ApplicationInfo ai = snapshot().getApplicationInfo(loadingPackageName, /*flags*/ 0,
- userId);
+ ApplicationInfo ai = getApplicationInfo(loadingPackageName, /*flags*/ 0, userId);
if (ai == null) {
Slog.w(PackageManagerService.TAG, "Loading a package that does not exist for the calling user. package="
+ loadingPackageName + ", user=" + userId);
@@ -5242,13 +6115,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
public void notifyPackageUse(String packageName, int reason) {
final int callingUid = Binder.getCallingUid();
final int callingUserId = UserHandle.getUserId(callingUid);
- Computer snapshot = snapshotComputer();
final boolean notify;
- if (snapshot.getInstantAppPackageName(callingUid) != null) {
- notify = snapshot.isCallerSameApp(packageName, callingUid);
+ if (getInstantAppPackageName(callingUid) != null) {
+ notify = isCallerSameApp(packageName, callingUid);
} else {
- notify = !snapshot.isInstantAppInternal(packageName, callingUserId,
- Process.SYSTEM_UID);
+ notify = !isInstantAppInternal(packageName, callingUserId, Process.SYSTEM_UID);
}
if (!notify) {
return;
@@ -5266,18 +6137,102 @@ public class PackageManagerService implements PackageSender, TestUtilityService
updateComponentLabelIcon(componentName, nonLocalizedLabel, icon, userId);
}
+ /**
+ * Ask the package manager to perform a dex-opt with the given compiler filter.
+ *
+ * Note: exposed only for the shell command to allow moving packages explicitly to a
+ * definite state.
+ */
+ @Override
+ public boolean performDexOptMode(String packageName,
+ boolean checkProfiles, String targetCompilerFilter, boolean force,
+ boolean bootComplete, String splitName) {
+ return mDexOptHelper.performDexOptMode(packageName, checkProfiles, targetCompilerFilter,
+ force, bootComplete, splitName);
+ }
+
+ /**
+ * Ask the package manager to perform a dex-opt with the given compiler filter on the
+ * secondary dex files belonging to the given package.
+ *
+ * Note: exposed only for the shell command to allow moving packages explicitly to a
+ * definite state.
+ */
+ @Override
+ public boolean performDexOptSecondary(String packageName, String compilerFilter,
+ boolean force) {
+ return mDexOptHelper.performDexOptSecondary(packageName, compilerFilter, force);
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<ProviderInfo> queryContentProviders(@Nullable String processName,
+ int uid, @PackageManager.ComponentInfoFlagsBits long flags,
+ @Nullable String metaDataKey) {
+ return mComputer.queryContentProviders(processName, uid, flags, metaDataKey);
+ }
+
+ @NonNull
+ @Override
+ public ParceledListSlice<InstrumentationInfo> queryInstrumentation(
+ @NonNull String targetPackage, int flags) {
+ return mComputer.queryInstrumentation(targetPackage, flags);
+ }
+
+ @Override
+ public @NonNull ParceledListSlice<ResolveInfo> queryIntentActivities(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+ try {
+ Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "queryIntentActivities");
+
+ return new ParceledListSlice<>(snapshotComputer().queryIntentActivitiesInternal(intent,
+ resolvedType, flags, userId));
+ } finally {
+ Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);
+ }
+ }
+
+ @Override
+ public @NonNull ParceledListSlice<ResolveInfo> queryIntentActivityOptions(ComponentName caller,
+ Intent[] specifics, String[] specificTypes, Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+ return new ParceledListSlice<>(mResolveIntentHelper.queryIntentActivityOptionsInternal(
+ snapshotComputer(), caller, specifics, specificTypes, intent, resolvedType, flags,
+ userId));
+ }
+
+ @Override
+ public @NonNull ParceledListSlice<ResolveInfo> queryIntentContentProviders(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+ return new ParceledListSlice<>(mResolveIntentHelper.queryIntentContentProvidersInternal(
+ snapshotComputer(), intent, resolvedType, flags, userId));
+ }
+
+ @Override
+ public @NonNull ParceledListSlice<ResolveInfo> queryIntentReceivers(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+ return new ParceledListSlice<>(mResolveIntentHelper.queryIntentReceiversInternal(
+ snapshotComputer(), intent, resolvedType, flags, userId, Binder.getCallingUid()));
+ }
+
+ @Override
+ public @NonNull ParceledListSlice<ResolveInfo> queryIntentServices(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ return new ParceledListSlice<>(snapshotComputer().queryIntentServicesInternal(
+ intent, resolvedType, flags, userId, callingUid, false /*includeInstantApps*/));
+ }
+
@Override
public ParceledListSlice<PackageManager.Property> queryProperty(
String propertyName, @PackageManager.PropertyLocation int componentType) {
Objects.requireNonNull(propertyName);
final int callingUid = Binder.getCallingUid();
final int callingUserId = UserHandle.getCallingUserId();
- final Computer snapshot = snapshotComputer();
final List<PackageManager.Property> result =
mPackageProperty.queryProperty(propertyName, componentType, packageName -> {
- final PackageStateInternal ps =
- snapshot.getPackageStateInternal(packageName);
- return snapshot.shouldFilterApplication(ps, callingUid, callingUserId);
+ final PackageStateInternal ps = getPackageStateInternal(packageName);
+ return shouldFilterApplication(ps, callingUid, callingUserId);
});
if (result == null) {
return ParceledListSlice.emptyList();
@@ -5285,6 +6240,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return new ParceledListSlice<>(result);
}
+ @Deprecated
+ public void querySyncProviders(List<String> outNames, List<ProviderInfo> outInfo) {
+ mComputer.querySyncProviders(mSafeMode, outNames, outInfo);
+ }
+
/**
* Reconcile the information we have about the secondary dex files belonging to
* {@code packageName} and the actual dex files. For all dex files that were
@@ -5292,10 +6252,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
*/
@Override
public void reconcileSecondaryDexFiles(String packageName) {
- final Computer snapshot = snapshotComputer();
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
return;
- } else if (snapshot.isInstantAppInternal(
+ } else if (isInstantAppInternal(
packageName, UserHandle.getCallingUserId(), Process.SYSTEM_UID)) {
return;
}
@@ -5303,16 +6262,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
- public void registerDexModule(String packageName, String dexModulePath,
- boolean isSharedModule,
+ public void registerDexModule(String packageName, String dexModulePath, boolean isSharedModule,
IDexModuleRegisterCallback callback) {
int userId = UserHandle.getCallingUserId();
- ApplicationInfo ai = snapshot().getApplicationInfo(packageName, /*flags*/ 0, userId);
+ ApplicationInfo ai = getApplicationInfo(packageName, /*flags*/ 0, userId);
DexManager.RegisterDexModuleResult result;
if (ai == null) {
- Slog.w(PackageManagerService.TAG,
- "Registering a dex module for a package that does not exist for the" +
- " calling user. package=" + packageName + ", user=" + userId);
+ Slog.w(PackageManagerService.TAG, "Registering a dex module for a package that does not exist for the" +
+ " calling user. package=" + packageName + ", user=" + userId);
result = new DexManager.RegisterDexModuleResult(false, "Package not installed");
} else {
result = mDexManager.registerDexModule(ai, dexModulePath, isSharedModule, userId);
@@ -5321,11 +6278,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
if (callback != null) {
mHandler.post(() -> {
try {
- callback.onDexModuleRegistered(dexModulePath, result.success,
- result.message);
+ callback.onDexModuleRegistered(dexModulePath, result.success, result.message);
} catch (RemoteException e) {
- Slog.w(PackageManagerService.TAG,
- "Failed to callback after module registration " + dexModulePath, e);
+ Slog.w(PackageManagerService.TAG, "Failed to callback after module registration " + dexModulePath, e);
}
});
}
@@ -5338,6 +6293,52 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mMoveCallbacks.register(callback);
}
+ // NOTE: Can't remove due to unsupported app usage
+ @Override
+ public void removePermission(String permName) {
+ // Because this is accessed via the package manager service AIDL,
+ // go through the permission manager service AIDL
+ mContext.getSystemService(PermissionManager.class).removePermission(permName);
+ }
+
+ @Override
+ public void replacePreferredActivity(IntentFilter filter, int match,
+ ComponentName[] set, ComponentName activity, int userId) {
+ mPreferredActivityHelper.replacePreferredActivity(new WatchedIntentFilter(filter),
+ match, set, activity, userId);
+ }
+
+ @Override
+ public void resetApplicationPreferences(int userId) {
+ mPreferredActivityHelper.resetApplicationPreferences(userId);
+ }
+
+ @Override
+ public ProviderInfo resolveContentProvider(String name,
+ @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+ return mComputer.resolveContentProvider(name, flags, userId, Binder.getCallingUid());
+ }
+
+ @Override
+ public ResolveInfo resolveIntent(Intent intent, String resolvedType,
+ @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+ return mResolveIntentHelper.resolveIntentInternal(snapshotComputer(), intent, resolvedType,
+ flags, 0 /*privateResolveFlags*/, userId, false, Binder.getCallingUid());
+ }
+
+ @Override
+ public ResolveInfo resolveService(Intent intent, String resolvedType,
+ @PackageManager.ResolveInfoFlagsBits long flags, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ return mResolveIntentHelper.resolveServiceInternal(snapshotComputer(), intent, resolvedType,
+ flags, userId, callingUid);
+ }
+
+ @Override
+ public void restoreDefaultApps(byte[] backup, int userId) {
+ mPreferredActivityHelper.restoreDefaultApps(backup, userId);
+ }
+
@Override
public void restoreDomainVerification(byte[] backup, int userId) {
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
@@ -5365,6 +6366,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public void restorePreferredActivities(byte[] backup, int userId) {
+ mPreferredActivityHelper.restorePreferredActivities(backup, userId);
+ }
+
+ @Override
public void sendDeviceCustomizationReadyBroadcast() {
mContext.enforceCallingPermission(Manifest.permission.SEND_DEVICE_CUSTOMIZATION_READY,
"sendDeviceCustomizationReadyBroadcast");
@@ -5380,17 +6386,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override
public void setApplicationCategoryHint(String packageName, int categoryHint,
String callerPackageName) {
+ if (getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ throw new SecurityException("Instant applications don't have access to this method");
+ }
+ mInjector.getSystemService(AppOpsManager.class).checkPackage(Binder.getCallingUid(),
+ callerPackageName);
+
final PackageStateMutator.InitialState initialState = recordInitialState();
final FunctionalUtils.ThrowingFunction<Computer, PackageStateMutator.Result>
implementation = computer -> {
- if (computer.getInstantAppPackageName(Binder.getCallingUid()) != null) {
- throw new SecurityException(
- "Instant applications don't have access to this method");
- }
- mInjector.getSystemService(AppOpsManager.class)
- .checkPackage(Binder.getCallingUid(), callerPackageName);
-
PackageStateInternal packageState = computer.getPackageStateFiltered(packageName,
Binder.getCallingUid(), UserHandle.getCallingUserId());
if (packageState == null) {
@@ -5442,8 +6447,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
int userId) {
mContext.enforceCallingOrSelfPermission(android.Manifest.permission.MANAGE_USERS, null);
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshotComputer();
- snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
+ enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
true /* checkShell */, "setApplicationHiddenSetting for user " + userId);
if (hidden && isPackageDeviceAdmin(packageName, userId)) {
@@ -5460,7 +6464,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final long callingId = Binder.clearCallingIdentity();
try {
final PackageStateInternal packageState =
- snapshot.getPackageStateFiltered(packageName, callingUid, userId);
+ mComputer.getPackageStateFiltered(packageName, callingUid, userId);
if (packageState == null) {
return false;
}
@@ -5501,16 +6505,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
commitPackageStateMutation(null, packageName, packageState1 ->
packageState1.userState(userId).setHidden(hidden));
- final Computer newSnapshot = snapshotComputer();
- final PackageStateInternal newPackageState =
- newSnapshot.getPackageStateInternal(packageName);
+ final PackageStateInternal newPackageState = getPackageStateInternal(packageName);
if (hidden) {
killApplication(packageName, newPackageState.getAppId(), userId, "hiding pkg");
sendApplicationHiddenForUser(packageName, newPackageState, userId);
} else {
- sendPackageAddedForUser(newSnapshot, packageName, newPackageState, userId,
- DataLoaderType.NONE);
+ sendPackageAddedForUser(packageName, newPackageState, userId, DataLoaderType.NONE);
}
scheduleWritePackageRestrictions(userId);
@@ -5525,8 +6526,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
int userId) {
mContext.enforceCallingOrSelfPermission(
Manifest.permission.DELETE_PACKAGES, null);
- final Computer snapshot = snapshotComputer();
- PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ PackageStateInternal packageState = getPackageStateInternal(packageName);
if (packageState != null && packageState.getPkg() != null) {
AndroidPackage pkg = packageState.getPkg();
// Cannot block uninstall SDK libs as they are controlled by SDK manager.
@@ -5584,10 +6584,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
+ userId);
}
Objects.requireNonNull(packageNames, "packageNames cannot be null");
- final Computer snapshot = snapshotComputer();
if (restrictionFlags != 0
- && !mSuspendPackageHelper.isSuspendAllowedForUser(snapshot, userId,
- callingUid)) {
+ && !mSuspendPackageHelper.isSuspendAllowedForUser(userId, callingUid)) {
Slog.w(PackageManagerService.TAG, "Cannot restrict packages due to restrictions on user " + userId);
return packageNames;
}
@@ -5597,15 +6595,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final List<String> unactionedPackages = new ArrayList<>(packageNames.length);
ArraySet<String> changesToCommit = new ArraySet<>();
+ Computer computer = snapshotComputer();
final boolean[] canRestrict = (restrictionFlags != 0)
- ? mSuspendPackageHelper.canSuspendPackageForUser(snapshot, packageNames, userId,
+ ? mSuspendPackageHelper.canSuspendPackageForUser(computer, packageNames, userId,
callingUid) : null;
for (int i = 0; i < packageNames.length; i++) {
final String packageName = packageNames[i];
final PackageStateInternal packageState =
- snapshot.getPackageStateInternal(packageName);
+ computer.getPackageStateInternal(packageName);
if (packageState == null
- || snapshot.shouldFilterApplication(packageState, callingUid, userId)) {
+ || computer.shouldFilterApplication(packageState, callingUid, userId)) {
Slog.w(PackageManagerService.TAG, "Could not find package setting for package: " + packageName
+ ". Skipping...");
unactionedPackages.add(packageName);
@@ -5649,13 +6648,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final int callingUid = Binder.getCallingUid();
final int callingAppId = UserHandle.getAppId(callingUid);
- final Computer snapshot = snapshotComputer();
- snapshot.enforceCrossUserPermission(callingUid, userId, true /*requireFullPermission*/,
+ enforceCrossUserPermission(callingUid, userId, true /*requireFullPermission*/,
true /*checkShell*/, "setHarmfulAppInfo");
if (callingAppId != Process.SYSTEM_UID && callingAppId != Process.ROOT_UID &&
- snapshot.checkUidPermission(SET_HARMFUL_APP_WARNINGS, callingUid)
- != PERMISSION_GRANTED) {
+ checkUidPermission(SET_HARMFUL_APP_WARNINGS, callingUid) != PERMISSION_GRANTED) {
throw new SecurityException("Caller must have the "
+ SET_HARMFUL_APP_WARNINGS + " permission.");
}
@@ -5670,6 +6667,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public void setHomeActivity(ComponentName comp, int userId) {
+ mPreferredActivityHelper.setHomeActivity(comp, userId);
+ }
+
+ @Override
public boolean setInstallLocation(int loc) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.WRITE_SECURE_SETTINGS,
null);
@@ -5691,24 +6693,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final int callingUid = Binder.getCallingUid();
final int callingUserId = UserHandle.getUserId(callingUid);
final FunctionalUtils.ThrowingCheckedFunction<Computer, Boolean, RuntimeException>
- implementation = snapshot -> {
- if (snapshot.getInstantAppPackageName(callingUid) != null) {
+ implementation = computer -> {
+ if (computer.getInstantAppPackageName(callingUid) != null) {
return false;
}
PackageStateInternal targetPackageState =
- snapshot.getPackageStateInternal(targetPackage);
+ computer.getPackageStateInternal(targetPackage);
if (targetPackageState == null
- || snapshot.shouldFilterApplication(targetPackageState, callingUid,
+ || computer.shouldFilterApplication(targetPackageState, callingUid,
callingUserId)) {
throw new IllegalArgumentException("Unknown target package: " + targetPackage);
}
PackageStateInternal installerPackageState = null;
if (installerPackageName != null) {
- installerPackageState = snapshot.getPackageStateInternal(installerPackageName);
+ installerPackageState = computer.getPackageStateInternal(installerPackageName);
if (installerPackageState == null
- || snapshot.shouldFilterApplication(
+ || shouldFilterApplication(
installerPackageState, callingUid, callingUserId)) {
throw new IllegalArgumentException("Unknown installer package: "
+ installerPackageName);
@@ -5718,7 +6720,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
Signature[] callerSignature;
final int appId = UserHandle.getAppId(callingUid);
Pair<PackageStateInternal, SharedUserApi> either =
- snapshot.getPackageOrSharedUser(appId);
+ computer.getPackageOrSharedUser(appId);
if (either != null) {
if (either.first != null) {
callerSignature = either.first.getSigningDetails().getSignatures();
@@ -5746,7 +6748,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
String targetInstallerPackageName =
targetPackageState.getInstallSource().installerPackageName;
PackageStateInternal targetInstallerPkgSetting = targetInstallerPackageName == null
- ? null : snapshot.getPackageStateInternal(targetInstallerPackageName);
+ ? null : computer.getPackageStateInternal(targetInstallerPackageName);
if (targetInstallerPkgSetting != null) {
if (compareSignatures(callerSignature,
@@ -5802,7 +6804,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
}
- targetPackageState = snapshotComputer().getPackageStateInternal(targetPackage);
+ targetPackageState = getPackageStateInternal(targetPackage);
mSettings.addInstallerPackageNames(targetPackageState.getInstallSource());
}
mAppsFilter.addPackage(targetPackageState);
@@ -5816,15 +6818,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return true;
}
- final Computer snapshot = snapshotComputer();
- snapshot.enforceCrossUserPermission(Binder.getCallingUid(), userId,
+ enforceCrossUserPermission(Binder.getCallingUid(), userId,
true /* requireFullPermission */, true /* checkShell */,
"setInstantAppCookie");
- if (!snapshot.isCallerSameApp(packageName, Binder.getCallingUid())) {
+ if (!isCallerSameApp(packageName, Binder.getCallingUid())) {
return false;
}
- PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ PackageStateInternal packageState = getPackageStateInternal(packageName);
if (packageState == null || packageState.getPkg() == null) {
return false;
}
@@ -5839,15 +6840,21 @@ public class PackageManagerService implements PackageSender, TestUtilityService
"setKeepUninstalledPackages requires KEEP_UNINSTALLED_PACKAGES permission");
Objects.requireNonNull(packageList);
- setKeepUninstalledPackagesInternal(snapshot(), packageList);
+ setKeepUninstalledPackagesInternal(packageList);
+ }
+
+ @Override
+ public void setLastChosenActivity(Intent intent, String resolvedType, int flags,
+ IntentFilter filter, int match, ComponentName activity) {
+ mPreferredActivityHelper.setLastChosenActivity(intent, resolvedType, flags,
+ new WatchedIntentFilter(filter), match, activity);
}
@Override
public void setMimeGroup(String packageName, String mimeGroup, List<String> mimeTypes) {
- final Computer snapshot = snapshotComputer();
- enforceOwnerRights(snapshot, packageName, Binder.getCallingUid());
+ enforceOwnerRights(packageName, Binder.getCallingUid());
mimeTypes = CollectionUtils.emptyIfNull(mimeTypes);
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
Set<String> existingMimeTypes = packageState.getMimeGroups().get(mimeGroup);
if (existingMimeTypes == null) {
throw new IllegalArgumentException("Unknown MIME group " + mimeGroup
@@ -5882,11 +6889,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
PersistableBundle appExtras, PersistableBundle launcherExtras,
SuspendDialogInfo dialogInfo, String callingPackage, int userId) {
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshotComputer();
- enforceCanSetPackagesSuspendedAsUser(snapshot, callingPackage, callingUid, userId,
+ enforceCanSetPackagesSuspendedAsUser(callingPackage, callingUid, userId,
"setPackagesSuspendedAsUser");
- return mSuspendPackageHelper.setPackagesSuspended(snapshot, packageNames, suspended,
- appExtras, launcherExtras, dialogInfo, callingPackage, userId, callingUid);
+ return mSuspendPackageHelper.setPackagesSuspended(snapshotComputer(), packageNames,
+ suspended, appExtras, launcherExtras, dialogInfo, callingPackage, userId,
+ callingUid);
}
@Override
@@ -5917,13 +6924,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService
public void setSplashScreenTheme(@NonNull String packageName, @Nullable String themeId,
int userId) {
final int callingUid = Binder.getCallingUid();
- final Computer snapshot = snapshotComputer();
- snapshot.enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */,
+ enforceCrossUserPermission(callingUid, userId, false /* requireFullPermission */,
false /* checkShell */, "setSplashScreenTheme");
- enforceOwnerRights(snapshot, packageName, callingUid);
+ enforceOwnerRights(packageName, callingUid);
- PackageStateInternal packageState = filterPackageStateForInstalledAndFiltered(snapshot,
- packageName, callingUid, userId);
+ PackageStateInternal packageState = getPackageStateInstalledFiltered(packageName,
+ callingUid, userId);
if (packageState == null) {
return;
}
@@ -5933,6 +6939,80 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public void setSystemAppHiddenUntilInstalled(String packageName, boolean hidden) {
+ final int callingUid = Binder.getCallingUid();
+ final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID
+ || callingUid == Process.SYSTEM_UID;
+ if (!calledFromSystemOrPhone) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
+ "setSystemAppHiddenUntilInstalled");
+ }
+
+ final PackageStateInternal stateRead = getPackageStateInternal(packageName);
+ if (stateRead == null || !stateRead.isSystem() || stateRead.getPkg() == null) {
+ return;
+ }
+ if (stateRead.getPkg().isCoreApp() && !calledFromSystemOrPhone) {
+ throw new SecurityException("Only system or phone callers can modify core apps");
+ }
+
+ commitPackageStateMutation(null, mutator -> {
+ mutator.forPackage(packageName)
+ .setHiddenUntilInstalled(hidden);
+ mutator.forDisabledSystemPackage(packageName)
+ .setHiddenUntilInstalled(hidden);
+ });
+ }
+
+ @Override
+ public boolean setSystemAppInstallState(String packageName, boolean installed, int userId) {
+ final int callingUid = Binder.getCallingUid();
+ final boolean calledFromSystemOrPhone = callingUid == Process.PHONE_UID
+ || callingUid == Process.SYSTEM_UID;
+ if (!calledFromSystemOrPhone) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS,
+ "setSystemAppHiddenUntilInstalled");
+ }
+
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
+ // The target app should always be in system
+ if (packageState == null || !packageState.isSystem() || packageState.getPkg() == null) {
+ return false;
+ }
+ if (packageState.getPkg().isCoreApp() && !calledFromSystemOrPhone) {
+ throw new SecurityException("Only system or phone callers can modify core apps");
+ }
+ // Check if the install state is the same
+ if (packageState.getUserStateOrDefault(userId).isInstalled() == installed) {
+ return false;
+ }
+
+ final long callingId = Binder.clearCallingIdentity();
+ try {
+ if (installed) {
+ // install the app from uninstalled state
+ installExistingPackageAsUser(
+ packageName,
+ userId,
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+ PackageManager.INSTALL_REASON_DEVICE_SETUP,
+ null);
+ return true;
+ }
+
+ // uninstall the app from installed state
+ deletePackageVersioned(
+ new VersionedPackage(packageName, PackageManager.VERSION_CODE_HIGHEST),
+ new PackageManager.LegacyPackageDeleteObserver(null).getBinder(),
+ userId,
+ PackageManager.DELETE_SYSTEM_APP);
+ return true;
+ } finally {
+ Binder.restoreCallingIdentity(callingId);
+ }
+ }
+
+ @Override
public void setUpdateAvailable(String packageName, boolean updateAvailable) {
mContext.enforceCallingOrSelfPermission(Manifest.permission.INSTALL_PACKAGES, null);
commitPackageStateMutation(null, packageName, state ->
@@ -5946,6 +7026,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mMoveCallbacks.unregister(callback);
}
+ @Deprecated
+ @Override
+ public boolean updateIntentVerificationStatus(String packageName, int status, int userId) {
+ return mDomainVerificationManager.setLegacyUserState(packageName, userId, status);
+ }
+
+ @Deprecated
+ @Override
+ public void verifyIntentFilter(int id, int verificationCode, List<String> failedDomains) {
+ DomainVerificationProxyV1.queueLegacyVerifyResult(mContext, mDomainVerificationConnection,
+ id, verificationCode, failedDomains, Binder.getCallingUid());
+ }
+
@Override
public void verifyPendingInstall(int id, int verificationCode) throws RemoteException {
mContext.enforceCallingOrSelfPermission(
@@ -5966,9 +7059,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Checksum.TypeMask int optional, @Checksum.TypeMask int required,
@Nullable List trustedInstallers,
@NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId) {
- requestChecksumsInternal(snapshotComputer(), packageName, includeSplits, optional,
- required, trustedInstallers, onChecksumsReadyListener, userId,
- mInjector.getBackgroundExecutor(), mInjector.getBackgroundHandler());
+ requestChecksumsInternal(packageName, includeSplits, optional, required, trustedInstallers,
+ onChecksumsReadyListener, userId, mInjector.getBackgroundExecutor(),
+ mInjector.getBackgroundHandler());
}
@Override
@@ -5981,6 +7074,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public boolean canPackageQuery(@NonNull String sourcePackageName,
+ @NonNull String targetPackageName, @UserIdInt int userId) {
+ return mComputer.canPackageQuery(sourcePackageName, targetPackageName, userId);
+ }
+
+ @Override
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
try {
@@ -5998,8 +7097,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
public void onShellCommand(FileDescriptor in, FileDescriptor out,
FileDescriptor err, String[] args, ShellCallback callback,
ResultReceiver resultReceiver) {
- (new PackageManagerShellCommand(this, mContext,
- mDomainVerificationManager.getShell()))
+ (new PackageManagerShellCommand(mIPackageManager,
+ mContext,mDomainVerificationManager.getShell()))
.exec(this, in, out, err, args, callback, resultReceiver);
}
@@ -6014,126 +7113,143 @@ public class PackageManagerService implements PackageSender, TestUtilityService
private class PackageManagerLocalImpl implements PackageManagerLocal {
}
- private class PackageManagerInternalImpl extends PackageManagerInternalBase {
+ private class PackageManagerInternalImpl extends PackageManagerInternal {
+ @Override
+ public List<ApplicationInfo> getInstalledApplications(
+ @PackageManager.ApplicationInfoFlagsBits long flags, int userId, int callingUid) {
+ return PackageManagerService.this.mComputer.getInstalledApplications(flags, userId,
+ callingUid);
+ }
- public PackageManagerInternalImpl() {
- super(PackageManagerService.this);
+ @Override
+ public boolean isPlatformSigned(String packageName) {
+ PackageStateInternal packageState = getPackageStateInternal(packageName);
+ if (packageState == null) {
+ return false;
+ }
+ SigningDetails signingDetails = packageState.getSigningDetails();
+ return signingDetails.hasAncestorOrSelf(mPlatformPackage.getSigningDetails())
+ || mPlatformPackage.getSigningDetails().checkCapability(signingDetails,
+ SigningDetails.CertCapabilities.PERMISSION);
}
- @NonNull
@Override
- protected Context getContext() {
- return mContext;
+ public boolean isDataRestoreSafe(byte[] restoringFromSigHash, String packageName) {
+ SigningDetails sd = getSigningDetails(packageName);
+ if (sd == null) {
+ return false;
+ }
+ return sd.hasSha256Certificate(restoringFromSigHash,
+ SigningDetails.CertCapabilities.INSTALLED_DATA);
}
- @NonNull
@Override
- protected PermissionManagerServiceInternal getPermissionManager() {
- return mPermissionManager;
+ public boolean isDataRestoreSafe(Signature restoringFromSig, String packageName) {
+ SigningDetails sd = getSigningDetails(packageName);
+ if (sd == null) {
+ return false;
+ }
+ return sd.hasCertificate(restoringFromSig,
+ SigningDetails.CertCapabilities.INSTALLED_DATA);
}
- @NonNull
@Override
- protected AppDataHelper getAppDataHelper() {
- return mAppDataHelper;
+ public boolean hasSignatureCapability(int serverUid, int clientUid,
+ @SigningDetails.CertCapabilities int capability) {
+ SigningDetails serverSigningDetails = getSigningDetails(serverUid);
+ SigningDetails clientSigningDetails = getSigningDetails(clientUid);
+ return serverSigningDetails.checkCapability(clientSigningDetails, capability)
+ || clientSigningDetails.hasAncestorOrSelf(serverSigningDetails);
+
+ }
+
+ private SigningDetails getSigningDetails(@NonNull String packageName) {
+ return PackageManagerService.this.getSigningDetails(packageName);
+ }
+
+ private SigningDetails getSigningDetails(int uid) {
+ return PackageManagerService.this.getSigningDetails(uid);
}
- @NonNull
@Override
- protected PackageObserverHelper getPackageObserverHelper() {
- return mPackageObserverHelper;
+ public boolean isInstantApp(String packageName, int userId) {
+ return PackageManagerService.this.mIPackageManager.isInstantApp(packageName, userId);
}
- @NonNull
@Override
- protected ResolveIntentHelper getResolveIntentHelper() {
- return mResolveIntentHelper;
+ public String getInstantAppPackageName(int uid) {
+ return PackageManagerService.this.getInstantAppPackageName(uid);
}
- @NonNull
@Override
- protected SuspendPackageHelper getSuspendPackageHelper() {
- return mSuspendPackageHelper;
+ public boolean filterAppAccess(AndroidPackage pkg, int callingUid, int userId) {
+ return PackageManagerService.this.filterAppAccess(pkg, callingUid, userId);
}
- @NonNull
@Override
- protected ProtectedPackages getProtectedPackages() {
- return mProtectedPackages;
+ public boolean filterAppAccess(String packageName, int callingUid, int userId) {
+ return PackageManagerService.this.filterAppAccess(packageName, callingUid, userId);
}
- @NonNull
@Override
- protected UserNeedsBadgingCache getUserNeedsBadging() {
- return mUserNeedsBadging;
+ public boolean filterAppAccess(int uid, int callingUid) {
+ return PackageManagerService.this.filterAppAccess(uid, callingUid);
}
- @NonNull
+ @Nullable
@Override
- protected InstantAppRegistry getInstantAppRegistry() {
- return mInstantAppRegistry;
+ public int[] getVisibilityAllowList(@NonNull String packageName, int userId) {
+ return PackageManagerService.this.getVisibilityAllowList(packageName, userId);
}
- @NonNull
@Override
- protected ApexManager getApexManager() {
- return mApexManager;
+ public boolean canQueryPackage(int callingUid, @Nullable String packageName) {
+ return PackageManagerService.this.canQueryPackage(callingUid, packageName);
}
- @NonNull
@Override
- protected DexManager getDexManager() {
- return mDexManager;
+ public AndroidPackage getPackage(String packageName) {
+ return PackageManagerService.this.getPackage(packageName);
}
+ @Nullable
@Override
- public boolean isPlatformSigned(String packageName) {
- PackageStateInternal packageState = snapshot().getPackageStateInternal(packageName);
- if (packageState == null) {
- return false;
- }
- SigningDetails signingDetails = packageState.getSigningDetails();
- return signingDetails.hasAncestorOrSelf(mPlatformPackage.getSigningDetails())
- || mPlatformPackage.getSigningDetails().checkCapability(signingDetails,
- SigningDetails.CertCapabilities.PERMISSION);
+ public AndroidPackageApi getAndroidPackage(@NonNull String packageName) {
+ return PackageManagerService.this.getPackage(packageName);
}
@Override
- public boolean isDataRestoreSafe(byte[] restoringFromSigHash, String packageName) {
- final Computer snapshot = snapshot();
- SigningDetails sd = snapshot.getSigningDetails(packageName);
- if (sd == null) {
- return false;
- }
- return sd.hasSha256Certificate(restoringFromSigHash,
- SigningDetails.CertCapabilities.INSTALLED_DATA);
+ public AndroidPackage getPackage(int uid) {
+ return PackageManagerService.this.getPackage(uid);
}
@Override
- public boolean isDataRestoreSafe(Signature restoringFromSig, String packageName) {
- final Computer snapshot = snapshot();
- SigningDetails sd = snapshot.getSigningDetails(packageName);
- if (sd == null) {
- return false;
- }
- return sd.hasCertificate(restoringFromSig,
- SigningDetails.CertCapabilities.INSTALLED_DATA);
+ public List<AndroidPackage> getPackagesForAppId(int appId) {
+ return mComputer.getPackagesForAppId(appId);
}
+ @Nullable
@Override
- public boolean hasSignatureCapability(int serverUid, int clientUid,
- @SigningDetails.CertCapabilities int capability) {
- final Computer snapshot = snapshot();
- SigningDetails serverSigningDetails = snapshot.getSigningDetails(serverUid);
- SigningDetails clientSigningDetails = snapshot.getSigningDetails(clientUid);
- return serverSigningDetails.checkCapability(clientSigningDetails, capability)
- || clientSigningDetails.hasAncestorOrSelf(serverSigningDetails);
+ public PackageStateInternal getPackageStateInternal(String packageName) {
+ return PackageManagerService.this.getPackageStateInternal(packageName);
+ }
+
+ @Nullable
+ @Override
+ public PackageState getPackageState(@NonNull String packageName) {
+ return PackageManagerService.this.getPackageState(packageName);
+ }
+
+ @NonNull
+ @Override
+ public ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
+ return PackageManagerService.this.getPackageStates();
}
@Override
public PackageList getPackageList(@Nullable PackageListObserver observer) {
final ArrayList<String> list = new ArrayList<>();
- PackageManagerService.this.forEachPackageState(snapshot(), packageState -> {
+ forEachPackageState(packageState -> {
AndroidPackage pkg = packageState.getPkg();
if (pkg != null) {
list.add(pkg.getPackageName());
@@ -6147,9 +7263,19 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public void removePackageListObserver(PackageListObserver observer) {
+ mPackageObserverHelper.removeObserver(observer);
+ }
+
+ @Override
+ public PackageStateInternal getDisabledSystemPackage(@NonNull String packageName) {
+ return snapshotComputer().getDisabledSystemPackage(packageName);
+ }
+
+ @Override
public @Nullable
String getDisabledSystemPackageName(@NonNull String packageName) {
- PackageStateInternal disabledPkgSetting = snapshot().getDisabledSystemPackage(
+ PackageStateInternal disabledPkgSetting = getDisabledSystemPackage(
packageName);
AndroidPackage disabledPkg = disabledPkgSetting == null
? null : disabledPkgSetting.getPkg();
@@ -6157,15 +7283,51 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public @NonNull String[] getKnownPackageNames(int knownPackage, int userId) {
+ return PackageManagerService.this.getKnownPackageNamesInternal(knownPackage, userId);
+ }
+
+ @Override
+ public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) {
+ if (packageName == null) {
+ return false;
+ }
+
+ if (Process.isSdkSandboxUid(callingUid)) {
+ return packageName.equals(getSdkSandboxPackageName());
+ }
+ int uid = getPackageUid(packageName, 0, userId);
+ return UserHandle.isSameApp(uid, callingUid);
+ }
+
+ @Override
public boolean isResolveActivityComponent(ComponentInfo component) {
return mResolveActivity.packageName.equals(component.packageName)
&& mResolveActivity.name.equals(component.name);
}
@Override
+ public void setKeepUninstalledPackages(final List<String> packageList) {
+ PackageManagerService.this.setKeepUninstalledPackagesInternal(packageList);
+ }
+
+ @Override
+ public boolean isPermissionsReviewRequired(String packageName, int userId) {
+ return mPermissionManager.isPermissionsReviewRequired(packageName, userId);
+ }
+
+ @Override
+ public PackageInfo getPackageInfo(
+ String packageName, @PackageManager.PackageInfoFlagsBits long flags,
+ int filterCallingUid, int userId) {
+ return PackageManagerService.this.mComputer
+ .getPackageInfoInternal(packageName, PackageManager.VERSION_CODE_HIGHEST,
+ flags, filterCallingUid, userId);
+ }
+
+ @Override
public long getCeDataInode(String packageName, int userId) {
- final PackageStateInternal packageState =
- snapshot().getPackageStateInternal(packageName);
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
if (packageState == null) {
return 0;
} else {
@@ -6174,6 +7336,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public Bundle getSuspendedPackageLauncherExtras(String packageName, int userId) {
+ return mSuspendPackageHelper.getSuspendedPackageLauncherExtras(
+ packageName, userId, Binder.getCallingUid());
+ }
+
+ @Override
+ public boolean isPackageSuspended(String packageName, int userId) {
+ return mSuspendPackageHelper.isPackageSuspended(
+ packageName, userId, Binder.getCallingUid());
+ }
+
+ @Override
public void removeAllNonSystemPackageSuspensions(int userId) {
final Computer computer = snapshotComputer();
final String[] allPackages = computer.getAllAvailablePackageNames();
@@ -6183,6 +7357,14 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public void removeNonSystemPackageSuspensions(String packageName, int userId) {
+ mSuspendPackageHelper.removeSuspensionsBySuspendingPackage(snapshotComputer(),
+ new String[]{packageName},
+ (suspendingPackage) -> !PLATFORM_PACKAGE_NAME.equals(suspendingPackage),
+ userId);
+ }
+
+ @Override
public void flushPackageRestrictions(int userId) {
synchronized (mLock) {
PackageManagerService.this.flushPackageRestrictionsAsUserInternalLocked(userId);
@@ -6190,6 +7372,103 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public void removeDistractingPackageRestrictions(String packageName, int userId) {
+ PackageManagerService.this.removeDistractingPackageRestrictions(
+ new String[]{packageName}, userId);
+ }
+
+ @Override
+ public void removeAllDistractingPackageRestrictions(int userId) {
+ PackageManagerService.this.removeAllDistractingPackageRestrictions(userId);
+ }
+
+ @Override
+ public String getSuspendingPackage(String suspendedPackage, int userId) {
+ return mSuspendPackageHelper.getSuspendingPackage(
+ suspendedPackage, userId, Binder.getCallingUid());
+ }
+
+ @Override
+ public SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage,
+ String suspendingPackage, int userId) {
+ return mSuspendPackageHelper.getSuspendedDialogInfo(
+ suspendedPackage, suspendingPackage, userId, Binder.getCallingUid());
+ }
+
+ @Override
+ public int getDistractingPackageRestrictions(String packageName, int userId) {
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
+ return (packageState == null) ? RESTRICTION_NONE
+ : packageState.getUserStateOrDefault(userId).getDistractionFlags();
+ }
+
+ @Override
+ public int getPackageUid(String packageName,
+ @PackageManager.PackageInfoFlagsBits long flags, int userId) {
+ return PackageManagerService.this
+ .getPackageUidInternal(packageName, flags, userId, Process.SYSTEM_UID);
+ }
+
+ @Override
+ public ApplicationInfo getApplicationInfo(
+ String packageName, @PackageManager.ApplicationInfoFlagsBits long flags,
+ int filterCallingUid, int userId) {
+ return PackageManagerService.this
+ .getApplicationInfoInternal(packageName, flags, filterCallingUid, userId);
+ }
+
+ @Override
+ public ActivityInfo getActivityInfo(
+ ComponentName component, @PackageManager.ComponentInfoFlagsBits long flags,
+ int filterCallingUid, int userId) {
+ return PackageManagerService.this
+ .getActivityInfoInternal(component, flags, filterCallingUid, userId);
+ }
+
+ @Override
+ public List<ResolveInfo> queryIntentActivities(
+ Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+ int filterCallingUid, int userId) {
+ return snapshotComputer().queryIntentActivitiesInternal(intent, resolvedType, flags,
+ userId);
+ }
+
+ @Override
+ public List<ResolveInfo> queryIntentReceivers(Intent intent,
+ String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
+ int filterCallingUid, int userId) {
+ return PackageManagerService.this.mResolveIntentHelper.queryIntentReceiversInternal(
+ snapshotComputer(), intent, resolvedType, flags, userId, filterCallingUid);
+ }
+
+ @Override
+ public List<ResolveInfo> queryIntentServices(
+ Intent intent, @PackageManager.ResolveInfoFlagsBits long flags, int callingUid,
+ int userId) {
+ final String resolvedType = intent.resolveTypeIfNeeded(mContext.getContentResolver());
+ return PackageManagerService.this
+ .queryIntentServicesInternal(intent, resolvedType, flags, userId, callingUid,
+ false);
+ }
+
+ @Override
+ public ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
+ int userId) {
+ return PackageManagerService.this.getHomeActivitiesAsUser(allHomeCandidates, userId);
+ }
+
+ @Override
+ public ComponentName getDefaultHomeActivity(int userId) {
+ return PackageManagerService.this.getDefaultHomeActivity(userId);
+ }
+
+ @Override
+ public ComponentName getSystemUiServiceComponent() {
+ return ComponentName.unflattenFromString(mContext.getResources().getString(
+ com.android.internal.R.string.config_systemUIServiceComponent));
+ }
+
+ @Override
public void setDeviceAndProfileOwnerPackages(
int deviceOwnerUserId, String deviceOwnerPackage,
SparseArray<String> profileOwnerPackages) {
@@ -6208,6 +7487,118 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public void setDeviceOwnerProtectedPackages(
+ String deviceOwnerPackageName, List<String> packageNames) {
+ mProtectedPackages.setDeviceOwnerProtectedPackages(
+ deviceOwnerPackageName, packageNames);
+ }
+
+ @Override
+ public boolean isPackageDataProtected(int userId, String packageName) {
+ return mProtectedPackages.isPackageDataProtected(userId, packageName);
+ }
+
+ @Override
+ public boolean isPackageStateProtected(String packageName, int userId) {
+ return mProtectedPackages.isPackageStateProtected(userId, packageName);
+ }
+
+ @Override
+ public boolean isPackageEphemeral(int userId, String packageName) {
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
+ return packageState != null
+ && packageState.getUserStateOrDefault(userId).isInstantApp();
+ }
+
+ @Override
+ public boolean wasPackageEverLaunched(String packageName, int userId) {
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
+ if (packageState == null) {
+ throw new IllegalArgumentException("Unknown package: " + packageName);
+ }
+ return !packageState.getUserStateOrDefault(userId).isNotLaunched();
+ }
+
+ @Override
+ public boolean isEnabledAndMatches(ParsedMainComponent component, long flags, int userId) {
+ return PackageStateUtils.isEnabledAndMatches(
+ getPackageStateInternal(component.getPackageName()), component, flags, userId);
+ }
+
+ @Override
+ public boolean userNeedsBadging(int userId) {
+ synchronized (mLock) {
+ return PackageManagerService.this.userNeedsBadging(userId);
+ }
+ }
+
+ @Override
+ public String getNameForUid(int uid) {
+ return mIPackageManager.getNameForUid(uid);
+ }
+
+ @Override
+ public void requestInstantAppResolutionPhaseTwo(AuxiliaryResolveInfo responseObj,
+ Intent origIntent, String resolvedType, String callingPackage,
+ @Nullable String callingFeatureId, boolean isRequesterInstantApp,
+ Bundle verificationBundle, int userId) {
+ PackageManagerService.this.requestInstantAppResolutionPhaseTwo(responseObj, origIntent,
+ resolvedType, callingPackage, callingFeatureId, isRequesterInstantApp,
+ verificationBundle, userId);
+ }
+
+ @Override
+ public void grantImplicitAccess(int userId, Intent intent,
+ int recipientAppId, int visibleUid, boolean direct) {
+ grantImplicitAccess(userId, intent, recipientAppId, visibleUid, direct,
+ false /* retainOnUpdate */);
+ }
+
+ @Override
+ public void grantImplicitAccess(int userId, Intent intent,
+ int recipientAppId, int visibleUid, boolean direct, boolean retainOnUpdate) {
+ Computer computer = snapshotComputer();
+ final AndroidPackage visiblePackage = computer.getPackage(visibleUid);
+ final int recipientUid = UserHandle.getUid(userId, recipientAppId);
+ if (visiblePackage == null || computer.getPackage(recipientUid) == null) {
+ return;
+ }
+
+ final boolean instantApp = computer.isInstantAppInternal(
+ visiblePackage.getPackageName(), userId, visibleUid);
+ final boolean accessGranted;
+ if (instantApp) {
+ if (!direct) {
+ // if the interaction that lead to this granting access to an instant app
+ // was indirect (i.e.: URI permission grant), do not actually execute the
+ // grant.
+ return;
+ }
+ accessGranted = mInstantAppRegistry.grantInstantAccess(userId, intent,
+ recipientAppId, UserHandle.getAppId(visibleUid) /*instantAppId*/);
+ } else {
+ accessGranted = mAppsFilter.grantImplicitAccess(recipientUid, visibleUid,
+ retainOnUpdate);
+ }
+
+ if (accessGranted) {
+ ApplicationPackageManager.invalidateGetPackagesForUidCache();
+ }
+ }
+
+ @Override
+ public boolean isInstantAppInstallerComponent(ComponentName component) {
+ final ActivityInfo instantAppInstallerActivity = mInstantAppInstallerActivity;
+ return instantAppInstallerActivity != null
+ && instantAppInstallerActivity.getComponentName().equals(component);
+ }
+
+ @Override
+ public void pruneInstantApps() {
+ mInstantAppRegistry.pruneInstantApps(snapshotComputer());
+ }
+
+ @Override
public void pruneCachedApksInApex(@NonNull List<PackageInfo> apexPackages) {
if (mCacheDir == null) {
return;
@@ -6215,12 +7606,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final PackageCacher cacher = new PackageCacher(mCacheDir);
synchronized (mLock) {
- final Computer snapshot = snapshot();
for (int i = 0, size = apexPackages.size(); i < size; i++) {
final List<String> apkNames =
mApexManager.getApksInApex(apexPackages.get(i).packageName);
for (int j = 0, apksInApex = apkNames.size(); j < apksInApex; j++) {
- final AndroidPackage pkg = snapshot.getPackage(apkNames.get(j));
+ final AndroidPackage pkg = getPackage(apkNames.get(j));
cacher.cleanCachedResult(new File(pkg.getPath()));
}
}
@@ -6228,6 +7618,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public String getSetupWizardPackageName() {
+ return mSetupWizardPackage;
+ }
+
public void setExternalSourcesPolicy(ExternalSourcesPolicy policy) {
if (policy != null) {
mExternalSourcesPolicy = policy;
@@ -6236,8 +7630,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override
public boolean isPackagePersistent(String packageName) {
- final PackageStateInternal packageState =
- snapshot().getPackageStateInternal(packageName);
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
if (packageState == null) {
return false;
}
@@ -6248,20 +7641,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override
public List<PackageInfo> getOverlayPackages(int userId) {
- final Computer snapshot = snapshotComputer();
final ArrayList<PackageInfo> overlayPackages = new ArrayList<>();
- final ArrayMap<String, ? extends PackageStateInternal> packageStates =
- snapshot.getPackageStates();
- for (int index = 0; index < packageStates.size(); index++) {
- final PackageStateInternal packageState = packageStates.valueAt(index);
+ forEachPackageState(packageState -> {
final AndroidPackage pkg = packageState.getPkg();
if (pkg != null && pkg.getOverlayTarget() != null) {
- PackageInfo pkgInfo = snapshot.generatePackageInfo(packageState, 0, userId);
+ PackageInfo pkgInfo = generatePackageInfo(packageState, 0, userId);
if (pkgInfo != null) {
overlayPackages.add(pkgInfo);
}
}
- }
+ });
return overlayPackages;
}
@@ -6269,7 +7658,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override
public List<String> getTargetPackageNames(int userId) {
List<String> targetPackages = new ArrayList<>();
- PackageManagerService.this.forEachPackageState(snapshot(), packageState -> {
+ forEachPackageState(packageState -> {
final AndroidPackage pkg = packageState.getPkg();
if (pkg != null && !pkg.isOverlay()) {
targetPackages.add(pkg.getPackageName());
@@ -6287,6 +7676,30 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public ResolveInfo resolveIntent(Intent intent, String resolvedType,
+ @PackageManager.ResolveInfoFlagsBits long flags,
+ @PackageManagerInternal.PrivateResolveFlags long privateResolveFlags, int userId,
+ boolean resolveForStart, int filterCallingUid) {
+ return mResolveIntentHelper.resolveIntentInternal(snapshotComputer(),
+ intent, resolvedType, flags, privateResolveFlags, userId, resolveForStart,
+ filterCallingUid);
+ }
+
+ @Override
+ public ResolveInfo resolveService(Intent intent, String resolvedType,
+ @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) {
+ return mResolveIntentHelper.resolveServiceInternal(snapshotComputer(), intent,
+ resolvedType, flags, userId, callingUid);
+ }
+
+ @Override
+ public ProviderInfo resolveContentProvider(String name,
+ @PackageManager.ResolveInfoFlagsBits long flags, int userId, int callingUid) {
+ return PackageManagerService.this.mComputer
+ .resolveContentProvider(name, flags, userId,callingUid);
+ }
+
+ @Override
public void addIsolatedUid(int isolatedUid, int ownerUid) {
synchronized (mLock) {
mIsolatedOwners.put(isolatedUid, ownerUid);
@@ -6301,12 +7714,146 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public int getUidTargetSdkVersion(int uid) {
+ return PackageManagerService.this.getUidTargetSdkVersion(uid);
+ }
+
+ @Override
+ public int getPackageTargetSdkVersion(String packageName) {
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
+ if (packageState != null && packageState.getPkg() != null) {
+ return packageState.getPkg().getTargetSdkVersion();
+ }
+ return Build.VERSION_CODES.CUR_DEVELOPMENT;
+ }
+
+ @Override
+ public boolean canAccessInstantApps(int callingUid, int userId) {
+ return PackageManagerService.this.canViewInstantApps(callingUid, userId);
+ }
+
+ @Override
+ public boolean canAccessComponent(int callingUid, @NonNull ComponentName component,
+ @UserIdInt int userId) {
+ return mComputer.canAccessComponent(callingUid, component, userId);
+ }
+
+ @Override
+ public boolean hasInstantApplicationMetadata(String packageName, int userId) {
+ return mInstantAppRegistry.hasInstantApplicationMetadata(packageName, userId);
+ }
+
+ @Override
public void notifyPackageUse(String packageName, int reason) {
synchronized (mLock) {
PackageManagerService.this.notifyPackageUseInternal(packageName, reason);
}
}
+ @Override
+ public void onPackageProcessKilledForUninstall(String packageName) {
+ mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName,
+ true /* killApp */));
+ }
+
+ @Override
+ public SparseArray<String> getAppsWithSharedUserIds() {
+ return mComputer.getAppsWithSharedUserIds();
+ }
+
+ @Override
+ @NonNull
+ public String[] getSharedUserPackagesForPackage(String packageName, int userId) {
+ return mComputer.getSharedUserPackagesForPackage(packageName, userId);
+ }
+
+ @Override
+ public ArrayMap<String, ProcessInfo> getProcessesForUid(int uid) {
+ return mComputer.getProcessesForUid(uid);
+ }
+
+ @Override
+ public int[] getPermissionGids(String permissionName, int userId) {
+ return mPermissionManager.getPermissionGids(permissionName, userId);
+ }
+
+ @Override
+ public boolean isOnlyCoreApps() {
+ return mIPackageManager.isOnlyCoreApps();
+ }
+
+ @Override
+ public void freeStorage(String volumeUuid, long bytes,
+ @StorageManager.AllocateFlags int flags) throws IOException {
+ PackageManagerService.this.freeStorage(volumeUuid, bytes, flags);
+ }
+
+ @Override
+ public void freeAllAppCacheAboveQuota(@NonNull String volumeUuid) throws IOException {
+ PackageManagerService.this.freeAllAppCacheAboveQuota(volumeUuid);
+ }
+
+ @Override
+ public void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
+ PackageManagerService.this.forEachPackageSetting(actionLocked);
+ }
+
+ @Override
+ public void forEachPackageState(Consumer<PackageStateInternal> action) {
+ PackageManagerService.this.forEachPackageState(action);
+ }
+
+ @Override
+ public void forEachPackage(Consumer<AndroidPackage> action) {
+ PackageManagerService.this.forEachPackage(action);
+ }
+
+ @Override
+ public void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action,
+ @UserIdInt int userId) {
+ PackageManagerService.this.forEachInstalledPackage(action, userId);
+ }
+
+ @Override
+ public ArraySet<String> getEnabledComponents(String packageName, int userId) {
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
+ if (packageState == null) {
+ return new ArraySet<>();
+ }
+ return packageState.getUserStateOrDefault(userId).getEnabledComponents();
+ }
+
+ @Override
+ public ArraySet<String> getDisabledComponents(String packageName, int userId) {
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
+ if (packageState == null) {
+ return new ArraySet<>();
+ }
+ return packageState.getUserStateOrDefault(userId).getDisabledComponents();
+ }
+
+ @Override
+ public @PackageManager.EnabledState int getApplicationEnabledState(
+ String packageName, int userId) {
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
+ if (packageState == null) {
+ return COMPONENT_ENABLED_STATE_DEFAULT;
+ }
+ return packageState.getUserStateOrDefault(userId).getEnabledState();
+ }
+
+ @Override
+ public @PackageManager.EnabledState int getComponentEnabledSetting(
+ @NonNull ComponentName componentName, int callingUid, int userId) {
+ return PackageManagerService.this.mComputer.getComponentEnabledSettingInternal(
+ componentName, callingUid, userId);
+ }
+
+ @Override
+ public void setEnableRollbackCode(int token, int enableRollbackCode) {
+ PackageManagerService.this.setEnableRollbackCode(token, enableRollbackCode);
+ }
+
/**
* Ask the package manager to compile layouts in the given package.
*/
@@ -6322,6 +7869,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return mArtManagerService.compileLayouts(pkg);
}
+ @Override
+ public void finishPackageInstall(int token, boolean didLaunch) {
+ mIPackageManager.finishPackageInstall(token, didLaunch);
+ }
+
@Nullable
@Override
public String removeLegacyDefaultBrowserPackageName(int userId) {
@@ -6331,6 +7883,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public boolean isApexPackage(String packageName) {
+ return PackageManagerService.this.mApexManager.isApexPackage(packageName);
+ }
+
+ @Override
+ public List<String> getApksInApex(String apexPackageName) {
+ return PackageManagerService.this.mApexManager.getApksInApex(apexPackageName);
+ }
+
+ @Override
public void uninstallApex(String packageName, long versionCode, int userId,
IntentSender intentSender, int flags) {
final int callerUid = Binder.getCallingUid();
@@ -6405,6 +7967,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public boolean isCallerInstallerOfRecord(@NonNull AndroidPackage pkg, int callingUid) {
+ return mComputer.isCallerInstallerOfRecord(pkg, callingUid);
+ }
+
+ @Override
public boolean isPermissionUpgradeNeeded(int userId) {
return mSettings.isPermissionUpgradeNeeded(userId);
}
@@ -6418,9 +7985,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public List<String> getMimeGroup(String packageName, String mimeGroup) {
+ return PackageManagerService.this.getMimeGroupInternal(packageName, mimeGroup);
+ }
+
+ @Override
public void setVisibilityLogging(String packageName, boolean enable) {
- final PackageStateInternal packageState =
- snapshot().getPackageStateInternal(packageName);
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
if (packageState == null) {
throw new IllegalStateException("No package found for " + packageName);
}
@@ -6428,6 +7999,12 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public boolean isSystemPackage(@NonNull String packageName) {
+ return packageName.equals(
+ PackageManagerService.this.ensureSystemPackageName(packageName));
+ }
+
+ @Override
public void clearBlockUninstallForUser(@UserIdInt int userId) {
synchronized (mLock) {
mSettings.clearBlockUninstallLPw(userId);
@@ -6436,11 +8013,21 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
+ public void unsuspendForSuspendingPackage(final String packageName, int affectedUser) {
+ PackageManagerService.this.unsuspendForSuspendingPackage(snapshotComputer(),
+ packageName, affectedUser);
+ }
+
+ @Override
+ public boolean isSuspendingAnyPackages(String suspendingPackage, int userId) {
+ return PackageManagerService.this.isSuspendingAnyPackages(suspendingPackage, userId);
+ }
+
+ @Override
public boolean registerInstalledLoadingProgressCallback(String packageName,
PackageManagerInternal.InstalledLoadingProgressCallback callback, int userId) {
- final Computer snapshot = snapshotComputer();
- final PackageStateInternal ps = filterPackageStateForInstalledAndFiltered(snapshot,
- packageName, Binder.getCallingUid(), userId);
+ final PackageStateInternal ps =
+ getPackageStateInstalledFiltered(packageName, Binder.getCallingUid(), userId);
if (ps == null) {
return false;
}
@@ -6461,9 +8048,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
@Override
public IncrementalStatesInfo getIncrementalStatesInfo(
@NonNull String packageName, int filterCallingUid, int userId) {
- final Computer snapshot = snapshotComputer();
- final PackageStateInternal ps = filterPackageStateForInstalledAndFiltered(snapshot,
- packageName, filterCallingUid, userId);
+ final PackageStateInternal ps =
+ getPackageStateInstalledFiltered(packageName, filterCallingUid, userId);
if (ps == null) {
return null;
}
@@ -6471,23 +8057,74 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
@Override
- public boolean isSameApp(@Nullable String packageName, int callingUid, int userId) {
- if (packageName == null) {
- return false;
- }
+ public void requestChecksums(@NonNull String packageName, boolean includeSplits,
+ @Checksum.TypeMask int optional, @Checksum.TypeMask int required,
+ @Nullable List trustedInstallers,
+ @NonNull IOnChecksumsReadyListener onChecksumsReadyListener, int userId,
+ @NonNull Executor executor, @NonNull Handler handler) {
+ requestChecksumsInternal(packageName, includeSplits, optional, required,
+ trustedInstallers, onChecksumsReadyListener, userId, executor, handler);
+ }
- if (Process.isSdkSandboxUid(callingUid)) {
- return packageName.equals(mRequiredSdkSandboxPackage);
- }
- Computer snapshot = snapshot();
- int uid = snapshot.getPackageUid(packageName, 0, userId);
- return UserHandle.isSameApp(uid, callingUid);
+ @Override
+ public boolean isPackageFrozen(@NonNull String packageName,
+ int callingUid, int userId) {
+ return PackageManagerService.this.getPackageStartability(
+ packageName, callingUid, userId) == PACKAGE_STARTABILITY_FROZEN;
}
@Override
- public void onPackageProcessKilledForUninstall(String packageName) {
- mHandler.post(() -> PackageManagerService.this.notifyInstallObserver(packageName,
- true /* killApp */));
+ public long deleteOatArtifactsOfPackage(String packageName) {
+ return PackageManagerService.this.deleteOatArtifactsOfPackage(packageName);
+ }
+
+ @Override
+ public void reconcileAppsData(int userId, @StorageManager.StorageFlags int flags,
+ boolean migrateAppsData) {
+ PackageManagerService.this.mAppDataHelper.reconcileAppsData(userId, flags,
+ migrateAppsData);
+ }
+
+ @Override
+ @NonNull
+ public ArraySet<PackageStateInternal> getSharedUserPackages(int sharedUserAppId) {
+ return PackageManagerService.this.mComputer.getSharedUserPackages(sharedUserAppId);
+ }
+
+ @Override
+ @Nullable
+ public SharedUserApi getSharedUserApi(int sharedUserAppId) {
+ return mComputer.getSharedUser(sharedUserAppId);
+ }
+
+ @NonNull
+ @Override
+ public PackageStateMutator.InitialState recordInitialState() {
+ return PackageManagerService.this.recordInitialState();
+ }
+
+ @Nullable
+ @Override
+ public PackageStateMutator.Result commitPackageStateMutation(
+ @Nullable PackageStateMutator.InitialState state,
+ @NonNull Consumer<PackageStateMutator> consumer) {
+ return PackageManagerService.this.commitPackageStateMutation(state, consumer);
+ }
+
+ @NonNull
+ @Override
+ public Computer snapshot() {
+ return snapshotComputer();
+ }
+
+ @Override
+ public void shutdown() {
+ PackageManagerService.this.shutdown();
+ }
+
+ @Override
+ public DynamicCodeLogger getDynamicCodeLogger() {
+ return PackageManagerService.this.getDexManager().getDynamicCodeLogger();
}
}
@@ -6602,6 +8239,24 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return mSettings.getDisabledSystemPkgLPr(packageName);
}
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ @Nullable
+ PackageStateInternal getPackageStateInternal(String packageName) {
+ return mComputer.getPackageStateInternal(packageName);
+ }
+
+ @Nullable
+ PackageStateInternal getPackageStateInternal(String packageName, int callingUid) {
+ return mComputer.getPackageStateInternal(packageName, callingUid);
+ }
+
+ @Nullable
+ PackageStateInternal getPackageStateInstalledFiltered(@NonNull String packageName,
+ int callingUid, @UserIdInt int userId) {
+ return filterPackageStateForInstalledAndFiltered(mComputer, packageName, callingUid,
+ userId);
+ }
+
@Nullable
private PackageStateInternal filterPackageStateForInstalledAndFiltered(
@NonNull Computer computer, @NonNull String packageName, int callingUid,
@@ -6617,8 +8272,22 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- @Deprecated
- void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
+ @Nullable
+ private PackageState getPackageState(String packageName) {
+ return mComputer.getPackageStateCopied(packageName);
+ }
+
+ @NonNull
+ ArrayMap<String, ? extends PackageStateInternal> getPackageStates() {
+ Computer computer = snapshotComputer();
+ if (computer == mLiveComputer) {
+ return new ArrayMap<>(computer.getPackageStates());
+ } else {
+ return computer.getPackageStates();
+ }
+ }
+
+ private void forEachPackageSetting(Consumer<PackageSetting> actionLocked) {
synchronized (mLock) {
int size = mSettings.getPackagesLocked().size();
for (int index = 0; index < size; index++) {
@@ -6627,13 +8296,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- void forEachPackageState(@NonNull Computer snapshot, Consumer<PackageStateInternal> consumer) {
- forEachPackageState(snapshot.getPackageStates(), consumer);
+ void forEachPackageState(Consumer<PackageStateInternal> consumer) {
+ forEachPackageState(mComputer.getPackageStates(), consumer);
}
- void forEachPackage(@NonNull Computer snapshot, Consumer<AndroidPackage> consumer) {
+ void forEachPackage(Consumer<AndroidPackage> consumer) {
final ArrayMap<String, ? extends PackageStateInternal> packageStates =
- snapshot.getPackageStates();
+ mComputer.getPackageStates();
int size = packageStates.size();
for (int index = 0; index < size; index++) {
PackageStateInternal packageState = packageStates.valueAt(index);
@@ -6653,7 +8322,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- void forEachInstalledPackage(@NonNull Computer snapshot, @NonNull Consumer<AndroidPackage> action,
+ void forEachInstalledPackage(@NonNull Consumer<AndroidPackage> action,
@UserIdInt int userId) {
Consumer<PackageStateInternal> actionWrapped = packageState -> {
if (packageState.getPkg() != null
@@ -6661,7 +8330,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
action.accept(packageState.getPkg());
}
};
- forEachPackageState(snapshot.getPackageStates(), actionWrapped);
+ forEachPackageState(mComputer.getPackageStates(), actionWrapped);
}
boolean isHistoricalPackageUsageAvailable() {
@@ -6676,7 +8345,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return mCompilerStats.getOrCreatePackageStats(pkgName);
}
- void grantImplicitAccess(@NonNull Computer snapshot, @UserIdInt int userId,
+ /**
+ * Returns true if the system or user is explicitly preventing an otherwise valid installer to
+ * complete an install. This includes checks like unknown sources and user restrictions.
+ */
+ public boolean isInstallDisabledForPackage(String packageName, int uid, int userId) {
+ return mComputer.isInstallDisabledForPackage(packageName, uid, userId);
+ }
+
+ private void grantImplicitAccess(@NonNull Computer snapshot, @UserIdInt int userId,
Intent intent, @AppIdInt int recipientAppId, int visibleUid, boolean direct,
boolean retainOnUpdate) {
final AndroidPackage visiblePackage = snapshot.getPackage(visibleUid);
@@ -6707,8 +8384,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
- boolean canHaveOatDir(@NonNull Computer snapshot, String packageName) {
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ boolean canHaveOatDir(String packageName) {
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
if (packageState == null || packageState.getPkg() == null) {
return false;
}
@@ -6716,8 +8393,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService
packageState.getTransientState().isUpdatedSystemApp());
}
- long deleteOatArtifactsOfPackage(@NonNull Computer snapshot, String packageName) {
- PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ long deleteOatArtifactsOfPackage(String packageName) {
+ PackageStateInternal packageState = getPackageStateInternal(packageName);
if (packageState == null || packageState.getPkg() == null) {
return -1; // error code of deleteOptimizedFiles
}
@@ -6725,9 +8402,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService
ArtUtils.createArtPackageInfo(packageState.getPkg(), packageState));
}
- List<String> getMimeGroupInternal(@NonNull Computer snapshot, String packageName,
- String mimeGroup) {
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ @NonNull
+ Set<String> getUnusedPackages(long downgradeTimeThresholdMillis) {
+ return mComputer.getUnusedPackages(downgradeTimeThresholdMillis);
+ }
+
+ private List<String> getMimeGroupInternal(String packageName, String mimeGroup) {
+ final PackageStateInternal packageState = getPackageStateInternal(packageName);
if (packageState == null) {
return Collections.emptyList();
}
@@ -6792,16 +8473,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService
* Returns the array containing per-uid timeout configuration.
* This is derived from DeviceConfig flags.
*/
- public @NonNull PerUidReadTimeouts[] getPerUidReadTimeouts(@NonNull Computer snapshot) {
+ public @NonNull PerUidReadTimeouts[] getPerUidReadTimeouts() {
PerUidReadTimeouts[] result = mPerUidReadTimeoutsCache;
if (result == null) {
- result = parsePerUidReadTimeouts(snapshot);
+ result = parsePerUidReadTimeouts();
mPerUidReadTimeoutsCache = result;
}
return result;
}
- private @NonNull PerUidReadTimeouts[] parsePerUidReadTimeouts(@NonNull Computer snapshot) {
+ private @NonNull PerUidReadTimeouts[] parsePerUidReadTimeouts() {
final String defaultTimeouts = getDefaultTimeouts();
final String knownDigestersList = getKnownDigestersList();
final List<PerPackageReadTimeouts> perPackageReadTimeouts =
@@ -6815,8 +8496,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
final List<PerUidReadTimeouts> result = new ArrayList<>(perPackageReadTimeouts.size());
for (int i = 0, size = perPackageReadTimeouts.size(); i < size; ++i) {
final PerPackageReadTimeouts perPackage = perPackageReadTimeouts.get(i);
- final PackageStateInternal ps =
- snapshot.getPackageStateInternal(perPackage.packageName);
+ final PackageStateInternal ps = getPackageStateInternal(perPackage.packageName);
if (ps == null) {
if (DEBUG_PER_UID_READ_TIMEOUTS) {
Slog.i(TAG, "PerUidReadTimeouts: package not found = "
@@ -6866,7 +8546,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
return result.toArray(new PerUidReadTimeouts[result.size()]);
}
- void setKeepUninstalledPackagesInternal(@NonNull Computer snapshot, List<String> packageList) {
+ private void setKeepUninstalledPackagesInternal(List<String> packageList) {
Preconditions.checkNotNull(packageList);
synchronized (mKeepUninstalledPackages) {
List<String> toRemove = new ArrayList<>(mKeepUninstalledPackages);
@@ -6876,7 +8556,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mKeepUninstalledPackages.addAll(packageList);
for (int i = 0; i < toRemove.size(); i++) {
- deletePackageIfUnused(snapshot, toRemove.get(i));
+ deletePackageIfUnused(toRemove.get(i));
}
}
}
@@ -6923,44 +8603,43 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mInstrumentation.put(name, instrumentation);
}
- String[] getKnownPackageNamesInternal(@NonNull Computer snapshot, int knownPackage,
- int userId) {
+ String[] getKnownPackageNamesInternal(int knownPackage, int userId) {
switch (knownPackage) {
case PackageManagerInternal.PACKAGE_BROWSER:
return new String[] { mDefaultAppProvider.getDefaultBrowser(userId) };
case PackageManagerInternal.PACKAGE_INSTALLER:
- return snapshot.filterOnlySystemPackages(mRequiredInstallerPackage);
+ return mComputer.filterOnlySystemPackages(mRequiredInstallerPackage);
case PackageManagerInternal.PACKAGE_UNINSTALLER:
- return snapshot.filterOnlySystemPackages(mRequiredUninstallerPackage);
+ return mComputer.filterOnlySystemPackages(mRequiredUninstallerPackage);
case PackageManagerInternal.PACKAGE_SETUP_WIZARD:
- return snapshot.filterOnlySystemPackages(mSetupWizardPackage);
+ return mComputer.filterOnlySystemPackages(mSetupWizardPackage);
case PackageManagerInternal.PACKAGE_SYSTEM:
return new String[]{"android"};
case PackageManagerInternal.PACKAGE_VERIFIER:
- return snapshot.filterOnlySystemPackages(mRequiredVerifierPackage);
+ return mComputer.filterOnlySystemPackages(mRequiredVerifierPackage);
case PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER:
- return snapshot.filterOnlySystemPackages(
+ return mComputer.filterOnlySystemPackages(
mDefaultTextClassifierPackage, mSystemTextClassifierPackageName);
case PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER:
- return snapshot.filterOnlySystemPackages(mRequiredPermissionControllerPackage);
+ return mComputer.filterOnlySystemPackages(mRequiredPermissionControllerPackage);
case PackageManagerInternal.PACKAGE_CONFIGURATOR:
- return snapshot.filterOnlySystemPackages(mConfiguratorPackage);
+ return mComputer.filterOnlySystemPackages(mConfiguratorPackage);
case PackageManagerInternal.PACKAGE_INCIDENT_REPORT_APPROVER:
- return snapshot.filterOnlySystemPackages(mIncidentReportApproverPackage);
+ return mComputer.filterOnlySystemPackages(mIncidentReportApproverPackage);
case PackageManagerInternal.PACKAGE_AMBIENT_CONTEXT_DETECTION:
- return snapshot.filterOnlySystemPackages(mAmbientContextDetectionPackage);
+ return mComputer.filterOnlySystemPackages(mAmbientContextDetectionPackage);
case PackageManagerInternal.PACKAGE_APP_PREDICTOR:
- return snapshot.filterOnlySystemPackages(mAppPredictionServicePackage);
+ return mComputer.filterOnlySystemPackages(mAppPredictionServicePackage);
case PackageManagerInternal.PACKAGE_COMPANION:
- return snapshot.filterOnlySystemPackages(COMPANION_PACKAGE_NAME);
+ return mComputer.filterOnlySystemPackages(COMPANION_PACKAGE_NAME);
case PackageManagerInternal.PACKAGE_RETAIL_DEMO:
return TextUtils.isEmpty(mRetailDemoPackage)
? ArrayUtils.emptyArray(String.class)
: new String[] {mRetailDemoPackage};
case PackageManagerInternal.PACKAGE_OVERLAY_CONFIG_SIGNATURE:
- return snapshot.filterOnlySystemPackages(mOverlayConfigSignaturePackage);
+ return mComputer.filterOnlySystemPackages(getOverlayConfigSignaturePackageName());
case PackageManagerInternal.PACKAGE_RECENTS:
- return snapshot.filterOnlySystemPackages(mRecentsPackage);
+ return mComputer.filterOnlySystemPackages(mRecentsPackage);
default:
return ArrayUtils.emptyArray(String.class);
}
@@ -6980,6 +8659,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService
mDefaultAppProvider.setDefaultBrowser(packageName, async, userId);
}
+ ResolveInfo getInstantAppInstallerInfo() {
+ return mInstantAppInstallerInfo;
+ }
+
PackageUsage getPackageUsage() {
return mPackageUsage;
}
@@ -7071,6 +8754,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService
}
}
+ ResolveInfo getResolveInfo() {
+ return mResolveInfo;
+ }
+
ApplicationInfo getCoreAndroidApplication() {
return mAndroidApplication;
}
diff --git a/services/core/java/com/android/server/pm/PackageSender.java b/services/core/java/com/android/server/pm/PackageSender.java
index 656d5962e1a9..d380098d44b3 100644
--- a/services/core/java/com/android/server/pm/PackageSender.java
+++ b/services/core/java/com/android/server/pm/PackageSender.java
@@ -16,7 +16,6 @@
package com.android.server.pm;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.IIntentReceiver;
import android.os.Bundle;
@@ -31,9 +30,9 @@ interface PackageSender {
Bundle extras, int flags, String targetPkg,
IIntentReceiver finishedReceiver, int[] userIds, int[] instantUserIds,
@Nullable SparseArray<int[]> broadcastAllowList, @Nullable Bundle bOptions);
- void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName,
- boolean sendBootCompleted, boolean includeStopped, int appId, int[] userIds,
- int[] instantUserIds, int dataLoaderType);
+ void sendPackageAddedForNewUsers(String packageName, boolean sendBootCompleted,
+ boolean includeStopped, int appId, int[] userIds, int[] instantUserIds,
+ int dataLoaderType);
void notifyPackageAdded(String packageName, int uid);
void notifyPackageChanged(String packageName, int uid);
void notifyPackageRemoved(String packageName, int uid);
diff --git a/services/core/java/com/android/server/pm/PreferredActivityHelper.java b/services/core/java/com/android/server/pm/PreferredActivityHelper.java
index 9befd6e09eb4..7253ae4e7cb0 100644
--- a/services/core/java/com/android/server/pm/PreferredActivityHelper.java
+++ b/services/core/java/com/android/server/pm/PreferredActivityHelper.java
@@ -25,7 +25,6 @@ import static com.android.server.pm.PackageManagerService.DEBUG_PREFERRED;
import static com.android.server.pm.PackageManagerService.TAG;
import android.annotation.NonNull;
-import android.annotation.UserIdInt;
import android.content.ComponentName;
import android.content.Intent;
import android.content.IntentFilter;
@@ -75,18 +74,17 @@ final class PreferredActivityHelper {
mPm = pm;
}
- private ResolveInfo findPreferredActivityNotLocked(@NonNull Computer snapshot, Intent intent,
- String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
- List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug,
- @UserIdInt int userId) {
- return findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, always,
- removeMatches, debug, userId,
+ private ResolveInfo findPreferredActivityNotLocked(Intent intent, String resolvedType,
+ @PackageManager.ResolveInfoFlagsBits long flags, List<ResolveInfo> query,
+ boolean always, boolean removeMatches, boolean debug, int userId) {
+ return findPreferredActivityNotLocked(
+ intent, resolvedType, flags, query, always, removeMatches, debug, userId,
UserHandle.getAppId(Binder.getCallingUid()) >= Process.FIRST_APPLICATION_UID);
}
// TODO: handle preferred activities missing while user has amnesia
/** <b>must not hold {@link PackageManagerService.mLock}</b> */
- public ResolveInfo findPreferredActivityNotLocked(@NonNull Computer snapshot,
+ public ResolveInfo findPreferredActivityNotLocked(
Intent intent, String resolvedType, @PackageManager.ResolveInfoFlagsBits long flags,
List<ResolveInfo> query, boolean always, boolean removeMatches, boolean debug,
int userId, boolean queryMayBeFiltered) {
@@ -97,7 +95,7 @@ final class PreferredActivityHelper {
if (!mPm.mUserManager.exists(userId)) return null;
PackageManagerService.FindPreferredActivityBodyResult body =
- snapshot.findPreferredActivityInternal(
+ mPm.findPreferredActivityInternal(
intent, resolvedType, flags, query, always,
removeMatches, debug, userId, queryMayBeFiltered);
if (body.mChanged) {
@@ -119,7 +117,7 @@ final class PreferredActivityHelper {
mPm.clearPackagePreferredActivitiesLPw(packageName, changedUsers, userId);
}
if (changedUsers.size() > 0) {
- updateDefaultHomeNotLocked(mPm.snapshotComputer(), changedUsers);
+ updateDefaultHomeNotLocked(changedUsers);
mPm.postPreferredActivityChangedBroadcast(userId);
mPm.scheduleWritePackageRestrictions(userId);
}
@@ -130,7 +128,7 @@ final class PreferredActivityHelper {
*
* @return Whether the ACTION_PREFERRED_ACTIVITY_CHANGED broadcast has been scheduled.
*/
- public boolean updateDefaultHomeNotLocked(@NonNull Computer snapshot, @UserIdInt int userId) {
+ public boolean updateDefaultHomeNotLocked(int userId) {
if (Thread.holdsLock(mPm.mLock)) {
Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName()
+ " is holding mLock", new Throwable());
@@ -141,10 +139,10 @@ final class PreferredActivityHelper {
// before that.
return false;
}
- final Intent intent = snapshot.getHomeIntent();
- final List<ResolveInfo> resolveInfos = snapshot.queryIntentActivitiesInternal(
+ final Intent intent = mPm.getHomeIntent();
+ final List<ResolveInfo> resolveInfos = mPm.snapshotComputer().queryIntentActivitiesInternal(
intent, null, MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, userId);
- final ResolveInfo preferredResolveInfo = findPreferredActivityNotLocked(snapshot,
+ final ResolveInfo preferredResolveInfo = findPreferredActivityNotLocked(
intent, null, 0, resolveInfos, true, false, false, userId);
final String packageName = preferredResolveInfo != null
&& preferredResolveInfo.activityInfo != null
@@ -153,7 +151,8 @@ final class PreferredActivityHelper {
if (TextUtils.equals(currentPackageName, packageName)) {
return false;
}
- final String[] callingPackages = snapshot.getPackagesForUid(Binder.getCallingUid());
+ final String[] callingPackages = mPm.mIPackageManager
+ .getPackagesForUid(Binder.getCallingUid());
if (callingPackages != null && ArrayUtils.contains(callingPackages,
mPm.mRequiredPermissionControllerPackage)) {
// PermissionController manages default home directly.
@@ -175,21 +174,23 @@ final class PreferredActivityHelper {
/**
* Variant that takes a {@link WatchedIntentFilter}
*/
- public void addPreferredActivity(@NonNull Computer snapshot, WatchedIntentFilter filter,
- int match, ComponentName[] set, ComponentName activity, boolean always, int userId,
+ public void addPreferredActivity(WatchedIntentFilter filter, int match,
+ ComponentName[] set, ComponentName activity, boolean always, int userId,
String opname, boolean removeExisting) {
// writer
int callingUid = Binder.getCallingUid();
- snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
+ mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
false /* checkShell */, "add preferred activity");
if (mPm.mContext.checkCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
- if (snapshot.getUidTargetSdkVersion(callingUid)
- < Build.VERSION_CODES.FROYO) {
- Slog.w(TAG, "Ignoring addPreferredActivity() from uid "
- + callingUid);
- return;
+ synchronized (mPm.mLock) {
+ if (mPm.getUidTargetSdkVersion(callingUid)
+ < Build.VERSION_CODES.FROYO) {
+ Slog.w(TAG, "Ignoring addPreferredActivity() from uid "
+ + callingUid);
+ return;
+ }
}
mPm.mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
@@ -213,8 +214,7 @@ final class PreferredActivityHelper {
new PreferredActivity(filter, match, set, activity, always));
mPm.scheduleWritePackageRestrictions(userId);
}
- // Re-snapshot after mLock
- if (!(isHomeFilter(filter) && updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId))) {
+ if (!(isHomeFilter(filter) && updateDefaultHomeNotLocked(userId))) {
mPm.postPreferredActivityChangedBroadcast(userId);
}
}
@@ -222,8 +222,8 @@ final class PreferredActivityHelper {
/**
* Variant that takes a {@link WatchedIntentFilter}
*/
- public void replacePreferredActivity(@NonNull Computer snapshot, WatchedIntentFilter filter,
- int match, ComponentName[] set, ComponentName activity, int userId) {
+ public void replacePreferredActivity(WatchedIntentFilter filter, int match,
+ ComponentName[] set, ComponentName activity, int userId) {
if (filter.countActions() != 1) {
throw new IllegalArgumentException(
"replacePreferredActivity expects filter to have only 1 action.");
@@ -238,14 +238,13 @@ final class PreferredActivityHelper {
}
final int callingUid = Binder.getCallingUid();
- snapshot.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
+ mPm.enforceCrossUserPermission(callingUid, userId, true /* requireFullPermission */,
false /* checkShell */, "replace preferred activity");
if (mPm.mContext.checkCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
synchronized (mPm.mLock) {
- // TODO: Remove lock?
- if (mPm.snapshotComputer().getUidTargetSdkVersion(callingUid)
+ if (mPm.getUidTargetSdkVersion(callingUid)
< Build.VERSION_CODES.FROYO) {
Slog.w(TAG, "Ignoring replacePreferredActivity() from uid "
+ Binder.getCallingUid());
@@ -297,23 +296,21 @@ final class PreferredActivityHelper {
}
}
}
-
- // Retake a snapshot after editing with lock held
- addPreferredActivity(mPm.snapshotComputer(), filter, match, set, activity, true, userId,
+ addPreferredActivity(filter, match, set, activity, true, userId,
"Replacing preferred", false);
}
- public void clearPackagePreferredActivities(@NonNull Computer snapshot, String packageName) {
+ public void clearPackagePreferredActivities(String packageName) {
final int callingUid = Binder.getCallingUid();
- if (snapshot.getInstantAppPackageName(callingUid) != null) {
+ if (mPm.getInstantAppPackageName(callingUid) != null) {
return;
}
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
- if (packageState == null || !snapshot.isCallerSameApp(packageName, callingUid)) {
+ final PackageStateInternal packageState = mPm.getPackageStateInternal(packageName);
+ if (packageState == null || !mPm.isCallerSameApp(packageName, callingUid)) {
if (mPm.mContext.checkCallingOrSelfPermission(
android.Manifest.permission.SET_PREFERRED_APPLICATIONS)
!= PackageManager.PERMISSION_GRANTED) {
- if (snapshot.getUidTargetSdkVersion(callingUid)
+ if (mPm.getUidTargetSdkVersion(callingUid)
< Build.VERSION_CODES.FROYO) {
Slog.w(TAG, "Ignoring clearPackagePreferredActivities() from uid "
+ callingUid);
@@ -323,7 +320,7 @@ final class PreferredActivityHelper {
android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null);
}
}
- if (packageState != null && snapshot.shouldFilterApplication(packageState, callingUid,
+ if (packageState != null && mPm.shouldFilterApplication(packageState, callingUid,
UserHandle.getUserId(callingUid))) {
return;
}
@@ -332,23 +329,23 @@ final class PreferredActivityHelper {
}
/** <b>must not hold {@link #PackageManagerService.mLock}</b> */
- void updateDefaultHomeNotLocked(@NonNull Computer snapshot, SparseBooleanArray userIds) {
+ void updateDefaultHomeNotLocked(SparseBooleanArray userIds) {
if (Thread.holdsLock(mPm.mLock)) {
Slog.wtf(TAG, "Calling thread " + Thread.currentThread().getName()
+ " is holding mLock", new Throwable());
}
for (int i = userIds.size() - 1; i >= 0; --i) {
final int userId = userIds.keyAt(i);
- updateDefaultHomeNotLocked(snapshot, userId);
+ updateDefaultHomeNotLocked(userId);
}
}
- public void setHomeActivity(@NonNull Computer snapshot, ComponentName comp, int userId) {
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ public void setHomeActivity(ComponentName comp, int userId) {
+ if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) {
return;
}
ArrayList<ResolveInfo> homeActivities = new ArrayList<>();
- snapshot.getHomeActivitiesAsUser(homeActivities, userId);
+ mPm.getHomeActivitiesAsUser(homeActivities, userId);
boolean found = false;
@@ -367,7 +364,7 @@ final class PreferredActivityHelper {
throw new IllegalArgumentException("Component " + comp + " cannot be home on user "
+ userId);
}
- replacePreferredActivity(snapshot, getHomeFilter(), IntentFilter.MATCH_CATEGORY_EMPTY,
+ replacePreferredActivity(getHomeFilter(), IntentFilter.MATCH_CATEGORY_EMPTY,
set, comp, userId);
}
@@ -404,7 +401,7 @@ final class PreferredActivityHelper {
mPm.scheduleWritePackageRestrictions(userId);
}
if (isHomeFilter(filter)) {
- updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId);
+ updateDefaultHomeNotLocked(userId);
}
mPm.postPreferredActivityChangedBroadcast(userId);
}
@@ -420,7 +417,7 @@ final class PreferredActivityHelper {
changed = mPm.mSettings.clearPackagePersistentPreferredActivities(packageName, userId);
}
if (changed) {
- updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId);
+ updateDefaultHomeNotLocked(userId);
mPm.postPreferredActivityChangedBroadcast(userId);
mPm.scheduleWritePackageRestrictions(userId);
}
@@ -509,7 +506,7 @@ final class PreferredActivityHelper {
synchronized (mPm.mLock) {
mPm.mSettings.readPreferredActivitiesLPw(readParser, readUserId);
}
- updateDefaultHomeNotLocked(mPm.snapshotComputer(), readUserId);
+ updateDefaultHomeNotLocked(readUserId);
});
} catch (Exception e) {
if (DEBUG_BACKUP) {
@@ -601,7 +598,7 @@ final class PreferredActivityHelper {
mPm.mPermissionManager.resetRuntimePermissions(pkg, userId);
}
}
- updateDefaultHomeNotLocked(mPm.snapshotComputer(), userId);
+ updateDefaultHomeNotLocked(userId);
resetNetworkPolicies(userId);
mPm.scheduleWritePackageRestrictions(userId);
} finally {
@@ -613,11 +610,12 @@ final class PreferredActivityHelper {
mPm.mInjector.getLocalService(NetworkPolicyManagerInternal.class).resetUserState(userId);
}
- public int getPreferredActivities(@NonNull Computer snapshot, List<IntentFilter> outFilters,
- List<ComponentName> outActivities, String packageName) {
+ // TODO: This method should not touch the Computer directly
+ public int getPreferredActivities(List<IntentFilter> outFilters,
+ List<ComponentName> outActivities, String packageName, Computer computer) {
List<WatchedIntentFilter> temp =
WatchedIntentFilter.toWatchedIntentFilterList(outFilters);
- int result = getPreferredActivitiesInternal(snapshot, temp, outActivities, packageName);
+ int result = getPreferredActivitiesInternal(temp, outActivities, packageName, computer);
outFilters.clear();
for (int i = 0; i < temp.size(); i++) {
outFilters.add(temp.get(i).getIntentFilter());
@@ -628,17 +626,16 @@ final class PreferredActivityHelper {
/**
* Variant that takes a {@link WatchedIntentFilter}
*/
- private int getPreferredActivitiesInternal(@NonNull Computer snapshot,
- List<WatchedIntentFilter> outFilters, List<ComponentName> outActivities,
- String packageName) {
+ private int getPreferredActivitiesInternal(List<WatchedIntentFilter> outFilters,
+ List<ComponentName> outActivities, String packageName, Computer computer) {
final int callingUid = Binder.getCallingUid();
- if (snapshot.getInstantAppPackageName(callingUid) != null) {
+ if (mPm.getInstantAppPackageName(callingUid) != null) {
return 0;
}
int num = 0;
final int userId = UserHandle.getCallingUserId();
- PreferredIntentResolver pir = snapshot.getPreferredActivities(userId);
+ PreferredIntentResolver pir = computer.getPreferredActivities(userId);
if (pir != null) {
final Iterator<PreferredActivity> it = pir.filterIterator();
while (it.hasNext()) {
@@ -646,9 +643,8 @@ final class PreferredActivityHelper {
final String prefPackageName = pa.mPref.mComponent.getPackageName();
if (packageName == null
|| (prefPackageName.equals(packageName) && pa.mPref.mAlways)) {
- if (snapshot.shouldFilterApplication(
- snapshot.getPackageStateInternal(prefPackageName), callingUid,
- userId)) {
+ if (mPm.shouldFilterApplication(
+ mPm.getPackageStateInternal(prefPackageName), callingUid, userId)) {
continue;
}
if (outFilters != null) {
@@ -664,8 +660,7 @@ final class PreferredActivityHelper {
return num;
}
- public ResolveInfo findPersistentPreferredActivity(@NonNull Computer snapshot, Intent intent,
- int userId) {
+ public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) {
if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.SYSTEM_UID)) {
throw new SecurityException(
"findPersistentPreferredActivity can only be run by the system");
@@ -676,23 +671,24 @@ final class PreferredActivityHelper {
final int callingUid = Binder.getCallingUid();
intent = PackageManagerServiceUtils.updateIntentForResolve(intent);
final String resolvedType = intent.resolveTypeIfNeeded(mPm.mContext.getContentResolver());
- final long flags = snapshot.updateFlagsForResolve(
+ final long flags = mPm.updateFlagsForResolve(
0, userId, callingUid, false /*includeInstantApps*/,
- snapshot.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId, resolvedType,
+ mPm.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId, resolvedType,
0));
- final List<ResolveInfo> query = snapshot.queryIntentActivitiesInternal(intent,
+ final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent,
resolvedType, flags, userId);
- return snapshot.findPersistentPreferredActivity(intent, resolvedType, flags, query, false,
- userId);
+ synchronized (mPm.mLock) {
+ return mPm.findPersistentPreferredActivityLP(intent, resolvedType, flags, query, false,
+ userId);
+ }
}
/**
* Variant that takes a {@link WatchedIntentFilter}
*/
- public void setLastChosenActivity(@NonNull Computer snapshot, Intent intent,
- String resolvedType, int flags, WatchedIntentFilter filter, int match,
- ComponentName activity) {
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ public void setLastChosenActivity(Intent intent, String resolvedType, int flags,
+ WatchedIntentFilter filter, int match, ComponentName activity) {
+ if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) {
return;
}
final int userId = UserHandle.getCallingUserId();
@@ -706,26 +702,25 @@ final class PreferredActivityHelper {
filter.dump(new PrintStreamPrinter(System.out), " ");
}
intent.setComponent(null);
- final List<ResolveInfo> query = snapshot.queryIntentActivitiesInternal(intent,
+ final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent,
resolvedType, flags, userId);
// Find any earlier preferred or last chosen entries and nuke them
- findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, false, true,
- false, userId);
+ findPreferredActivityNotLocked(
+ intent, resolvedType, flags, query, false, true, false, userId);
// Add the new activity as the last chosen for this filter
- addPreferredActivity(snapshot, filter, match, null, activity, false, userId,
+ addPreferredActivity(filter, match, null, activity, false, userId,
"Setting last chosen", false);
}
- public ResolveInfo getLastChosenActivity(@NonNull Computer snapshot, Intent intent,
- String resolvedType, int flags) {
- if (snapshot.getInstantAppPackageName(Binder.getCallingUid()) != null) {
+ public ResolveInfo getLastChosenActivity(Intent intent, String resolvedType, int flags) {
+ if (mPm.getInstantAppPackageName(Binder.getCallingUid()) != null) {
return null;
}
final int userId = UserHandle.getCallingUserId();
if (DEBUG_PREFERRED) Log.v(TAG, "Querying last chosen activity for " + intent);
- final List<ResolveInfo> query = snapshot.queryIntentActivitiesInternal(intent,
+ final List<ResolveInfo> query = mPm.snapshotComputer().queryIntentActivitiesInternal(intent,
resolvedType, flags, userId);
- return findPreferredActivityNotLocked(snapshot, intent, resolvedType, flags, query, false,
- false, false, userId);
+ return findPreferredActivityNotLocked(
+ intent, resolvedType, flags, query, false, false, false, userId);
}
}
diff --git a/services/core/java/com/android/server/pm/PreferredComponent.java b/services/core/java/com/android/server/pm/PreferredComponent.java
index 2a1ca2c41e64..4ec042f79052 100644
--- a/services/core/java/com/android/server/pm/PreferredComponent.java
+++ b/services/core/java/com/android/server/pm/PreferredComponent.java
@@ -57,6 +57,7 @@ public class PreferredComponent {
private String mParseError;
private final Callbacks mCallbacks;
+ private final String mSetupWizardPackageName;
public interface Callbacks {
public boolean onReadTag(String tagName, TypedXmlPullParser parser)
@@ -71,6 +72,7 @@ public class PreferredComponent {
mAlways = always;
mShortComponent = component.flattenToShortString();
mParseError = null;
+ mSetupWizardPackageName = null;
if (set != null) {
final int N = set.length;
String[] myPackages = new String[N];
@@ -172,6 +174,8 @@ public class PreferredComponent {
mSetPackages = myPackages;
mSetClasses = myClasses;
mSetComponents = myComponents;
+ final PackageManagerInternal packageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
+ mSetupWizardPackageName = packageManagerInternal.getSetupWizardPackageName();
}
public String getParseError() {
@@ -205,7 +209,6 @@ public class PreferredComponent {
final int NQ = query.size();
final int NS = mSetPackages.length;
final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
- String setupWizardPackageName = pmi.getSetupWizardPackageName();
int numMatch = 0;
for (int i=0; i<NQ; i++) {
ResolveInfo ri = query.get(i);
@@ -214,7 +217,7 @@ public class PreferredComponent {
// ignore SetupWizard package's launcher capability because it is only existed
// during SetupWizard is running
- if (excludeSetupWizardPackage && ai.packageName.equals(setupWizardPackageName)) {
+ if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
continue;
}
@@ -304,8 +307,6 @@ public class PreferredComponent {
if (!excludeSetupWizardPackage && NS < NQ) {
return false;
}
- final PackageManagerInternal pmi = LocalServices.getService(PackageManagerInternal.class);
- String setupWizardPackageName = pmi.getSetupWizardPackageName();
for (int i=0; i<NQ; i++) {
ResolveInfo ri = query.get(i);
ActivityInfo ai = ri.activityInfo;
@@ -313,7 +314,7 @@ public class PreferredComponent {
// ignore SetupWizard package's launcher capability because it is only existed
// during SetupWizard is running
- if (excludeSetupWizardPackage && ai.packageName.equals(setupWizardPackageName)) {
+ if (excludeSetupWizardPackage && ai.packageName.equals(mSetupWizardPackageName)) {
continue;
}
diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java
index b181cdd92379..88df843ec8c5 100644
--- a/services/core/java/com/android/server/pm/RemovePackageHelper.java
+++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java
@@ -118,8 +118,7 @@ final class RemovePackageHelper {
public void removePackageLI(AndroidPackage pkg, boolean chatty) {
// Remove the parent package setting
- PackageStateInternal ps = mPm.snapshotComputer()
- .getPackageStateInternal(pkg.getPackageName());
+ PackageStateInternal ps = mPm.getPackageStateInternal(pkg.getPackageName());
if (ps != null) {
removePackageLI(ps.getPackageName(), chatty);
} else if (DEBUG_REMOVE && chatty) {
@@ -272,8 +271,8 @@ final class RemovePackageHelper {
synchronized (mPm.mLock) {
mPm.mDomainVerificationManager.clearPackage(deletedPs.getPackageName());
mPm.mSettings.getKeySetManagerService().removeAppKeySetDataLPw(packageName);
- mPm.mAppsFilter.removePackage(mPm.snapshotComputer()
- .getPackageStateInternal(packageName), false /* isReplace */);
+ mPm.mAppsFilter.removePackage(mPm.getPackageStateInternal(packageName),
+ false /* isReplace */);
removedAppId = mPm.mSettings.removePackageLPw(packageName);
if (outInfo != null) {
outInfo.mRemovedAppId = removedAppId;
@@ -299,8 +298,7 @@ final class RemovePackageHelper {
if (changedUsers.size() > 0) {
final PreferredActivityHelper preferredActivityHelper =
new PreferredActivityHelper(mPm);
- preferredActivityHelper.updateDefaultHomeNotLocked(mPm.snapshotComputer(),
- changedUsers);
+ preferredActivityHelper.updateDefaultHomeNotLocked(changedUsers);
mPm.postPreferredActivityChangedBroadcast(UserHandle.USER_ALL);
}
}
diff --git a/services/core/java/com/android/server/pm/ResolveIntentHelper.java b/services/core/java/com/android/server/pm/ResolveIntentHelper.java
index b74670b77a11..25356a489217 100644
--- a/services/core/java/com/android/server/pm/ResolveIntentHelper.java
+++ b/services/core/java/com/android/server/pm/ResolveIntentHelper.java
@@ -115,7 +115,7 @@ final class ResolveIntentHelper {
if (!mUserManager.exists(userId)) return null;
final int callingUid = Binder.getCallingUid();
flags = computer.updateFlagsForResolve(flags, userId, filterCallingUid, resolveForStart,
- computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId,
+ computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
resolvedType, flags));
computer.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/,
false /*checkShell*/, "resolve intent");
@@ -170,9 +170,9 @@ final class ResolveIntentHelper {
}
// If we have saved a preference for a preferred activity for
// this Intent, use that.
- ResolveInfo ri = mPreferredActivityHelper.findPreferredActivityNotLocked(computer,
- intent, resolvedType, flags, query, true, false, debug,
- userId, queryMayBeFiltered);
+ ResolveInfo ri = mPreferredActivityHelper.findPreferredActivityNotLocked(intent,
+ resolvedType, flags, query, true, false, debug, userId,
+ queryMayBeFiltered);
if (ri != null) {
return ri;
}
@@ -317,7 +317,7 @@ final class ResolveIntentHelper {
final String instantAppPkgName = computer.getInstantAppPackageName(filterCallingUid);
flags = computer.updateFlagsForResolve(flags, userId, filterCallingUid,
false /*includeInstantApps*/,
- computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId,
+ computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
resolvedType, flags));
Intent originalIntent = null;
ComponentName comp = intent.getComponent();
@@ -562,7 +562,7 @@ final class ResolveIntentHelper {
final int callingUid = Binder.getCallingUid();
flags = computer.updateFlagsForResolve(flags, userId, callingUid,
false /*includeInstantApps*/,
- computer.isImplicitImageCaptureIntentAndNotSetByDpc(intent, userId,
+ computer.isImplicitImageCaptureIntentAndNotSetByDpcLocked(intent, userId,
resolvedType, flags));
computer.enforceCrossUserPermission(callingUid, userId, false /*requireFullPermission*/,
false /*checkShell*/, "query intent activity options");
diff --git a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
index 479a404c88bf..3fe079034cf2 100644
--- a/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
+++ b/services/core/java/com/android/server/pm/SharedLibrariesImpl.java
@@ -741,11 +741,9 @@ public final class SharedLibrariesImpl implements SharedLibrariesRead, Watchable
}
SharedLibraryInfo libraryInfo = versionedLib.valueAt(libIdx);
- final Computer snapshot = mPm.snapshotComputer();
-
// Remove the shared library overlays from its dependent packages.
for (int currentUserId : mPm.mUserManager.getUserIds()) {
- final List<VersionedPackage> dependents = snapshot.getPackagesUsingSharedLibrary(
+ final List<VersionedPackage> dependents = mPm.getPackagesUsingSharedLibrary(
libraryInfo, 0, Process.SYSTEM_UID, currentUserId);
if (dependents == null) {
continue;
diff --git a/services/core/java/com/android/server/pm/StorageEventHelper.java b/services/core/java/com/android/server/pm/StorageEventHelper.java
index df19d3e58bfd..bb7e55a4bf40 100644
--- a/services/core/java/com/android/server/pm/StorageEventHelper.java
+++ b/services/core/java/com/android/server/pm/StorageEventHelper.java
@@ -26,13 +26,13 @@ import static com.android.server.pm.PackageManagerService.SCAN_INITIAL;
import static com.android.server.pm.PackageManagerService.TAG;
import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo;
-import android.annotation.NonNull;
import android.app.ResourcesManager;
import android.content.IIntentReceiver;
import android.content.pm.PackageManager;
import android.content.pm.PackagePartitions;
import android.content.pm.UserInfo;
import android.content.pm.VersionedPackage;
+import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
import android.os.Environment;
import android.os.FileUtils;
import android.os.UserHandle;
@@ -48,7 +48,6 @@ import android.util.Slog;
import com.android.internal.policy.AttributeCache;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageStateInternal;
-import com.android.server.pm.pkg.parsing.ParsingPackageUtils;
import java.io.File;
import java.util.ArrayList;
@@ -79,7 +78,7 @@ public final class StorageEventHelper extends StorageEventListener {
// Clean up any users or apps that were removed or recreated
// while this volume was missing
mPm.mUserManager.reconcileUsers(volumeUuid);
- reconcileApps(mPm.snapshotComputer(), volumeUuid);
+ reconcileApps(volumeUuid);
// Clean up any install sessions that expired or were
// cancelled while this volume was missing
@@ -300,8 +299,8 @@ public final class StorageEventHelper extends StorageEventListener {
* aren't expected, either due to uninstallation or reinstallation on
* another volume.
*/
- public void reconcileApps(@NonNull Computer snapshot, String volumeUuid) {
- List<String> absoluteCodePaths = collectAbsoluteCodePaths(snapshot);
+ public void reconcileApps(String volumeUuid) {
+ List<String> absoluteCodePaths = collectAbsoluteCodePaths();
List<File> filesToDelete = null;
final File[] files = FileUtils.listFilesOrEmpty(
@@ -346,10 +345,10 @@ public final class StorageEventHelper extends StorageEventListener {
}
}
- private List<String> collectAbsoluteCodePaths(@NonNull Computer snapshot) {
+ private List<String> collectAbsoluteCodePaths() {
List<String> codePaths = new ArrayList<>();
final ArrayMap<String, ? extends PackageStateInternal> packageStates =
- snapshot.getPackageStates();
+ mPm.getPackageStates();
final int packageCount = packageStates.size();
for (int i = 0; i < packageCount; i++) {
final PackageStateInternal ps = packageStates.valueAt(i);
diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java
index 588dfaf6db78..3ef5599385ce 100644
--- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java
+++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java
@@ -100,14 +100,14 @@ public final class SuspendPackageHelper {
* @return The names of failed packages.
*/
@Nullable
- String[] setPackagesSuspended(@NonNull Computer snapshot, @Nullable String[] packageNames,
+ String[] setPackagesSuspended(@NonNull Computer computer, @Nullable String[] packageNames,
boolean suspended, @Nullable PersistableBundle appExtras,
@Nullable PersistableBundle launcherExtras, @Nullable SuspendDialogInfo dialogInfo,
@NonNull String callingPackage, @UserIdInt int userId, int callingUid) {
if (ArrayUtils.isEmpty(packageNames)) {
return packageNames;
}
- if (suspended && !isSuspendAllowedForUser(snapshot, userId, callingUid)) {
+ if (suspended && !isSuspendAllowedForUser(userId, callingUid)) {
Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId);
return packageNames;
}
@@ -123,7 +123,7 @@ public final class SuspendPackageHelper {
ArraySet<String> modifiedPackages = new ArraySet<>();
final boolean[] canSuspend = suspended
- ? canSuspendPackageForUser(snapshot, packageNames, userId, callingUid) : null;
+ ? canSuspendPackageForUser(computer, packageNames, userId, callingUid) : null;
for (int i = 0; i < packageNames.length; i++) {
final String packageName = packageNames[i];
if (callingPackage.equals(packageName)) {
@@ -133,9 +133,9 @@ public final class SuspendPackageHelper {
continue;
}
final PackageStateInternal packageState =
- snapshot.getPackageStateInternal(packageName);
+ computer.getPackageStateInternal(packageName);
if (packageState == null
- || snapshot.shouldFilterApplication(packageState, callingUid, userId)) {
+ || computer.shouldFilterApplication(packageState, callingUid, userId)) {
Slog.w(TAG, "Could not find package setting for package: " + packageName
+ ". Skipping suspending/un-suspending.");
unmodifiablePackages.add(packageName);
@@ -191,11 +191,9 @@ public final class SuspendPackageHelper {
}
});
- final Computer newSnapshot = mPm.snapshotComputer();
-
if (!changedPackagesList.isEmpty()) {
final String[] changedPackages = changedPackagesList.toArray(new String[0]);
- sendPackagesSuspendedForUser(newSnapshot,
+ sendPackagesSuspendedForUser(
suspended ? Intent.ACTION_PACKAGES_SUSPENDED
: Intent.ACTION_PACKAGES_UNSUSPENDED,
changedPackages, changedUids.toArray(), userId);
@@ -204,7 +202,7 @@ public final class SuspendPackageHelper {
}
// Send the suspension changed broadcast to ensure suspension state is not stale.
if (!modifiedPackages.isEmpty()) {
- sendPackagesSuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED,
+ sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED,
modifiedPackages.toArray(new String[0]), modifiedUids.toArray(), userId);
}
return unmodifiablePackages.toArray(new String[0]);
@@ -219,14 +217,14 @@ public final class SuspendPackageHelper {
* @return The names of packages which are Unsuspendable.
*/
@NonNull
- String[] getUnsuspendablePackagesForUser(@NonNull Computer snapshot,
+ String[] getUnsuspendablePackagesForUser(@NonNull Computer computer,
@NonNull String[] packageNames, @UserIdInt int userId, int callingUid) {
- if (!isSuspendAllowedForUser(snapshot, userId, callingUid)) {
+ if (!isSuspendAllowedForUser(userId, callingUid)) {
Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId);
return packageNames;
}
final ArraySet<String> unactionablePackages = new ArraySet<>();
- final boolean[] canSuspend = canSuspendPackageForUser(snapshot, packageNames, userId,
+ final boolean[] canSuspend = canSuspendPackageForUser(computer, packageNames, userId,
callingUid);
for (int i = 0; i < packageNames.length; i++) {
if (!canSuspend[i]) {
@@ -234,7 +232,7 @@ public final class SuspendPackageHelper {
continue;
}
final PackageStateInternal packageState =
- snapshot.getPackageStateFiltered(packageNames[i], callingUid, userId);
+ computer.getPackageStateFiltered(packageNames[i], callingUid, userId);
if (packageState == null) {
Slog.w(TAG, "Could not find package setting for package: " + packageNames[i]);
unactionablePackages.add(packageNames[i]);
@@ -252,9 +250,8 @@ public final class SuspendPackageHelper {
* @return The app extras of the suspended package.
*/
@Nullable
- Bundle getSuspendedPackageAppExtras(@NonNull Computer snapshot, @NonNull String packageName,
- int userId, int callingUid) {
- final PackageStateInternal ps = snapshot.getPackageStateInternal(packageName, callingUid);
+ Bundle getSuspendedPackageAppExtras(@NonNull String packageName, int userId, int callingUid) {
+ final PackageStateInternal ps = mPm.getPackageStateInternal(packageName, callingUid);
if (ps == null) {
return null;
}
@@ -332,14 +329,12 @@ public final class SuspendPackageHelper {
}
});
- final Computer newSnapshot = mPm.snapshotComputer();
-
mPm.scheduleWritePackageRestrictions(userId);
if (!unsuspendedPackages.isEmpty()) {
final String[] packageArray = unsuspendedPackages.toArray(
new String[unsuspendedPackages.size()]);
sendMyPackageSuspendedOrUnsuspended(packageArray, false, userId);
- sendPackagesSuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_UNSUSPENDED,
+ sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_UNSUSPENDED,
packageArray, unsuspendedUids.toArray(), userId);
}
}
@@ -353,10 +348,10 @@ public final class SuspendPackageHelper {
* @return The launcher extras.
*/
@Nullable
- Bundle getSuspendedPackageLauncherExtras(@NonNull Computer snapshot,
- @NonNull String packageName, int userId, int callingUid) {
- final PackageStateInternal packageState =
- snapshot.getPackageStateInternal(packageName, callingUid);
+ Bundle getSuspendedPackageLauncherExtras(@NonNull String packageName, int userId,
+ int callingUid) {
+ final PackageStateInternal packageState = mPm.getPackageStateInternal(
+ packageName, callingUid);
if (packageState == null) {
return null;
}
@@ -381,10 +376,9 @@ public final class SuspendPackageHelper {
* @param callingUid The caller's uid.
* @return {@code true}, if the given package is suspended.
*/
- boolean isPackageSuspended(@NonNull Computer snapshot, @NonNull String packageName, int userId,
- int callingUid) {
- final PackageStateInternal packageState =
- snapshot.getPackageStateInternal(packageName, callingUid);
+ boolean isPackageSuspended(@NonNull String packageName, int userId, int callingUid) {
+ final PackageStateInternal packageState = mPm.getPackageStateInternal(
+ packageName, callingUid);
return packageState != null && packageState.getUserStateOrDefault(userId)
.isSuspended();
}
@@ -398,9 +392,8 @@ public final class SuspendPackageHelper {
* @return The name of suspending package.
*/
@Nullable
- String getSuspendingPackage(@NonNull Computer snapshot, @NonNull String suspendedPackage,
- int userId, int callingUid) {
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(
+ String getSuspendingPackage(@NonNull String suspendedPackage, int userId, int callingUid) {
+ final PackageStateInternal packageState = mPm.getPackageStateInternal(
suspendedPackage, callingUid);
if (packageState == null) {
return null;
@@ -431,10 +424,9 @@ public final class SuspendPackageHelper {
* @return The dialog info.
*/
@Nullable
- SuspendDialogInfo getSuspendedDialogInfo(@NonNull Computer snapshot,
- @NonNull String suspendedPackage, @NonNull String suspendingPackage, int userId,
- int callingUid) {
- final PackageStateInternal packageState = snapshot.getPackageStateInternal(
+ SuspendDialogInfo getSuspendedDialogInfo(@NonNull String suspendedPackage,
+ @NonNull String suspendingPackage, int userId, int callingUid) {
+ final PackageStateInternal packageState = mPm.getPackageStateInternal(
suspendedPackage, callingUid);
if (packageState == null) {
return null;
@@ -462,9 +454,9 @@ public final class SuspendPackageHelper {
* @param callingUid The caller's uid.
* @return {@code true} if the user is allowed to suspend packages by the caller.
*/
- boolean isSuspendAllowedForUser(@NonNull Computer snapshot, int userId, int callingUid) {
+ boolean isSuspendAllowedForUser(int userId, int callingUid) {
final UserManagerService userManager = mInjector.getUserManagerService();
- return isCallerDeviceOrProfileOwner(snapshot, userId, callingUid)
+ return isCallerDeviceOrProfileOwner(userId, callingUid)
|| (!userManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL, userId)
&& !userManager.hasUserRestriction(UserManager.DISALLOW_UNINSTALL_APPS, userId));
}
@@ -479,23 +471,21 @@ public final class SuspendPackageHelper {
* @return An array containing results of the checks
*/
@NonNull
- boolean[] canSuspendPackageForUser(@NonNull Computer snapshot, @NonNull String[] packageNames,
+ boolean[] canSuspendPackageForUser(@NonNull Computer computer, @NonNull String[] packageNames,
int userId, int callingUid) {
final boolean[] canSuspend = new boolean[packageNames.length];
- final boolean isCallerOwner = isCallerDeviceOrProfileOwner(snapshot, userId, callingUid);
+ final boolean isCallerOwner = isCallerDeviceOrProfileOwner(userId, callingUid);
final long token = Binder.clearCallingIdentity();
try {
final DefaultAppProvider defaultAppProvider = mInjector.getDefaultAppProvider();
final String activeLauncherPackageName = defaultAppProvider.getDefaultHome(userId);
final String dialerPackageName = defaultAppProvider.getDefaultDialer(userId);
- final String requiredInstallerPackage =
- getKnownPackageName(snapshot, PACKAGE_INSTALLER, userId);
+ final String requiredInstallerPackage = getKnownPackageName(PACKAGE_INSTALLER, userId);
final String requiredUninstallerPackage =
- getKnownPackageName(snapshot, PACKAGE_UNINSTALLER, userId);
- final String requiredVerifierPackage =
- getKnownPackageName(snapshot, PACKAGE_VERIFIER, userId);
+ getKnownPackageName(PACKAGE_UNINSTALLER, userId);
+ final String requiredVerifierPackage = getKnownPackageName(PACKAGE_VERIFIER, userId);
final String requiredPermissionControllerPackage =
- getKnownPackageName(snapshot, PACKAGE_PERMISSION_CONTROLLER, userId);
+ getKnownPackageName(PACKAGE_PERMISSION_CONTROLLER, userId);
for (int i = 0; i < packageNames.length; i++) {
canSuspend[i] = false;
final String packageName = packageNames[i];
@@ -540,7 +530,7 @@ public final class SuspendPackageHelper {
+ "\": protected package");
continue;
}
- if (!isCallerOwner && snapshot.getBlockUninstall(userId, packageName)) {
+ if (!isCallerOwner && computer.getBlockUninstall(userId, packageName)) {
Slog.w(TAG, "Cannot suspend package \"" + packageName
+ "\": blocked by admin");
continue;
@@ -549,7 +539,7 @@ public final class SuspendPackageHelper {
// Cannot suspend static shared libs as they are considered
// a part of the using app (emulating static linking). Also
// static libs are installed always on internal storage.
- PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName);
+ PackageStateInternal packageState = computer.getPackageStateInternal(packageName);
AndroidPackage pkg = packageState == null ? null : packageState.getPkg();
if (pkg != null) {
// Cannot suspend SDK libs as they are controlled by SDK manager.
@@ -590,8 +580,8 @@ public final class SuspendPackageHelper {
* @param userId The user where packages reside.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- void sendPackagesSuspendedForUser(@NonNull Computer snapshot, @NonNull String intent,
- @NonNull String[] pkgList, @NonNull int[] uidList, int userId) {
+ void sendPackagesSuspendedForUser(@NonNull String intent, @NonNull String[] pkgList,
+ @NonNull int[] uidList, int userId) {
final List<List<String>> pkgsToSend = new ArrayList(pkgList.length);
final List<IntArray> uidsToSend = new ArrayList(pkgList.length);
final List<SparseArray<int[]>> allowListsToSend = new ArrayList(pkgList.length);
@@ -602,8 +592,8 @@ public final class SuspendPackageHelper {
final String pkgName = pkgList[i];
final int uid = uidList[i];
SparseArray<int[]> allowList = mInjector.getAppsFilter().getVisibilityAllowList(
- snapshot.getPackageStateInternal(pkgName, SYSTEM_UID),
- userIds, snapshot.getPackageStates());
+ mPm.getPackageStateInternal(pkgName, SYSTEM_UID),
+ userIds, mPm.getPackageStates());
if (allowList == null) {
allowList = new SparseArray<>(0);
}
@@ -638,22 +628,19 @@ public final class SuspendPackageHelper {
}
}
- private String getKnownPackageName(@NonNull Computer snapshot, @KnownPackage int knownPackage,
- int userId) {
- final String[] knownPackages =
- mPm.getKnownPackageNamesInternal(snapshot, knownPackage, userId);
+ private String getKnownPackageName(@KnownPackage int knownPackage, int userId) {
+ final String[] knownPackages = mPm.getKnownPackageNamesInternal(knownPackage, userId);
return knownPackages.length > 0 ? knownPackages[0] : null;
}
- private boolean isCallerDeviceOrProfileOwner(@NonNull Computer snapshot, int userId,
- int callingUid) {
+ private boolean isCallerDeviceOrProfileOwner(int userId, int callingUid) {
if (callingUid == SYSTEM_UID) {
return true;
}
final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId);
if (ownerPackage != null) {
- return callingUid == snapshot.getPackageUidInternal(ownerPackage, 0, userId,
- callingUid);
+ return callingUid == mPm.getPackageUidInternal(
+ ownerPackage, 0, userId, callingUid);
}
return false;
}
@@ -672,10 +659,9 @@ public final class SuspendPackageHelper {
return;
}
final int[] targetUserIds = new int[] {userId};
- final Computer snapshot = mPm.snapshotComputer();
for (String packageName : affectedPackages) {
final Bundle appExtras = suspended
- ? getSuspendedPackageAppExtras(snapshot, packageName, userId, SYSTEM_UID)
+ ? getSuspendedPackageAppExtras(packageName, userId, SYSTEM_UID)
: null;
final Bundle intentExtras;
if (appExtras != null) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index eae7658587f7..33476ed2678e 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -4148,11 +4148,11 @@ public class UserManagerService extends IUserManager.Stub {
continue;
}
if (filter.direction == DefaultCrossProfileIntentFilter.Direction.TO_PARENT) {
- mPm.addCrossProfileIntentFilter(mPm.snapshotComputer(),
+ mPm.addCrossProfileIntentFilter(
filter.filter, mContext.getOpPackageName(), profileUserId, parentUserId,
filter.flags);
} else {
- mPm.addCrossProfileIntentFilter(mPm.snapshotComputer(),
+ mPm.addCrossProfileIntentFilter(
filter.filter, mContext.getOpPackageName(), parentUserId, profileUserId,
filter.flags);
}
diff --git a/services/core/java/com/android/server/pm/WatchedIntentFilter.java b/services/core/java/com/android/server/pm/WatchedIntentFilter.java
index 5d7a2a3bd426..30f276e8386a 100644
--- a/services/core/java/com/android/server/pm/WatchedIntentFilter.java
+++ b/services/core/java/com/android/server/pm/WatchedIntentFilter.java
@@ -84,7 +84,7 @@ public class WatchedIntentFilter
}
// Convert an {@link IntentFilter} to a {@link WatchedIntentFilter}
- public WatchedIntentFilter(IntentFilter f) {
+ protected WatchedIntentFilter(IntentFilter f) {
mFilter = new IntentFilter(f);
}
diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
index 7e4da945709b..e28a6ea8ea6b 100644
--- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java
+++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
@@ -31,13 +31,13 @@ import android.content.pm.dex.ArtManagerInternal;
import android.content.pm.dex.DexMetadataHelper;
import android.content.pm.dex.ISnapshotRuntimeProfileCallback;
import android.content.pm.dex.PackageOptimizationInfo;
+import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.os.Process;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.system.Os;
@@ -55,7 +55,6 @@ import com.android.server.pm.Installer;
import com.android.server.pm.Installer.InstallerException;
import com.android.server.pm.PackageManagerServiceCompilerMapping;
import com.android.server.pm.parsing.pkg.AndroidPackage;
-import com.android.server.pm.pkg.parsing.PackageInfoWithoutStateUtils;
import dalvik.system.DexFile;
import dalvik.system.VMRuntime;
@@ -93,7 +92,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
private static final String BOOT_IMAGE_PROFILE_NAME = "android.prof";
private final Context mContext;
- private IPackageManager mPackageManager;
+ private final IPackageManager mPackageManager;
private final Object mInstallLock;
@GuardedBy("mInstallLock")
private final Installer mInstaller;
@@ -104,9 +103,10 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
verifyTronLoggingConstants();
}
- public ArtManagerService(Context context, Installer installer,
+ public ArtManagerService(Context context, IPackageManager pm, Installer installer,
Object installLock) {
mContext = context;
+ mPackageManager = pm;
mInstaller = installer;
mInstallLock = installLock;
mHandler = new Handler(BackgroundThread.getHandler().getLooper());
@@ -114,15 +114,6 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
LocalServices.addService(ArtManagerInternal.class, new ArtManagerInternalImpl());
}
- @NonNull
- private IPackageManager getPackageManager() {
- if (mPackageManager == null) {
- mPackageManager = IPackageManager.Stub.asInterface(
- ServiceManager.getService("package"));
- }
- return mPackageManager;
- }
-
private boolean checkAndroidPermissions(int callingUid, String callingPackage) {
// Callers always need this permission
mContext.enforceCallingOrSelfPermission(
@@ -166,7 +157,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
}
PackageInfo info = null;
try {
- info = getPackageManager().getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0);
+ info = mPackageManager.getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0);
} catch (RemoteException ignored) {
// Should not happen.
}
@@ -230,7 +221,7 @@ public class ArtManagerService extends android.content.pm.dex.IArtManager.Stub {
// TODO(calin): consider adding an API to PMS which can retrieve the
// PackageParser.Package.
- info = getPackageManager().getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0);
+ info = mPackageManager.getPackageInfo(packageName, /*flags*/ 0, /*userId*/ 0);
} catch (RemoteException ignored) {
// Should not happen.
}
diff --git a/services/core/java/com/android/server/pm/dex/DexManager.java b/services/core/java/com/android/server/pm/dex/DexManager.java
index 17109e97ddf1..5371454db43c 100644
--- a/services/core/java/com/android/server/pm/dex/DexManager.java
+++ b/services/core/java/com/android/server/pm/dex/DexManager.java
@@ -23,8 +23,6 @@ import static com.android.server.pm.dex.PackageDexUsage.PackageUseInfo;
import static java.util.function.Function.identity;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
@@ -35,7 +33,6 @@ import android.os.BatteryManager;
import android.os.FileUtils;
import android.os.PowerManager;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.storage.StorageManager;
@@ -112,7 +109,7 @@ public class DexManager {
// record class loaders or ISAs.)
private final DynamicCodeLogger mDynamicCodeLogger;
- private IPackageManager mPackageManager;
+ private final IPackageManager mPackageManager;
private final PackageDexOptimizer mPackageDexOptimizer;
private final Object mInstallLock;
@GuardedBy("mInstallLock")
@@ -131,22 +128,16 @@ public class DexManager {
private static int DEX_SEARCH_FOUND_SPLIT = 2; // dex file is a split apk
private static int DEX_SEARCH_FOUND_SECONDARY = 3; // dex file is a secondary dex
- public DexManager(Context context, PackageDexOptimizer pdo, Installer installer,
- Object installLock) {
- this(context, pdo, installer, installLock, null);
- }
-
- @VisibleForTesting
- public DexManager(Context context, PackageDexOptimizer pdo, Installer installer,
- Object installLock, @Nullable IPackageManager packageManager) {
+ public DexManager(Context context, IPackageManager pms, PackageDexOptimizer pdo,
+ Installer installer, Object installLock) {
mContext = context;
mPackageCodeLocationsCache = new HashMap<>();
mPackageDexUsage = new PackageDexUsage();
+ mPackageManager = pms;
mPackageDexOptimizer = pdo;
mInstaller = installer;
mInstallLock = installLock;
- mDynamicCodeLogger = new DynamicCodeLogger(installer);
- mPackageManager = packageManager;
+ mDynamicCodeLogger = new DynamicCodeLogger(pms, installer);
// This is currently checked to handle tests that pass in a null context.
// TODO(b/174783329): Modify the tests to pass in a mocked Context, PowerManager,
@@ -166,15 +157,6 @@ public class DexManager {
}
}
- @NonNull
- private IPackageManager getPackageManager() {
- if (mPackageManager == null) {
- mPackageManager = IPackageManager.Stub.asInterface(
- ServiceManager.getService("package"));
- }
- return mPackageManager;
- }
-
public DynamicCodeLogger getDynamicCodeLogger() {
return mDynamicCodeLogger;
}
@@ -547,7 +529,7 @@ public class DexManager {
PackageInfo pkg;
try {
- pkg = getPackageManager().getPackageInfo(packageName, /*flags*/0,
+ pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0,
dexUseInfo.getOwnerUserId());
} catch (RemoteException e) {
throw new AssertionError(e);
@@ -691,7 +673,7 @@ public class DexManager {
// to get back the real app uid and its storage kind. These are only used
// to perform extra validation in installd.
// TODO(calin): maybe a bit overkill.
- pkg = getPackageManager().getPackageInfo(packageName, /*flags*/0,
+ pkg = mPackageManager.getPackageInfo(packageName, /*flags*/0,
dexUseInfo.getOwnerUserId());
} catch (RemoteException ignore) {
// Can't happen, DexManager is local.
diff --git a/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java b/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java
index 9b94e993f967..75b4e38e42f5 100644
--- a/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java
+++ b/services/core/java/com/android/server/pm/dex/DynamicCodeLogger.java
@@ -19,13 +19,11 @@ package com.android.server.pm.dex;
import static com.android.server.pm.dex.PackageDynamicCodeLoading.FILE_TYPE_DEX;
import static com.android.server.pm.dex.PackageDynamicCodeLoading.FILE_TYPE_NATIVE;
-import android.annotation.NonNull;
import android.content.pm.ApplicationInfo;
import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.os.FileUtils;
import android.os.RemoteException;
-import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.storage.StorageManager;
import android.util.EventLog;
@@ -60,30 +58,20 @@ public class DynamicCodeLogger {
private static final String DCL_DEX_SUBTAG = "dcl";
private static final String DCL_NATIVE_SUBTAG = "dcln";
- private IPackageManager mPackageManager;
+ private final IPackageManager mPackageManager;
private final PackageDynamicCodeLoading mPackageDynamicCodeLoading;
private final Installer mInstaller;
- DynamicCodeLogger(Installer installer) {
- mInstaller = installer;
- mPackageDynamicCodeLoading = new PackageDynamicCodeLoading();
+ DynamicCodeLogger(IPackageManager pms, Installer installer) {
+ this(pms, installer, new PackageDynamicCodeLoading());
}
@VisibleForTesting
- DynamicCodeLogger(@NonNull IPackageManager packageManager, @NonNull Installer installer,
- @NonNull PackageDynamicCodeLoading packageDynamicCodeLoading) {
- mPackageManager = packageManager;
- mInstaller = installer;
+ DynamicCodeLogger(IPackageManager pms, Installer installer,
+ PackageDynamicCodeLoading packageDynamicCodeLoading) {
+ mPackageManager = pms;
mPackageDynamicCodeLoading = packageDynamicCodeLoading;
- }
-
- @NonNull
- private IPackageManager getPackageManager() {
- if (mPackageManager == null) {
- mPackageManager = IPackageManager.Stub.asInterface(
- ServiceManager.getService("package"));
- }
- return mPackageManager;
+ mInstaller = installer;
}
public Set<String> getAllPackagesWithDynamicCodeLoading() {
@@ -116,7 +104,7 @@ public class DynamicCodeLogger {
try {
PackageInfo ownerInfo =
- getPackageManager().getPackageInfo(packageName, /*flags*/ 0, userId);
+ mPackageManager.getPackageInfo(packageName, /*flags*/ 0, userId);
appInfo = ownerInfo == null ? null : ownerInfo.applicationInfo;
} catch (RemoteException ignored) {
// Can't happen, we're local.
@@ -179,7 +167,7 @@ public class DynamicCodeLogger {
loadingUid = appInfo.uid;
} else {
try {
- loadingUid = getPackageManager().getPackageUid(loadingPackageName, /*flags*/ 0,
+ loadingUid = mPackageManager.getPackageUid(loadingPackageName, /*flags*/ 0,
userId);
} catch (RemoteException ignored) {
// Can't happen, we're local.
@@ -235,7 +223,7 @@ public class DynamicCodeLogger {
public void recordNative(int loadingUid, String path) {
String[] packages;
try {
- packages = getPackageManager().getPackagesForUid(loadingUid);
+ packages = mPackageManager.getPackagesForUid(loadingUid);
if (packages == null || packages.length == 0) {
return;
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java
index 6f503c7dd941..8223b8c86c5b 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundDexOptServiceUnitTest.java
@@ -116,7 +116,7 @@ public final class BackgroundDexOptServiceUnitTest {
when(mInjector.getDataDirStorageLowBytes()).thenReturn(STORAGE_LOW_BYTES);
when(mInjector.getDexOptThermalCutoff()).thenReturn(PowerManager.THERMAL_STATUS_CRITICAL);
when(mInjector.getCurrentThermalStatus()).thenReturn(PowerManager.THERMAL_STATUS_NONE);
- when(mDexOptHelper.getOptimizablePackages(any())).thenReturn(DEFAULT_PACKAGE_LIST);
+ when(mDexOptHelper.getOptimizablePackages()).thenReturn(DEFAULT_PACKAGE_LIST);
when(mDexOptHelper.performDexOptWithStatus(any())).thenReturn(
PackageDexOptimizer.DEX_OPT_PERFORMED);
@@ -158,7 +158,7 @@ public final class BackgroundDexOptServiceUnitTest {
@Test
public void testNoExecutionForNoOptimizablePackages() {
initUntilBootCompleted();
- when(mDexOptHelper.getOptimizablePackages(any())).thenReturn(EMPTY_PACKAGE_LIST);
+ when(mDexOptHelper.getOptimizablePackages()).thenReturn(EMPTY_PACKAGE_LIST);
assertThat(mService.onStartJob(mJobServiceForPostBoot,
mJobParametersForPostBoot)).isFalse();
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt
index 537a0280e24b..13199032a223 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/PackageManagerServiceHibernationTests.kt
@@ -157,7 +157,7 @@ class PackageManagerServiceHibernationTests {
rule.system().validateFinalState()
whenever(appHibernationManager.isHibernatingGlobally(TEST_PACKAGE_2_NAME)).thenReturn(true)
- val optimizablePkgs = DexOptHelper(pm).getOptimizablePackages(pm.snapshotComputer())
+ val optimizablePkgs = DexOptHelper(pm).optimizablePackages
assertTrue(optimizablePkgs.contains(TEST_PACKAGE_NAME))
assertFalse(optimizablePkgs.contains(TEST_PACKAGE_2_NAME))
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
index 1515282812c2..b063d22de2bb 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/SharedLibrariesImplTest.kt
@@ -85,7 +85,6 @@ class SharedLibrariesImplTest {
private lateinit var mSharedLibrariesImpl: SharedLibrariesImpl
private lateinit var mPms: PackageManagerService
private lateinit var mSettings: Settings
- private lateinit var mComputer: Computer
@Mock
private lateinit var mDeletePackageHelper: DeletePackageHelper
@@ -115,16 +114,22 @@ class SharedLibrariesImplTest {
mSharedLibrariesImpl.setDeletePackageHelper(mDeletePackageHelper)
addExistingSharedLibraries()
- mComputer = mock {
- whenever(sharedLibraries) { mSharedLibrariesImpl.sharedLibraries }
- whenever(resolveInternalPackageName(anyString(), anyLong())) { arguments[0] }
- }
-
whenever(mSettings.getPackageLPr(any())) { mExistingSettings[arguments[0]] }
whenever(mRule.mocks().injector.getSystemService(StorageManager::class.java))
.thenReturn(mStorageManager)
whenever(mStorageManager.findPathForUuid(nullable())).thenReturn(mFile)
- doAnswer { mComputer }.`when`(mPms).snapshotComputer()
+ doAnswer { it.arguments[0] }.`when`(mPms).resolveInternalPackageName(any(), any())
+ doAnswer {
+ mockThrowOnUnmocked<Computer> {
+ whenever(sharedLibraries) { mSharedLibrariesImpl.sharedLibraries }
+ whenever(resolveInternalPackageName(anyString(), anyLong())) {
+ mPms.resolveInternalPackageName(getArgument(0), getArgument(1))
+ }
+ whenever(getPackageStateInternal(anyString())) {
+ mPms.getPackageStateInternal(getArgument(0))
+ }
+ }
+ }.`when`(mPms).snapshotComputer()
whenever(mDeletePackageHelper.deletePackageX(any(), any(), any(), any(), any()))
.thenReturn(PackageManager.DELETE_SUCCEEDED)
whenever(mRule.mocks().injector.compatibility).thenReturn(mPlatformCompat)
@@ -184,8 +189,7 @@ class SharedLibrariesImplTest {
@Test
fun removeSharedLibrary() {
- doAnswer { mutableListOf(VersionedPackage(CONSUMER_PACKAGE_NAME, 1L)) }
- .`when`(mComputer)
+ doAnswer { mutableListOf(VersionedPackage(CONSUMER_PACKAGE_NAME, 1L)) }.`when`(mPms)
.getPackagesUsingSharedLibrary(any(), any(), any(), any())
val staticInfo = mSharedLibrariesImpl
.getSharedLibraryInfo(STATIC_LIB_NAME, STATIC_LIB_VERSION)!!
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt
index 4818573e9ae5..5230ea7304c8 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt
@@ -104,9 +104,9 @@ class SuspendPackageHelperTest {
pms, rule.mocks().injector, broadcastHelper, protectedPackages)
defaultAppProvider = rule.mocks().defaultAppProvider
testHandler = rule.mocks().handler
- packageSetting1 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_1)!!
- packageSetting2 = pms.snapshotComputer().getPackageStateInternal(TEST_PACKAGE_2)!!
- ownerSetting = pms.snapshotComputer().getPackageStateInternal(DEVICE_OWNER_PACKAGE)!!
+ packageSetting1 = pms.getPackageStateInternal(TEST_PACKAGE_1)!!
+ packageSetting2 = pms.getPackageStateInternal(TEST_PACKAGE_2)!!
+ ownerSetting = pms.getPackageStateInternal(DEVICE_OWNER_PACKAGE)!!
deviceOwnerUid = UserHandle.getUid(TEST_USER_ID, ownerSetting.appId)
packagesToSuspend = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2)
uidsToSuspend = intArrayOf(packageSetting1.appId, packageSetting2.appId)
@@ -270,7 +270,7 @@ class SuspendPackageHelperTest {
testHandler.flush()
assertThat(failedNames).isEmpty()
- val result = suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
+ val result = suspendPackageHelper.getSuspendedPackageAppExtras(
TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)!!
assertThat(result.getString(TEST_PACKAGE_1)).isEqualTo(TEST_PACKAGE_1)
@@ -286,13 +286,13 @@ class SuspendPackageHelperTest {
null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)
testHandler.flush()
assertThat(failedNames).isEmpty()
- assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.getSuspendingPackage(
TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE)
- assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.getSuspendingPackage(
TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE)
- assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(
TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNotNull()
- assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(
TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNotNull()
suspendPackageHelper.removeSuspensionsBySuspendingPackage(pms.snapshotComputer(),
@@ -311,13 +311,13 @@ class SuspendPackageHelperTest {
nullable(), nullable(), any(), eq(TEST_PACKAGE_2), nullable(), any(), any(),
nullable(), nullable())
- assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.getSuspendingPackage(
TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNull()
- assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.getSuspendingPackage(
TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNull()
- assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(
TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNull()
- assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.getSuspendedPackageAppExtras(
TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNull()
}
@@ -331,7 +331,7 @@ class SuspendPackageHelperTest {
testHandler.flush()
assertThat(failedNames).isEmpty()
- val result = suspendPackageHelper.getSuspendedPackageLauncherExtras(pms.snapshotComputer(),
+ val result = suspendPackageHelper.getSuspendedPackageLauncherExtras(
TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)!!
assertThat(result.getString(TEST_PACKAGE_2)).isEqualTo(TEST_PACKAGE_2)
@@ -346,7 +346,7 @@ class SuspendPackageHelperTest {
testHandler.flush()
assertThat(failedNames).isEmpty()
- assertThat(suspendPackageHelper.isPackageSuspended(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.isPackageSuspended(
TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isTrue()
}
@@ -360,7 +360,7 @@ class SuspendPackageHelperTest {
testHandler.flush()
assertThat(failedNames).isEmpty()
- assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(),
+ assertThat(suspendPackageHelper.getSuspendingPackage(
TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE)
}
@@ -375,7 +375,7 @@ class SuspendPackageHelperTest {
testHandler.flush()
assertThat(failedNames).isEmpty()
- val result = suspendPackageHelper.getSuspendedDialogInfo(pms.snapshotComputer(),
+ val result = suspendPackageHelper.getSuspendedDialogInfo(
TEST_PACKAGE_1, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)!!
assertThat(result.title).isEqualTo(TEST_PACKAGE_1)
@@ -387,8 +387,8 @@ class SuspendPackageHelperTest {
mockAllowList(packageSetting1, allowList(10001, 10002, 10003))
mockAllowList(packageSetting2, allowList(10001, 10002, 10003))
- suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(),
- Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID)
+ suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED,
+ packagesToSuspend, uidsToSuspend, TEST_USER_ID)
testHandler.flush()
verify(broadcastHelper).sendPackageBroadcast(any(), nullable(), bundleCaptor.capture(),
anyInt(), nullable(), nullable(), any(), nullable(), any(), nullable())
@@ -406,8 +406,8 @@ class SuspendPackageHelperTest {
mockAllowList(packageSetting1, allowList(10001, 10002, 10003))
mockAllowList(packageSetting2, allowList(10001, 10002, 10007))
- suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(),
- Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID)
+ suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED,
+ packagesToSuspend, uidsToSuspend, TEST_USER_ID)
testHandler.flush()
verify(broadcastHelper, times(2)).sendPackageBroadcast(
any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(),
@@ -429,8 +429,8 @@ class SuspendPackageHelperTest {
mockAllowList(packageSetting1, allowList(10001, 10002, 10003))
mockAllowList(packageSetting2, null)
- suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(),
- Intent.ACTION_PACKAGES_SUSPENDED, packagesToSuspend, uidsToSuspend, TEST_USER_ID)
+ suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENDED,
+ packagesToSuspend, uidsToSuspend, TEST_USER_ID)
testHandler.flush()
verify(broadcastHelper, times(2)).sendPackageBroadcast(
any(), nullable(), bundleCaptor.capture(), anyInt(), nullable(), nullable(), any(),
@@ -449,9 +449,8 @@ class SuspendPackageHelperTest {
@Test
@Throws(Exception::class)
fun sendPackagesSuspendModifiedForUser() {
- suspendPackageHelper.sendPackagesSuspendedForUser(pms.snapshotComputer(),
- Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, packagesToSuspend, uidsToSuspend,
- TEST_USER_ID)
+ suspendPackageHelper.sendPackagesSuspendedForUser(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED,
+ packagesToSuspend, uidsToSuspend, TEST_USER_ID)
testHandler.flush()
verify(broadcastHelper).sendPackageBroadcast(
eq(Intent.ACTION_PACKAGES_SUSPENSION_CHANGED), nullable(), bundleCaptor.capture(),
@@ -484,13 +483,13 @@ class SuspendPackageHelperTest {
Mockito.doReturn(DIALER_PACKAGE).`when`(defaultAppProvider)
.getDefaultDialer(eq(TEST_USER_ID))
Mockito.doReturn(arrayOf(INSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal(
- any(), eq(PackageManagerInternal.PACKAGE_INSTALLER), eq(TEST_USER_ID))
+ eq(PackageManagerInternal.PACKAGE_INSTALLER), eq(TEST_USER_ID))
Mockito.doReturn(arrayOf(UNINSTALLER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal(
- any(), eq(PackageManagerInternal.PACKAGE_UNINSTALLER), eq(TEST_USER_ID))
+ eq(PackageManagerInternal.PACKAGE_UNINSTALLER), eq(TEST_USER_ID))
Mockito.doReturn(arrayOf(VERIFIER_PACKAGE)).`when`(pms).getKnownPackageNamesInternal(
- any(), eq(PackageManagerInternal.PACKAGE_VERIFIER), eq(TEST_USER_ID))
+ eq(PackageManagerInternal.PACKAGE_VERIFIER), eq(TEST_USER_ID))
Mockito.doReturn(arrayOf(PERMISSION_CONTROLLER_PACKAGE)).`when`(pms)
- .getKnownPackageNamesInternal(any(),
+ .getKnownPackageNamesInternal(
eq(PackageManagerInternal.PACKAGE_PERMISSION_CONTROLLER), eq(TEST_USER_ID))
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java b/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java
index 9d269719db64..8abe46fab1d6 100644
--- a/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/dex/DexManagerTests.java
@@ -159,8 +159,8 @@ public class DexManagerTests {
.when(mockContext)
.getSystemService(PowerManager.class);
- mDexManager = new DexManager(mockContext, /*PackageDexOptimizer*/ null,
- mInstaller, mInstallLock, mPM);
+ mDexManager = new DexManager(mockContext, mPM, /*PackageDexOptimizer*/ null,
+ mInstaller, mInstallLock);
// Foo and Bar are available to user0.
// Only Bar is available to user1;
diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
index 946108d607db..050b224bf7f7 100644
--- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerServiceTest.java
@@ -23,10 +23,11 @@ import static com.google.common.truth.Truth.assertWithMessage;
import static org.junit.Assert.fail;
import static java.lang.reflect.Modifier.isFinal;
+import static java.lang.reflect.Modifier.isPrivate;
+import static java.lang.reflect.Modifier.isProtected;
import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isStatic;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.AppGlobals;
import android.content.IIntentReceiver;
@@ -62,6 +63,7 @@ import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
import java.util.regex.Pattern;
@@ -99,7 +101,7 @@ public class PackageManagerServiceTest {
@Nullable Bundle bOptions) {
}
- public void sendPackageAddedForNewUsers(@NonNull Computer snapshot, String packageName,
+ public void sendPackageAddedForNewUsers(String packageName,
boolean sendBootComplete, boolean includeStopped, int appId,
int[] userIds, int[] instantUserIds, int dataLoaderType) {
}
@@ -454,6 +456,147 @@ public class PackageManagerServiceTest {
return null;
}
+ // Return the boolean locked value. A null return means the annotation was not
+ // found. This method will fail if the annotation is found but is not one of the
+ // known constants.
+ private Boolean getOverride(Method m) {
+ final String name = "Computer." + displayName(m);
+ final Computer.LiveImplementation annotation =
+ m.getAnnotation(Computer.LiveImplementation.class);
+ if (annotation == null) {
+ return null;
+ }
+ final int override = annotation.override();
+ if (override == Computer.LiveImplementation.MANDATORY) {
+ return true;
+ } else if (override == Computer.LiveImplementation.NOT_ALLOWED) {
+ return false;
+ } else {
+ flag(name, "invalid Live value: " + override);
+ return null;
+ }
+ }
+
+ @Test
+ public void testComputerStructure() {
+ // Verify that Copmuter methods are properly annotated and that ComputerLocked is
+ // properly populated per annotations.
+ // Call PackageManagerService.validateComputer();
+ Class base = Computer.class;
+
+ HashMap<Method, Boolean> methodType = new HashMap<>();
+
+ // Verify that all Computer methods are annotated and that the annotation
+ // parameter locked() is valid.
+ for (Method m : base.getDeclaredMethods()) {
+ final String name = "Computer." + displayName(m);
+ Boolean override = getOverride(m);
+ if (override == null) {
+ flag(name, "missing required Live annotation");
+ }
+ methodType.put(m, override);
+ }
+
+ Class coreClass = ComputerEngine.class;
+ final Method[] coreMethods = coreClass.getDeclaredMethods();
+
+ // Examine every method in the core. If it inherits from a base method it must be
+ // "public final" if the base is NOT_ALLOWED or "public" if the base is MANDATORY.
+ // If the core method does not inherit from the base then it must be either
+ // private or protected.
+ for (Method m : base.getDeclaredMethods()) {
+ String name = "Computer." + displayName(m);
+ final boolean locked = methodType.get(m);
+ final Method core = matchMethod(m, coreMethods);
+ if (core == null) {
+ flag(name, "not overridden in ComputerEngine");
+ continue;
+ }
+ name = "ComputerEngine." + displayName(m);
+ final int modifiers = core.getModifiers();
+ if (!locked) {
+ if (!isPublic(modifiers)) {
+ flag(name, "is not public");
+ }
+ if (!isFinal(modifiers)) {
+ flag(name, "is not final");
+ }
+ }
+ }
+ // Any methods left in the coreMethods array must be private or protected.
+ // Protected methods must be overridden (and final) in the live list.
+ Method[] coreHelpers = new Method[coreMethods.length];
+ int coreIndex = 0;
+ for (Method m : coreMethods) {
+ if (m != null) {
+ final String name = "ComputerEngine." + displayName(m);
+ if (name.contains(".lambda$static")) {
+ // skip static lambda function
+ continue;
+ }
+
+ final int modifiers = m.getModifiers();
+ if (isPrivate(modifiers)) {
+ // Okay
+ } else if (isProtected(modifiers)) {
+ coreHelpers[coreIndex++] = m;
+ } else {
+ flag(name, "is neither private nor protected");
+ }
+ }
+ }
+
+ Class liveClass = ComputerLocked.class;
+ final Method[] liveMethods = liveClass.getDeclaredMethods();
+
+ // Examine every method in the live list. Every method must be final and must
+ // inherit either from base or core. If the method inherits from a base method
+ // then the base must be MANDATORY.
+ for (Method m : base.getDeclaredMethods()) {
+ String name = "Computer." + displayName(m);
+ final boolean locked = methodType.get(m);
+ final Method live = matchMethod(m, liveMethods);
+ if (live == null) {
+ if (locked) {
+ flag(name, "not overridden in ComputerLocked");
+ }
+ continue;
+ }
+ if (!locked) {
+ flag(name, "improperly overridden in ComputerLocked");
+ continue;
+ }
+
+ name = "ComputerLocked." + displayName(m);
+ final int modifiers = live.getModifiers();
+ if (!locked) {
+ if (!isPublic(modifiers)) {
+ flag(name, "is not public");
+ }
+ if (!isFinal(modifiers)) {
+ flag(name, "is not final");
+ }
+ }
+ }
+ for (Method m : coreHelpers) {
+ if (m == null) {
+ continue;
+ }
+ String name = "ComputerLocked." + displayName(m);
+ final Method live = matchMethod(m, liveMethods);
+ if (live == null) {
+ flag(name, "is not overridden in ComputerLocked");
+ continue;
+ }
+ }
+ for (Method m : liveMethods) {
+ if (m != null) {
+ String name = "ComputerLocked." + displayName(m);
+ flag(name, "illegal local method");
+ }
+ }
+ }
+
private static PerPackageReadTimeouts[] getPerPackageReadTimeouts(String knownDigestersList) {
final String defaultTimeouts = "3600000001:3600000002:3600000003";
List<PerPackageReadTimeouts> result = PerPackageReadTimeouts.parseDigestersList(
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 1eb391d60e4d..5ef22de1dab3 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -16790,7 +16790,10 @@ public class TelephonyManager {
* Callback to listen for when the set of packages with carrier privileges for a SIM changes.
*
* @hide
+ * @deprecated Use {@link CarrierPrivilegesCallback} instead. This API will be removed soon
+ * prior to API finalization.
*/
+ @Deprecated
@SystemApi
public interface CarrierPrivilegesListener {
/**
@@ -16810,6 +16813,54 @@ public class TelephonyManager {
}
/**
+ * Callbacks to listen for when the set of packages with carrier privileges for a SIM changes.
+ *
+ * <p>Of note, when multiple callbacks are registered, they may be triggered one after another.
+ * The ordering of them is not guaranteed and thus should not be depend on.
+ *
+ * @hide
+ */
+ @SystemApi
+ public interface CarrierPrivilegesCallback {
+ /**
+ * Called when the set of packages with carrier privileges has changed.
+ *
+ * <p>Of note, this callback will <b>not</b> be fired if a carrier triggers a SIM profile
+ * switch and the same set of packages remains privileged after the switch.
+ *
+ * <p>At registration, the callback will receive the current set of privileged packages.
+ *
+ * @param privilegedPackageNames The updated set of package names that have carrier
+ * privileges
+ * @param privilegedUids The updated set of UIDs that have carrier privileges
+ */
+ void onCarrierPrivilegesChanged(
+ @NonNull Set<String> privilegedPackageNames, @NonNull Set<Integer> privilegedUids);
+
+ /**
+ * Called when the {@link CarrierService} for the current user profile has changed.
+ *
+ * <p>This method does nothing by default. Clients that are interested in the carrier
+ * service change should override this method to get package name and UID info.
+ *
+ * <p>At registration, the callback will receive the current carrier service info.
+ *
+ * <p>Of note, this callback will <b>not</b> be fired if a carrier triggers a SIM profile
+ * switch and the same carrier service remains after switch.
+ *
+ * @param carrierServicePackageName package name of the {@link CarrierService}. May be
+ * {@code null} when no carrier service is detected.
+ * @param carrierServiceUid UID of the {@link CarrierService}. May be
+ * {@link android.os.Process#INVALID_UID} if no carrier
+ * service is detected.
+ */
+ default void onCarrierServiceChanged(
+ @Nullable String carrierServicePackageName, int carrierServiceUid) {
+ // do nothing by default
+ }
+ }
+
+ /**
* Registers a {@link CarrierPrivilegesListener} on the given {@code logicalSlotIndex} to
* receive callbacks when the set of packages with carrier privileges changes. The callback will
* immediately be called with the latest state.
@@ -16818,7 +16869,10 @@ public class TelephonyManager {
* @param executor The executor where {@code listener} will be invoked
* @param listener The callback to register
* @hide
+ * @deprecated Use {@link #unregisterCarrierPrivilegesCallback} instead. This API will be
+ * removed prior to API finalization.
*/
+ @Deprecated
@SystemApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void addCarrierPrivilegesListener(
@@ -16842,7 +16896,10 @@ public class TelephonyManager {
* Unregisters an existing {@link CarrierPrivilegesListener}.
*
* @hide
+ * @deprecated Use {@link #unregisterCarrierPrivilegesCallback} instead. This API will be
+ * removed prior to API finalization.
*/
+ @Deprecated
@SystemApi
@RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
public void removeCarrierPrivilegesListener(@NonNull CarrierPrivilegesListener listener) {
@@ -16890,4 +16947,53 @@ public class TelephonyManager {
ex.rethrowAsRuntimeException();
}
}
+
+ /**
+ * Registers a {@link CarrierPrivilegesCallback} on the given {@code logicalSlotIndex} to
+ * receive callbacks when the set of packages with carrier privileges changes. The callback will
+ * immediately be called with the latest state.
+ *
+ * @param logicalSlotIndex The SIM slot to listen on
+ * @param executor The executor where {@code callback} will be invoked
+ * @param callback The callback to register
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public void registerCarrierPrivilegesCallback(
+ int logicalSlotIndex,
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull CarrierPrivilegesCallback callback) {
+ if (mContext == null) {
+ throw new IllegalStateException("Telephony service is null");
+ } else if (executor == null || callback == null) {
+ throw new IllegalArgumentException(
+ "CarrierPrivilegesCallback and executor must be non-null");
+ }
+ mTelephonyRegistryMgr = mContext.getSystemService(TelephonyRegistryManager.class);
+ if (mTelephonyRegistryMgr == null) {
+ throw new IllegalStateException("Telephony registry service is null");
+ }
+ mTelephonyRegistryMgr.addCarrierPrivilegesCallback(logicalSlotIndex, executor, callback);
+ }
+
+ /**
+ * Unregisters an existing {@link CarrierPrivilegesCallback}.
+ *
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public void unregisterCarrierPrivilegesCallback(@NonNull CarrierPrivilegesCallback callback) {
+ if (mContext == null) {
+ throw new IllegalStateException("Telephony service is null");
+ } else if (callback == null) {
+ throw new IllegalArgumentException("CarrierPrivilegesCallback must be non-null");
+ }
+ mTelephonyRegistryMgr = mContext.getSystemService(TelephonyRegistryManager.class);
+ if (mTelephonyRegistryMgr == null) {
+ throw new IllegalStateException("Telephony registry service is null");
+ }
+ mTelephonyRegistryMgr.removeCarrierPrivilegesCallback(callback);
+ }
}