diff options
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); + } } |