diff options
25 files changed, 509 insertions, 387 deletions
diff --git a/Android.bp b/Android.bp index d63cd4ef0614..7764d25e7f61 100644 --- a/Android.bp +++ b/Android.bp @@ -1228,6 +1228,12 @@ java_library { visibility: ["//frameworks/base/wifi"], } +filegroup { + name: "framework-wifi-util-lib-aidls", + srcs: ["core/java/android/content/pm/ParceledListSlice.aidl"], + path: "core/java", +} + // utility classes statically linked into wifi-service filegroup { name: "framework-wifi-service-shared-srcs", diff --git a/core/java/android/net/NetworkScore.java b/core/java/android/net/NetworkScore.java index d207e7960d34..ae17378cfc4c 100644 --- a/core/java/android/net/NetworkScore.java +++ b/core/java/android/net/NetworkScore.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SystemApi; import android.annotation.TestApi; +import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; @@ -83,69 +84,10 @@ public final class NetworkScore implements Parcelable { uplinkBandwidthKBps = uplinkBandwidth; } - /** - * Evaluate whether a metrics codes for faster network is faster than another. - * - * This is a simple comparison of expected speeds. If either of the tested attributes - * are unknown, this returns zero. This implementation just assumes downlink bandwidth - * is more important than uplink bandwidth, which is more important than latency. This - * is not a very good way of evaluating network speed, but it's a start. - * TODO : do something more representative of how fast the network feels - * - * @param other the Metrics to evaluate against - * @return a negative integer, zero, or a positive integer as this metrics is worse than, - * equally good as (or unknown), or better than the passed Metrics. - * @see #compareToPreferringKnown(Metrics) - * @hide - */ - // Can't implement Comparable<Metrics> because this is @hide. - public int compareTo(@NonNull final Metrics other) { - if (downlinkBandwidthKBps != BANDWIDTH_UNKNOWN - && other.downlinkBandwidthKBps != BANDWIDTH_UNKNOWN) { - if (downlinkBandwidthKBps > other.downlinkBandwidthKBps) return 1; - if (downlinkBandwidthKBps < other.downlinkBandwidthKBps) return -1; - } - if (uplinkBandwidthKBps != BANDWIDTH_UNKNOWN - && other.uplinkBandwidthKBps != BANDWIDTH_UNKNOWN) { - if (uplinkBandwidthKBps > other.uplinkBandwidthKBps) return 1; - if (uplinkBandwidthKBps < other.uplinkBandwidthKBps) return -1; - } - if (latencyMs != LATENCY_UNKNOWN && other.latencyMs != LATENCY_UNKNOWN) { - // Latency : lower is better - if (latencyMs > other.latencyMs) return -1; - if (latencyMs < other.latencyMs) return 1; - } - return 0; - } - - /** - * Evaluate whether a metrics codes for faster network is faster than another. - * - * This is a simple comparison of expected speeds. If either of the tested attributes - * are unknown, this prefers the known attributes. This implementation just assumes - * downlink bandwidth is more important than uplink bandwidth, which is more important than - * latency. This is not a very good way of evaluating network speed, but it's a start. - * TODO : do something more representative of how fast the network feels - * - * @param other the Metrics to evaluate against - * @return a negative integer, zero, or a positive integer as this metrics is worse than, - * equally good as (or unknown), or better than the passed Metrics. - * @see #compareTo(Metrics) - * @hide - */ - public int compareToPreferringKnown(@NonNull final Metrics other) { - if (downlinkBandwidthKBps > other.downlinkBandwidthKBps) return 1; - if (downlinkBandwidthKBps < other.downlinkBandwidthKBps) return -1; - if (uplinkBandwidthKBps > other.uplinkBandwidthKBps) return 1; - if (uplinkBandwidthKBps < other.uplinkBandwidthKBps) return -1; - // Latency : lower is better - return -Integer.compare(latencyMs, other.latencyMs); - } - /** toString */ public String toString() { return "latency = " + latencyMs + " downlinkBandwidth = " + downlinkBandwidthKBps - + " uplinkBandwidth = " + uplinkBandwidthKBps; + + "uplinkBandwidth = " + uplinkBandwidthKBps; } @NonNull @@ -405,33 +347,6 @@ public final class NetworkScore implements Parcelable { return mLegacyScore; } - /** - * Use the metrics to evaluate whether a network is faster than another. - * - * This is purely based on the metrics, and explicitly ignores policy or exiting. It's - * provided to get a decision on two networks when policy can not decide, or to evaluate - * how a network is expected to compare to another if it should validate. - * - * @param other the score to evaluate against - * @return whether this network is probably faster than the other - * @hide - */ - public boolean probablyFasterThan(@NonNull final NetworkScore other) { - if (mLegacyScore > other.mLegacyScore) return true; - final int atEndToEnd = mEndToEndMetrics.compareTo(other.mEndToEndMetrics); - if (atEndToEnd > 0) return true; - if (atEndToEnd < 0) return false; - final int atLinkLayer = mLinkLayerMetrics.compareTo(other.mLinkLayerMetrics); - if (atLinkLayer > 0) return true; - if (atLinkLayer < 0) return false; - final int atEndToEndPreferringKnown = - mEndToEndMetrics.compareToPreferringKnown(other.mEndToEndMetrics); - if (atEndToEndPreferringKnown > 0) return true; - if (atEndToEndPreferringKnown < 0) return false; - // If this returns 0, neither is "probably faster" so just return false. - return mLinkLayerMetrics.compareToPreferringKnown(other.mLinkLayerMetrics) > 0; - } - /** Builder for NetworkScore. */ public static class Builder { private int mPolicy = 0; @@ -439,27 +354,17 @@ public final class NetworkScore implements Parcelable { private Metrics mLinkLayerMetrics = new Metrics(Metrics.LATENCY_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN); @NonNull - private Metrics mEndToEndMetrics = new Metrics(Metrics.LATENCY_UNKNOWN, + private Metrics mEndToMetrics = new Metrics(Metrics.LATENCY_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN, Metrics.BANDWIDTH_UNKNOWN); private int mSignalStrength = UNKNOWN_SIGNAL_STRENGTH; private int mRange = RANGE_UNKNOWN; private boolean mExiting = false; private int mLegacyScore = 0; + @NonNull private Bundle mExtensions = new Bundle(); /** Create a new builder. */ public Builder() { } - /** @hide */ - public Builder(@NonNull final NetworkScore source) { - mPolicy = source.mPolicy; - mLinkLayerMetrics = source.mLinkLayerMetrics; - mEndToEndMetrics = source.mEndToEndMetrics; - mSignalStrength = source.mSignalStrength; - mRange = source.mRange; - mExiting = source.mExiting; - mLegacyScore = source.mLegacyScore; - } - /** Add a policy flag. */ @NonNull public Builder addPolicy(@Policy final int policy) { mPolicy |= policy; @@ -480,7 +385,7 @@ public final class NetworkScore implements Parcelable { /** Set the end-to-end metrics. */ @NonNull public Builder setEndToEndMetrics(@NonNull final Metrics endToEndMetrics) { - mEndToEndMetrics = endToEndMetrics; + mEndToMetrics = endToEndMetrics; return this; } @@ -512,7 +417,7 @@ public final class NetworkScore implements Parcelable { /** Build the NetworkScore object represented by this builder. */ @NonNull public NetworkScore build() { - return new NetworkScore(mPolicy, mLinkLayerMetrics, mEndToEndMetrics, + return new NetworkScore(mPolicy, mLinkLayerMetrics, mEndToMetrics, mSignalStrength, mRange, mExiting, mLegacyScore); } } diff --git a/core/java/com/android/internal/util/FunctionalUtils.java b/core/java/com/android/internal/util/FunctionalUtils.java index 720f4feeaebe..3c9791791a68 100644 --- a/core/java/com/android/internal/util/FunctionalUtils.java +++ b/core/java/com/android/internal/util/FunctionalUtils.java @@ -16,16 +16,12 @@ package com.android.internal.util; -import android.annotation.NonNull; -import android.annotation.Nullable; import android.os.RemoteException; import android.util.ExceptionUtils; -import java.util.Collection; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Function; -import java.util.function.Predicate; import java.util.function.Supplier; /** @@ -222,20 +218,4 @@ public class FunctionalUtils { } } } - - /** - * Find the first element in the list that matches the predicate. - * - * The standard Java way of doing this is to use streams, which is very expensive. - * - * @return the first matching element, or null if none. - */ - @Nullable - public static <T> T findFirst(@NonNull final Collection<T> haystack, - @NonNull final Predicate<T> p) { - for (final T needle : haystack) { - if (p.test(needle)) return needle; - } - return null; - } } diff --git a/keystore/java/android/security/KeyChain.java b/keystore/java/android/security/KeyChain.java index a7e17d13c9e1..acd90a7f10cf 100644 --- a/keystore/java/android/security/KeyChain.java +++ b/keystore/java/android/security/KeyChain.java @@ -34,6 +34,7 @@ import android.os.Looper; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; +import android.os.UserManager; import android.security.keystore.AndroidKeyStoreProvider; import android.security.keystore.KeyPermanentlyInvalidatedException; import android.security.keystore.KeyProperties; @@ -811,6 +812,10 @@ public final class KeyChain { throw new NullPointerException("context == null"); } ensureNotOnMainThread(context); + if (!UserManager.get(context).isUserUnlocked(user)) { + throw new IllegalStateException("User must be unlocked"); + } + final CountDownLatch countDownLatch = new CountDownLatch(1); final AtomicReference<IKeyChainService> keyChainService = new AtomicReference<>(); ServiceConnection keyChainServiceConnection = new ServiceConnection() { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java index 187a3bdec13f..4f9052709870 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java @@ -59,6 +59,7 @@ public class UserDetailView extends PseudoGridView { private final Context mContext; protected UserSwitcherController mController; + private View mCurrentUserView; public Adapter(Context context, UserSwitcherController controller) { super(controller); @@ -89,6 +90,9 @@ public class UserDetailView extends PseudoGridView { v.bind(name, item.picture, item.info.id); } v.setActivated(item.isCurrent); + if (item.isCurrent) { + mCurrentUserView = v; + } v.setDisabledByAdmin(item.isDisabledByAdmin); if (!item.isSwitchToEnabled) { v.setEnabled(false); @@ -107,6 +111,12 @@ public class UserDetailView extends PseudoGridView { mController.startActivity(intent); } else if (tag.isSwitchToEnabled) { MetricsLogger.action(mContext, MetricsEvent.QS_SWITCH_USER); + if (!tag.isAddUser && !tag.isRestricted && !tag.isDisabledByAdmin) { + if (mCurrentUserView != null) { + mCurrentUserView.setActivated(false); + } + view.setActivated(true); + } switchTo(tag); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java index ba55f2ddcf13..c404cf69f1a8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UserAvatarView.java @@ -74,6 +74,12 @@ public class UserAvatarView extends View { this(context, null); } + @Override + public void setActivated(boolean activated) { + super.setActivated(activated); + mDrawable.invalidateSelf(); + } + /** * @deprecated use {@link #setAvatar(Bitmap)} instead. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java index d28a66994e1d..2abae3e26013 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java @@ -257,6 +257,7 @@ public class KeyguardUserSwitcher { private Context mContext; private KeyguardUserSwitcher mKeyguardUserSwitcher; + private View mCurrentUserView; public Adapter(Context context, UserSwitcherController controller, KeyguardUserSwitcher kgu) { @@ -285,6 +286,9 @@ public class KeyguardUserSwitcher { // Disable the icon if switching is disabled v.setAvatarEnabled(item.isSwitchToEnabled); convertView.setActivated(item.isCurrent); + if (item.isCurrent) { + mCurrentUserView = convertView; + } convertView.setTag(item); return convertView; } @@ -297,6 +301,12 @@ public class KeyguardUserSwitcher { // tapping the guest user while it's current clears the session. mKeyguardUserSwitcher.hideIfNotSimple(true /* animate */); } else if (user.isSwitchToEnabled) { + if (!user.isAddUser && !user.isRestricted && !user.isDisabledByAdmin) { + if (mCurrentUserView != null) { + mCurrentUserView.setActivated(false); + } + v.setActivated(true); + } switchTo(user); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index 8dfcb0ac215d..9ce31d030c43 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -236,8 +236,7 @@ public class UserSwitcherController implements Dumpable { picture, avatarSize, avatarSize, true); } } - int index = isCurrent ? 0 : records.size(); - records.add(index, new UserRecord(info, picture, false /* isGuest */, + records.add(new UserRecord(info, picture, false /* isGuest */, isCurrent, false /* isAddUser */, false /* isRestricted */, switchToEnabled)); } @@ -269,8 +268,7 @@ public class UserSwitcherController implements Dumpable { records.add(guestRecord); } } else { - int index = guestRecord.isCurrent ? 0 : records.size(); - records.add(index, guestRecord); + records.add(guestRecord); } if (canCreateUser) { diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 0f8d57e3d9e3..8b2bfa10a029 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -237,6 +237,33 @@ public abstract class PackageManagerInternal { public abstract boolean isPackageSuspended(String packageName, int userId); /** + * Removes all package suspensions imposed by any non-system packages. + */ + public abstract void removeAllNonSystemPackageSuspensions(int userId); + + /** + * Removes all suspensions imposed on the given package by non-system packages. + */ + public abstract void removeNonSystemPackageSuspensions(String packageName, int userId); + + /** + * Removes all {@link PackageManager.DistractionRestriction restrictions} set on the given + * package + */ + public abstract void removeDistractingPackageRestrictions(String packageName, int userId); + + /** + * Removes all {@link PackageManager.DistractionRestriction restrictions} set on all the + * packages. + */ + public abstract void removeAllDistractingPackageRestrictions(int userId); + + /** + * Flushes package restrictions for the given user immediately to disk. + */ + public abstract void flushPackageRestrictions(int userId); + + /** * Get the name of the package that suspended the given package. Packages can be suspended by * device administrators or apps holding {@link android.Manifest.permission#MANAGE_USERS} or * {@link android.Manifest.permission#SUSPEND_APPS}. diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index 7cf3fae70eb4..f84d35fb7776 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3302,7 +3302,6 @@ public class ConnectivityService extends IConnectivityManager.Stub for (int i = 0; i < nai.numNetworkRequests(); i++) { NetworkRequest request = nai.requestAt(i); final NetworkRequestInfo nri = mNetworkRequests.get(request); - ensureRunningOnConnectivityServiceThread(); final NetworkAgentInfo currentNetwork = nri.mSatisfier; if (currentNetwork != null && currentNetwork.network.netId == nai.network.netId) { nri.mSatisfier = null; @@ -3454,7 +3453,6 @@ public class ConnectivityService extends IConnectivityManager.Stub // If this Network is already the highest scoring Network for a request, or if // there is hope for it to become one if it validated, then it is needed. - ensureRunningOnConnectivityServiceThread(); if (nri.request.isRequest() && nai.satisfies(nri.request) && (nai.isSatisfyingRequest(nri.request.requestId) || // Note that this catches two important cases: @@ -3493,7 +3491,6 @@ public class ConnectivityService extends IConnectivityManager.Stub if (mNetworkRequests.get(nri.request) == null) { return; } - ensureRunningOnConnectivityServiceThread(); if (nri.mSatisfier != null) { return; } @@ -3531,7 +3528,6 @@ public class ConnectivityService extends IConnectivityManager.Stub mNetworkRequestInfoLogs.log("RELEASE " + nri); if (nri.request.isRequest()) { boolean wasKept = false; - ensureRunningOnConnectivityServiceThread(); final NetworkAgentInfo nai = nri.mSatisfier; if (nai != null) { boolean wasBackgroundNetwork = nai.isBackgroundNetwork(); @@ -3843,9 +3839,8 @@ public class ConnectivityService extends IConnectivityManager.Stub return avoidBadWifi(); } + private void rematchForAvoidBadWifiUpdate() { - ensureRunningOnConnectivityServiceThread(); - mixInAllNetworkScores(); rematchAllNetworksAndRequests(); for (NetworkAgentInfo nai: mNetworkAgentInfos.values()) { if (nai.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { @@ -7071,45 +7066,9 @@ public class ConnectivityService extends IConnectivityManager.Stub } } - /** - * Re-mixin all network scores. - * This is called when some global setting like avoidBadWifi has changed. - * TODO : remove this when all usages have been removed. - */ - private void mixInAllNetworkScores() { - ensureRunningOnConnectivityServiceThread(); - for (final NetworkAgentInfo nai : mNetworkAgentInfos.values()) { - nai.setNetworkScore(mixInNetworkScore(nai, nai.getNetworkScore())); - } - } - - /** - * Mix in the Connectivity-managed parts of the NetworkScore. - * @param nai The NAI this score applies to. - * @param sourceScore the score sent by the network agent, or the previous score of this NAI. - * @return A new score with the Connectivity-managed parts mixed in. - */ - @NonNull - private NetworkScore mixInNetworkScore(@NonNull final NetworkAgentInfo nai, - @NonNull final NetworkScore sourceScore) { - final NetworkScore.Builder score = new NetworkScore.Builder(sourceScore); - - // TODO : this should be done in Telephony. It should be handled per-network because - // it's a carrier-dependent config. - if (nai.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) { - if (mMultinetworkPolicyTracker.getAvoidBadWifi()) { - score.clearPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI); - } else { - score.addPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI); - } - } - - return score.build(); - } - private void updateNetworkScore(NetworkAgentInfo nai, NetworkScore ns) { if (VDBG || DDBG) log("updateNetworkScore for " + nai.toShortString() + " to " + ns); - nai.setNetworkScore(mixInNetworkScore(nai, ns)); + nai.setNetworkScore(ns); rematchAllNetworksAndRequests(); sendUpdatedScoreToFactories(nai); } diff --git a/services/core/java/com/android/server/MemoryPressureUtil.java b/services/core/java/com/android/server/MemoryPressureUtil.java new file mode 100644 index 000000000000..c34dc2f5a9b1 --- /dev/null +++ b/services/core/java/com/android/server/MemoryPressureUtil.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2020 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; + +import android.os.StrictMode; +import android.util.Slog; + +import libcore.io.IoUtils; + +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; + +/** + * Utility method for memory pressure (PSI). + */ +public final class MemoryPressureUtil { + private static final String FILE = "/proc/pressure/memory"; + private static final String TAG = "MemoryPressure"; + + /** + * @return a stanza about memory PSI to add to a report. + */ + public static String currentPsiState() { + final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); + StringWriter contents = new StringWriter(); + try { + if (new File(FILE).exists()) { + contents.append("----- Output from /proc/pressure/memory -----\n"); + contents.append(IoUtils.readFileAsString(FILE)); + contents.append("----- End output from /proc/pressure/memory -----\n\n"); + } + } catch (IOException e) { + Slog.e(TAG, "Could not read " + FILE, e); + } finally { + StrictMode.setThreadPolicy(savedPolicy); + } + return contents.toString(); + } + + private MemoryPressureUtil(){} +} diff --git a/services/core/java/com/android/server/SystemServerInitThreadPool.java b/services/core/java/com/android/server/SystemServerInitThreadPool.java index 179780d88084..8f914fe6f59f 100644 --- a/services/core/java/com/android/server/SystemServerInitThreadPool.java +++ b/services/core/java/com/android/server/SystemServerInitThreadPool.java @@ -175,6 +175,6 @@ public class SystemServerInitThreadPool { final ArrayList<Integer> pids = new ArrayList<>(); pids.add(Process.myPid()); ActivityManagerService.dumpStackTraces(pids, null, null, - Watchdog.getInterestingNativePids()); + Watchdog.getInterestingNativePids(), null); } } diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index 8900eee6f50f..ac7867f29a79 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -50,6 +50,7 @@ import com.android.server.wm.SurfaceAnimationThread; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.io.StringWriter; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; @@ -583,7 +584,7 @@ public class Watchdog extends Thread { ArrayList<Integer> pids = new ArrayList<Integer>(); pids.add(Process.myPid()); ActivityManagerService.dumpStackTraces(pids, null, null, - getInterestingNativePids()); + getInterestingNativePids(), null); waitedHalf = true; } continue; @@ -609,16 +610,21 @@ public class Watchdog extends Thread { if (mPhonePid > 0) pids.add(mPhonePid); long anrTime = SystemClock.uptimeMillis(); + StringBuilder report = new StringBuilder(); + report.append(MemoryPressureUtil.currentPsiState()); ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(false); + StringWriter tracesFileException = new StringWriter(); final File stack = ActivityManagerService.dumpStackTraces( - pids, processCpuTracker, new SparseArray<>(), getInterestingNativePids()); + pids, processCpuTracker, new SparseArray<>(), getInterestingNativePids(), + tracesFileException); // Give some extra time to make sure the stack traces get written. // The system's been hanging for a minute, another second or two won't hurt much. SystemClock.sleep(5000); processCpuTracker.update(); - String cpuInfo = processCpuTracker.printCurrentState(anrTime); + report.append(processCpuTracker.printCurrentState(anrTime)); + report.append(tracesFileException.getBuffer()); // Trigger the kernel to dump all blocked threads, and backtraces on all CPUs to the kernel log doSysRq('w'); @@ -634,7 +640,7 @@ public class Watchdog extends Thread { if (mActivity != null) { mActivity.addErrorToDropBox( "watchdog", null, "system_server", null, null, null, - subject, cpuInfo, stack, null); + subject, report.toString(), stack, null); } FrameworkStatsLog.write(FrameworkStatsLog.SYSTEM_SERVER_WATCHDOG_OCCURRED, subject); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a529f24eff1c..6c0623021025 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3851,10 +3851,11 @@ public class ActivityManagerService extends IActivityManager.Stub * @param firstPids of dalvik VM processes to dump stack traces for first * @param lastPids of dalvik VM processes to dump stack traces for last * @param nativePids optional list of native pids to dump stack crawls + * @param logExceptionCreatingFile optional writer to which we log errors creating the file */ public static File dumpStackTraces(ArrayList<Integer> firstPids, ProcessCpuTracker processCpuTracker, SparseArray<Boolean> lastPids, - ArrayList<Integer> nativePids) { + ArrayList<Integer> nativePids, StringWriter logExceptionCreatingFile) { ArrayList<Integer> extraPids = null; Slog.i(TAG, "dumpStackTraces pids=" + lastPids + " nativepids=" + nativePids); @@ -3894,8 +3895,15 @@ public class ActivityManagerService extends IActivityManager.Stub // NOTE: We should consider creating the file in native code atomically once we've // gotten rid of the old scheme of dumping and lot of the code that deals with paths // can be removed. - File tracesFile = createAnrDumpFile(tracesDir); - if (tracesFile == null) { + File tracesFile; + try { + tracesFile = createAnrDumpFile(tracesDir); + } catch (IOException e) { + Slog.w(TAG, "Exception creating ANR dump file:", e); + if (logExceptionCreatingFile != null) { + logExceptionCreatingFile.append("----- Exception creating ANR dump file -----\n"); + e.printStackTrace(new PrintWriter(logExceptionCreatingFile)); + } return null; } @@ -3906,7 +3914,7 @@ public class ActivityManagerService extends IActivityManager.Stub @GuardedBy("ActivityManagerService.class") private static SimpleDateFormat sAnrFileDateFormat; - private static synchronized File createAnrDumpFile(File tracesDir) { + private static synchronized File createAnrDumpFile(File tracesDir) throws IOException { if (sAnrFileDateFormat == null) { sAnrFileDateFormat = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS"); } @@ -3914,18 +3922,12 @@ public class ActivityManagerService extends IActivityManager.Stub final String formattedDate = sAnrFileDateFormat.format(new Date()); final File anrFile = new File(tracesDir, "anr_" + formattedDate); - try { - if (anrFile.createNewFile()) { - FileUtils.setPermissions(anrFile.getAbsolutePath(), 0600, -1, -1); // -rw------- - return anrFile; - } else { - Slog.w(TAG, "Unable to create ANR dump file: createNewFile failed"); - } - } catch (IOException ioe) { - Slog.w(TAG, "Exception creating ANR dump file:", ioe); + if (anrFile.createNewFile()) { + FileUtils.setPermissions(anrFile.getAbsolutePath(), 0600, -1, -1); // -rw------- + return anrFile; + } else { + throw new IOException("Unable to create ANR dump file: createNewFile failed"); } - - return null; } /** diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java index e63da9b1e80b..c2f03ec8d6c4 100644 --- a/services/core/java/com/android/server/am/ProcessRecord.java +++ b/services/core/java/com/android/server/am/ProcessRecord.java @@ -66,11 +66,13 @@ import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.ProcessCpuTracker; import com.android.internal.os.Zygote; import com.android.internal.util.FrameworkStatsLog; +import com.android.server.MemoryPressureUtil; import com.android.server.wm.WindowProcessController; import com.android.server.wm.WindowProcessListener; import java.io.File; import java.io.PrintWriter; +import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -1581,6 +1583,8 @@ class ProcessRecord implements WindowProcessListener { info.append("Parent: ").append(parentShortComponentName).append("\n"); } + StringBuilder report = new StringBuilder(); + report.append(MemoryPressureUtil.currentPsiState()); ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true); // don't dump native PIDs for background ANRs unless it is the process of interest @@ -1608,19 +1612,20 @@ class ProcessRecord implements WindowProcessListener { // For background ANRs, don't pass the ProcessCpuTracker to // avoid spending 1/2 second collecting stats to rank lastPids. + StringWriter tracesFileException = new StringWriter(); File tracesFile = ActivityManagerService.dumpStackTraces(firstPids, (isSilentAnr()) ? null : processCpuTracker, (isSilentAnr()) ? null : lastPids, - nativePids); + nativePids, tracesFileException); - String cpuInfo = null; if (isMonitorCpuUsage()) { mService.updateCpuStatsNow(); synchronized (mService.mProcessCpuTracker) { - cpuInfo = mService.mProcessCpuTracker.printCurrentState(anrTime); + report.append(mService.mProcessCpuTracker.printCurrentState(anrTime)); } info.append(processCpuTracker.printCurrentLoad()); - info.append(cpuInfo); + info.append(report); } + report.append(tracesFileException.getBuffer()); info.append(processCpuTracker.printCurrentState(anrTime)); @@ -1645,7 +1650,8 @@ class ProcessRecord implements WindowProcessListener { final ProcessRecord parentPr = parentProcess != null ? (ProcessRecord) parentProcess.mOwner : null; mService.addErrorToDropBox("anr", this, processName, activityShortComponentName, - parentShortComponentName, parentPr, annotation, cpuInfo, tracesFile, null); + parentShortComponentName, parentPr, annotation, report.toString(), tracesFile, + null); if (mWindowProcessController.appNotResponding(info.toString(), () -> kill("anr", ApplicationExitInfo.REASON_ANR, true), diff --git a/services/core/java/com/android/server/connectivity/NetworkRanker.java b/services/core/java/com/android/server/connectivity/NetworkRanker.java index c536ab25e925..d0aabf95d572 100644 --- a/services/core/java/com/android/server/connectivity/NetworkRanker.java +++ b/services/core/java/com/android/server/connectivity/NetworkRanker.java @@ -16,16 +16,10 @@ package com.android.server.connectivity; -import static android.net.NetworkScore.POLICY_IGNORE_ON_WIFI; - -import static com.android.internal.util.FunctionalUtils.findFirst; - import android.annotation.NonNull; import android.annotation.Nullable; -import android.net.NetworkCapabilities; import android.net.NetworkRequest; -import java.util.ArrayList; import java.util.Collection; /** @@ -37,38 +31,20 @@ public class NetworkRanker { /** * Find the best network satisfying this request among the list of passed networks. */ + // Almost equivalent to Collections.max(nais), but allows returning null if no network + // satisfies the request. @Nullable public NetworkAgentInfo getBestNetwork(@NonNull final NetworkRequest request, @NonNull final Collection<NetworkAgentInfo> nais) { - final ArrayList<NetworkAgentInfo> candidates = new ArrayList<>(nais); - candidates.removeIf(nai -> !nai.satisfies(request)); - // Enforce policy. - filterBadWifiAvoidancePolicy(candidates); - NetworkAgentInfo bestNetwork = null; int bestScore = Integer.MIN_VALUE; - for (final NetworkAgentInfo nai : candidates) { - final int score = nai.getCurrentScore(); - if (score > bestScore) { + for (final NetworkAgentInfo nai : nais) { + if (!nai.satisfies(request)) continue; + if (nai.getCurrentScore() > bestScore) { bestNetwork = nai; - bestScore = score; + bestScore = nai.getCurrentScore(); } } return bestNetwork; } - - // If some network with wifi transport is present, drop all networks with POLICY_IGNORE_ON_WIFI. - private void filterBadWifiAvoidancePolicy( - @NonNull final ArrayList<NetworkAgentInfo> candidates) { - final NetworkAgentInfo wifi = findFirst(candidates, - nai -> nai.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) - && nai.everValidated - // Horrible hack : there is old UI that will let a user say they want to - // override the policy only for this network only at this time and it - // feeds into the following member. This old UI should probably be removed - // but for now keep backward compatibility. - && !nai.avoidUnvalidated); - if (null == wifi) return; // No wifi : this policy doesn't apply - candidates.removeIf(nai -> nai.getNetworkScore().hasPolicy(POLICY_IGNORE_ON_WIFI)); - } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 14964b5fb3dc..52052f8dd871 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -12760,7 +12760,11 @@ public class PackageManagerService extends IPackageManager.Stub throw new SecurityException("Calling uid " + callingUid + " cannot call for user " + userId); } - Preconditions.checkNotNull(packageNames, "packageNames cannot be null"); + Objects.requireNonNull(packageNames, "packageNames cannot be null"); + if (restrictionFlags != 0 && !isSuspendAllowedForUser(userId)) { + Slog.w(TAG, "Cannot restrict packages due to restrictions on user " + userId); + return packageNames; + } final List<String> changedPackagesList = new ArrayList<>(packageNames.length); final IntArray changedUids = new IntArray(packageNames.length); @@ -12847,6 +12851,10 @@ public class PackageManagerService extends IPackageManager.Stub if (ArrayUtils.isEmpty(packageNames)) { return packageNames; } + if (suspended && !isSuspendAllowedForUser(userId)) { + Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId); + return packageNames; + } final List<String> changedPackagesList = new ArrayList<>(packageNames.length); final IntArray changedUids = new IntArray(packageNames.length); @@ -12985,30 +12993,41 @@ public class PackageManagerService extends IPackageManager.Stub } } + void unsuspendForSuspendingPackage(String suspendingPackage, int userId) { + final String[] allPackages; + synchronized (mLock) { + allPackages = mPackages.keySet().toArray(new String[mPackages.size()]); + } + removeSuspensionsBySuspendingPackage(allPackages, suspendingPackage::equals, userId); + } + /** - * Immediately unsuspends any packages suspended by the given package. To be called - * when such a package's data is cleared or it is removed from the device. + * Removes any suspensions on given packages that were added by packages that pass the given + * predicate. * - * <p><b>Should not be used on a frequent code path</b> as it flushes state to disk - * synchronously + * <p> Caller must flush package restrictions if it cares about immediate data consistency. * - * @param suspendingPackage The suspending package + * @param packagesToChange The packages on which the suspension are to be removed. + * @param suspendingPackagePredicate A predicate identifying the suspending packages whose + * suspensions will be removed. * @param userId The user for which the changes are taking place. */ - private void unsuspendForSuspendingPackage(String suspendingPackage, int userId) { + void removeSuspensionsBySuspendingPackage(String[] packagesToChange, + Predicate<String> suspendingPackagePredicate, int userId) { final List<String> unsuspendedPackages = new ArrayList<>(); final IntArray unsuspendedUids = new IntArray(); synchronized (mLock) { - for (PackageSetting ps : mSettings.mPackages.values()) { - final PackageUserState pus = ps.readUserState(userId); - if (pus.suspended) { - ps.removeSuspension(suspendingPackage, userId); + for (String packageName : packagesToChange) { + final PackageSetting ps = mSettings.mPackages.get(packageName); + if (ps.getSuspended(userId)) { + ps.removeSuspension(suspendingPackagePredicate, userId); if (!ps.getSuspended(userId)) { unsuspendedPackages.add(ps.name); unsuspendedUids.add(UserHandle.getUid(userId, ps.getAppId())); } } } + scheduleWritePackageRestrictionsLocked(userId); } if (!unsuspendedPackages.isEmpty()) { final String[] packageArray = unsuspendedPackages.toArray( @@ -13016,13 +13035,67 @@ public class PackageManagerService extends IPackageManager.Stub sendMyPackageSuspendedOrUnsuspended(packageArray, false, userId); sendPackagesSuspendedForUser(packageArray, unsuspendedUids.toArray(), userId, false); } - // Write package restrictions immediately to avoid an inconsistent state. - mSettings.writePackageRestrictionsLPr(userId); + } + + void removeAllDistractingPackageRestrictions(int userId) { + final String[] allPackages; + synchronized (mLock) { + allPackages = mPackages.keySet().toArray(new String[mPackages.size()]); + } + PackageManagerService.this.removeDistractingPackageRestrictions(allPackages, userId); + } + + /** + * Removes any {@link android.content.pm.PackageManager.DistractionRestriction restrictions} + * set on given packages. + * + * <p> Caller must flush package restrictions if it cares about immediate data consistency. + * + * @param packagesToChange The packages on which restrictions are to be removed. + * @param userId the user for which changes are taking place. + */ + void removeDistractingPackageRestrictions(String[] packagesToChange, int userId) { + final List<String> changedPackages = new ArrayList<>(); + final IntArray changedUids = new IntArray(); + synchronized (mLock) { + for (String packageName : packagesToChange) { + final PackageSetting ps = mSettings.mPackages.get(packageName); + if (ps.getDistractionFlags(userId) != 0) { + ps.setDistractionFlags(0, userId); + changedPackages.add(ps.name); + changedUids.add(UserHandle.getUid(userId, ps.getAppId())); + } + } + if (!changedPackages.isEmpty()) { + final String[] packageArray = changedPackages.toArray( + new String[changedPackages.size()]); + sendDistractingPackagesChanged(packageArray, changedUids.toArray(), userId, 0); + scheduleWritePackageRestrictionsLocked(userId); + } + } + } + + private boolean isCallerDeviceOrProfileOwner(int userId) { + final int callingUid = Binder.getCallingUid(); + if (callingUid == Process.SYSTEM_UID) { + return true; + } + final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId); + if (ownerPackage != null) { + return callingUid == getPackageUidInternal(ownerPackage, 0, userId, callingUid); + } + return false; + } + + private boolean isSuspendAllowedForUser(int userId) { + return isCallerDeviceOrProfileOwner(userId) + || (!mUserManager.hasUserRestriction(UserManager.DISALLOW_APPS_CONTROL, userId) + && !mUserManager.hasUserRestriction(UserManager.DISALLOW_UNINSTALL_APPS, userId)); } @Override public String[] getUnsuspendablePackagesForUser(String[] packageNames, int userId) { - Preconditions.checkNotNull(packageNames, "packageNames cannot be null"); + Objects.requireNonNull(packageNames, "packageNames cannot be null"); mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, "getUnsuspendablePackagesForUser"); final int callingUid = Binder.getCallingUid(); @@ -13030,11 +13103,23 @@ public class PackageManagerService extends IPackageManager.Stub throw new SecurityException("Calling uid " + callingUid + " cannot query getUnsuspendablePackagesForUser for user " + userId); } + if (!isSuspendAllowedForUser(userId)) { + Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId); + return packageNames; + } final ArraySet<String> unactionablePackages = new ArraySet<>(); final boolean[] canSuspend = canSuspendPackageForUserInternal(packageNames, userId); for (int i = 0; i < packageNames.length; i++) { if (!canSuspend[i]) { unactionablePackages.add(packageNames[i]); + continue; + } + synchronized (mLock) { + final PackageSetting ps = mSettings.mPackages.get(packageNames[i]); + if (ps == null || shouldFilterApplicationLocked(ps, callingUid, userId)) { + Slog.w(TAG, "Could not find package setting for package: " + packageNames[i]); + unactionablePackages.add(packageNames[i]); + } } } return unactionablePackages.toArray(new String[unactionablePackages.size()]); @@ -13051,6 +13136,7 @@ public class PackageManagerService extends IPackageManager.Stub @NonNull private boolean[] canSuspendPackageForUserInternal(@NonNull String[] packageNames, int userId) { final boolean[] canSuspend = new boolean[packageNames.length]; + final boolean isCallerOwner = isCallerDeviceOrProfileOwner(userId); final long callingId = Binder.clearCallingIdentity(); try { final String activeLauncherPackageName = getActiveLauncherPackageName(userId); @@ -13100,6 +13186,11 @@ public class PackageManagerService extends IPackageManager.Stub + "\": protected package"); continue; } + if (!isCallerOwner && mSettings.getBlockUninstallLPr(userId, packageName)) { + Slog.w(TAG, "Cannot suspend package \"" + packageName + + "\": blocked by admin"); + continue; + } // Cannot suspend static shared libs as they are considered // a part of the using app (emulating static linking). Also @@ -18449,6 +18540,8 @@ public class PackageManagerService extends IPackageManager.Stub if (checkPermission(Manifest.permission.SUSPEND_APPS, packageName, userId) == PERMISSION_GRANTED) { unsuspendForSuspendingPackage(packageName, userId); + removeAllDistractingPackageRestrictions(userId); + flushPackageRestrictionsAsUserInternalLocked(userId); } } } else { @@ -19972,6 +20065,16 @@ public class PackageManagerService extends IPackageManager.Stub } synchronized (mLock) { pkgSetting.setEnabled(newState, userId, callingPackage); + if (newState == COMPONENT_ENABLED_STATE_DISABLED_USER + || newState == COMPONENT_ENABLED_STATE_DISABLED + && pkgSetting.getPermissionsState().hasPermission( + Manifest.permission.SUSPEND_APPS, userId)) { + // 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 + // blocked + unsuspendForSuspendingPackage(packageName, userId); + removeAllDistractingPackageRestrictions(userId); + } } } else { synchronized (mLock) { @@ -23213,6 +23316,43 @@ public class PackageManagerService extends IPackageManager.Stub } @Override + public void removeAllNonSystemPackageSuspensions(int userId) { + final String[] allPackages; + synchronized (mLock) { + allPackages = mPackages.keySet().toArray(new String[mPackages.size()]); + } + PackageManagerService.this.removeSuspensionsBySuspendingPackage(allPackages, + (suspendingPackage) -> !PLATFORM_PACKAGE_NAME.equals(suspendingPackage), + userId); + } + + @Override + public void removeNonSystemPackageSuspensions(String packageName, int userId) { + PackageManagerService.this.removeSuspensionsBySuspendingPackage( + new String[]{packageName}, + (suspendingPackage) -> !PLATFORM_PACKAGE_NAME.equals(suspendingPackage), + userId); + } + + @Override + public void flushPackageRestrictions(int userId) { + synchronized (mLock) { + PackageManagerService.this.flushPackageRestrictionsAsUserInternalLocked(userId); + } + } + + @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) { synchronized (mLock) { final PackageSetting ps = mSettings.mPackages.get(suspendedPackage); diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index 18bc879b978b..318a233b6e14 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -43,6 +43,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.function.Predicate; /** * Settings base class for pending and resolved classes. @@ -433,6 +434,22 @@ public abstract class PackageSettingBase extends SettingBase { existingUserState.suspended = (existingUserState.suspendParams != null); } + void removeSuspension(Predicate<String> suspendingPackagePredicate, int userId) { + final PackageUserState existingUserState = modifyUserState(userId); + if (existingUserState.suspendParams != null) { + for (int i = existingUserState.suspendParams.size() - 1; i >= 0; i--) { + final String suspendingPackage = existingUserState.suspendParams.keyAt(i); + if (suspendingPackagePredicate.test(suspendingPackage)) { + existingUserState.suspendParams.removeAt(i); + } + } + if (existingUserState.suspendParams.size() == 0) { + existingUserState.suspendParams = null; + } + } + existingUserState.suspended = (existingUserState.suspendParams != null); + } + public boolean getInstantApp(int userId) { return readUserState(userId).instantApp; } diff --git a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java index 27e8b0be4478..8d3f32aab9c5 100644 --- a/services/core/java/com/android/server/pm/UserRestrictionsUtils.java +++ b/services/core/java/com/android/server/pm/UserRestrictionsUtils.java @@ -26,6 +26,7 @@ import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; +import android.content.pm.PackageManagerInternal; import android.os.Binder; import android.os.Bundle; import android.os.Process; @@ -42,6 +43,7 @@ import android.util.Slog; import android.util.SparseArray; import com.android.internal.util.Preconditions; +import com.android.server.LocalServices; import com.google.android.collect.Sets; @@ -679,6 +681,15 @@ public class UserRestrictionsUtils { Global.LOCATION_GLOBAL_KILL_SWITCH, "0"); } break; + case UserManager.DISALLOW_APPS_CONTROL: + // Intentional fall-through + case UserManager.DISALLOW_UNINSTALL_APPS: + final PackageManagerInternal pmi = LocalServices.getService( + PackageManagerInternal.class); + pmi.removeAllNonSystemPackageSuspensions(userId); + pmi.removeAllDistractingPackageRestrictions(userId); + pmi.flushPackageRestrictions(userId); + break; } } finally { Binder.restoreCallingIdentity(id); diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index df6784e818f9..aed2d9bb9dc7 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -82,6 +82,7 @@ import android.os.SynchronousResultReceiver; import android.os.SystemClock; import android.os.SystemProperties; import android.os.Temperature; +import android.os.Trace; import android.os.UserHandle; import android.os.UserManager; import android.os.connectivity.WifiActivityEnergyInfo; @@ -271,127 +272,134 @@ public class StatsPullAtomService extends SystemService { private class StatsPullAtomCallbackImpl implements StatsManager.StatsPullAtomCallback { @Override public int onPullAtom(int atomTag, List<StatsEvent> data) { - switch(atomTag) { - case FrameworkStatsLog.WIFI_BYTES_TRANSFER: - return pullWifiBytesTransfer(atomTag, data); - case FrameworkStatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG: - return pullWifiBytesTransferBackground(atomTag, data); - case FrameworkStatsLog.MOBILE_BYTES_TRANSFER: - return pullMobileBytesTransfer(atomTag, data); - case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG: - return pullMobileBytesTransferBackground(atomTag, data); - case FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER: - return pullBluetoothBytesTransfer(atomTag, data); - case FrameworkStatsLog.KERNEL_WAKELOCK: - return pullKernelWakelock(atomTag, data); - case FrameworkStatsLog.CPU_TIME_PER_FREQ: - return pullCpuTimePerFreq(atomTag, data); - case FrameworkStatsLog.CPU_TIME_PER_UID: - return pullCpuTimePerUid(atomTag, data); - case FrameworkStatsLog.CPU_TIME_PER_UID_FREQ: - return pullCpuTimeperUidFreq(atomTag, data); - case FrameworkStatsLog.CPU_ACTIVE_TIME: - return pullCpuActiveTime(atomTag, data); - case FrameworkStatsLog.CPU_CLUSTER_TIME: - return pullCpuClusterTime(atomTag, data); - case FrameworkStatsLog.WIFI_ACTIVITY_INFO: - return pullWifiActivityInfo(atomTag, data); - case FrameworkStatsLog.MODEM_ACTIVITY_INFO: - return pullModemActivityInfo(atomTag, data); - case FrameworkStatsLog.BLUETOOTH_ACTIVITY_INFO: - return pullBluetoothActivityInfo(atomTag, data); - case FrameworkStatsLog.SYSTEM_ELAPSED_REALTIME: - return pullSystemElapsedRealtime(atomTag, data); - case FrameworkStatsLog.SYSTEM_UPTIME: - return pullSystemUptime(atomTag, data); - case FrameworkStatsLog.PROCESS_MEMORY_STATE: - return pullProcessMemoryState(atomTag, data); - case FrameworkStatsLog.PROCESS_MEMORY_HIGH_WATER_MARK: - return pullProcessMemoryHighWaterMark(atomTag, data); - case FrameworkStatsLog.PROCESS_MEMORY_SNAPSHOT: - return pullProcessMemorySnapshot(atomTag, data); - case FrameworkStatsLog.SYSTEM_ION_HEAP_SIZE: - return pullSystemIonHeapSize(atomTag, data); - case FrameworkStatsLog.ION_HEAP_SIZE: - return pullIonHeapSize(atomTag, data); - case FrameworkStatsLog.PROCESS_SYSTEM_ION_HEAP_SIZE: - return pullProcessSystemIonHeapSize(atomTag, data); - case FrameworkStatsLog.TEMPERATURE: - return pullTemperature(atomTag, data); - case FrameworkStatsLog.COOLING_DEVICE: - return pullCooldownDevice(atomTag, data); - case FrameworkStatsLog.BINDER_CALLS: - return pullBinderCallsStats(atomTag, data); - case FrameworkStatsLog.BINDER_CALLS_EXCEPTIONS: - return pullBinderCallsStatsExceptions(atomTag, data); - case FrameworkStatsLog.LOOPER_STATS: - return pullLooperStats(atomTag, data); - case FrameworkStatsLog.DISK_STATS: - return pullDiskStats(atomTag, data); - case FrameworkStatsLog.DIRECTORY_USAGE: - return pullDirectoryUsage(atomTag, data); - case FrameworkStatsLog.APP_SIZE: - return pullAppSize(atomTag, data); - case FrameworkStatsLog.CATEGORY_SIZE: - return pullCategorySize(atomTag, data); - case FrameworkStatsLog.NUM_FINGERPRINTS_ENROLLED: - return pullNumBiometricsEnrolled( - BiometricsProtoEnums.MODALITY_FINGERPRINT, atomTag, data); - case FrameworkStatsLog.NUM_FACES_ENROLLED: - return pullNumBiometricsEnrolled( - BiometricsProtoEnums.MODALITY_FACE, atomTag, data); - case FrameworkStatsLog.PROC_STATS: - return pullProcStats(ProcessStats.REPORT_ALL, atomTag, data); - case FrameworkStatsLog.PROC_STATS_PKG_PROC: - return pullProcStats(ProcessStats.REPORT_PKG_PROC_STATS, atomTag, data); - case FrameworkStatsLog.DISK_IO: - return pullDiskIO(atomTag, data); - case FrameworkStatsLog.POWER_PROFILE: - return pullPowerProfile(atomTag, data); - case FrameworkStatsLog.PROCESS_CPU_TIME: - return pullProcessCpuTime(atomTag, data); - case FrameworkStatsLog.CPU_TIME_PER_THREAD_FREQ: - return pullCpuTimePerThreadFreq(atomTag, data); - case FrameworkStatsLog.DEVICE_CALCULATED_POWER_USE: - return pullDeviceCalculatedPowerUse(atomTag, data); - case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID: - return pullDeviceCalculatedPowerBlameUid(atomTag, data); - case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER: - return pullDeviceCalculatedPowerBlameOther(atomTag, data); - case FrameworkStatsLog.DEBUG_ELAPSED_CLOCK: - return pullDebugElapsedClock(atomTag, data); - case FrameworkStatsLog.DEBUG_FAILING_ELAPSED_CLOCK: - return pullDebugFailingElapsedClock(atomTag, data); - case FrameworkStatsLog.BUILD_INFORMATION: - return pullBuildInformation(atomTag, data); - case FrameworkStatsLog.ROLE_HOLDER: - return pullRoleHolder(atomTag, data); - case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE: - return pullDangerousPermissionState(atomTag, data); - case FrameworkStatsLog.TIME_ZONE_DATA_INFO: - return pullTimeZoneDataInfo(atomTag, data); - case FrameworkStatsLog.EXTERNAL_STORAGE_INFO: - return pullExternalStorageInfo(atomTag, data); - case FrameworkStatsLog.APPS_ON_EXTERNAL_STORAGE_INFO: - return pullAppsOnExternalStorageInfo(atomTag, data); - case FrameworkStatsLog.FACE_SETTINGS: - return pullFaceSettings(atomTag, data); - case FrameworkStatsLog.APP_OPS: - return pullAppOps(atomTag, data); - case FrameworkStatsLog.RUNTIME_APP_OP_ACCESS: - return pullRuntimeAppOpAccessMessage(atomTag, data); - case FrameworkStatsLog.NOTIFICATION_REMOTE_VIEWS: - return pullNotificationRemoteViews(atomTag, data); - case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED: - return pullDangerousPermissionState(atomTag, data); - case FrameworkStatsLog.BATTERY_LEVEL: - case FrameworkStatsLog.REMAINING_BATTERY_CAPACITY: - case FrameworkStatsLog.FULL_BATTERY_CAPACITY: - case FrameworkStatsLog.BATTERY_VOLTAGE: - case FrameworkStatsLog.BATTERY_CYCLE_COUNT: - return pullHealthHal(atomTag, data); - default: - throw new UnsupportedOperationException("Unknown tagId=" + atomTag); + if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StatsPull-" + atomTag); + } + try { + switch (atomTag) { + case FrameworkStatsLog.WIFI_BYTES_TRANSFER: + return pullWifiBytesTransfer(atomTag, data); + case FrameworkStatsLog.WIFI_BYTES_TRANSFER_BY_FG_BG: + return pullWifiBytesTransferBackground(atomTag, data); + case FrameworkStatsLog.MOBILE_BYTES_TRANSFER: + return pullMobileBytesTransfer(atomTag, data); + case FrameworkStatsLog.MOBILE_BYTES_TRANSFER_BY_FG_BG: + return pullMobileBytesTransferBackground(atomTag, data); + case FrameworkStatsLog.BLUETOOTH_BYTES_TRANSFER: + return pullBluetoothBytesTransfer(atomTag, data); + case FrameworkStatsLog.KERNEL_WAKELOCK: + return pullKernelWakelock(atomTag, data); + case FrameworkStatsLog.CPU_TIME_PER_FREQ: + return pullCpuTimePerFreq(atomTag, data); + case FrameworkStatsLog.CPU_TIME_PER_UID: + return pullCpuTimePerUid(atomTag, data); + case FrameworkStatsLog.CPU_TIME_PER_UID_FREQ: + return pullCpuTimeperUidFreq(atomTag, data); + case FrameworkStatsLog.CPU_ACTIVE_TIME: + return pullCpuActiveTime(atomTag, data); + case FrameworkStatsLog.CPU_CLUSTER_TIME: + return pullCpuClusterTime(atomTag, data); + case FrameworkStatsLog.WIFI_ACTIVITY_INFO: + return pullWifiActivityInfo(atomTag, data); + case FrameworkStatsLog.MODEM_ACTIVITY_INFO: + return pullModemActivityInfo(atomTag, data); + case FrameworkStatsLog.BLUETOOTH_ACTIVITY_INFO: + return pullBluetoothActivityInfo(atomTag, data); + case FrameworkStatsLog.SYSTEM_ELAPSED_REALTIME: + return pullSystemElapsedRealtime(atomTag, data); + case FrameworkStatsLog.SYSTEM_UPTIME: + return pullSystemUptime(atomTag, data); + case FrameworkStatsLog.PROCESS_MEMORY_STATE: + return pullProcessMemoryState(atomTag, data); + case FrameworkStatsLog.PROCESS_MEMORY_HIGH_WATER_MARK: + return pullProcessMemoryHighWaterMark(atomTag, data); + case FrameworkStatsLog.PROCESS_MEMORY_SNAPSHOT: + return pullProcessMemorySnapshot(atomTag, data); + case FrameworkStatsLog.SYSTEM_ION_HEAP_SIZE: + return pullSystemIonHeapSize(atomTag, data); + case FrameworkStatsLog.ION_HEAP_SIZE: + return pullIonHeapSize(atomTag, data); + case FrameworkStatsLog.PROCESS_SYSTEM_ION_HEAP_SIZE: + return pullProcessSystemIonHeapSize(atomTag, data); + case FrameworkStatsLog.TEMPERATURE: + return pullTemperature(atomTag, data); + case FrameworkStatsLog.COOLING_DEVICE: + return pullCooldownDevice(atomTag, data); + case FrameworkStatsLog.BINDER_CALLS: + return pullBinderCallsStats(atomTag, data); + case FrameworkStatsLog.BINDER_CALLS_EXCEPTIONS: + return pullBinderCallsStatsExceptions(atomTag, data); + case FrameworkStatsLog.LOOPER_STATS: + return pullLooperStats(atomTag, data); + case FrameworkStatsLog.DISK_STATS: + return pullDiskStats(atomTag, data); + case FrameworkStatsLog.DIRECTORY_USAGE: + return pullDirectoryUsage(atomTag, data); + case FrameworkStatsLog.APP_SIZE: + return pullAppSize(atomTag, data); + case FrameworkStatsLog.CATEGORY_SIZE: + return pullCategorySize(atomTag, data); + case FrameworkStatsLog.NUM_FINGERPRINTS_ENROLLED: + return pullNumBiometricsEnrolled( + BiometricsProtoEnums.MODALITY_FINGERPRINT, atomTag, data); + case FrameworkStatsLog.NUM_FACES_ENROLLED: + return pullNumBiometricsEnrolled( + BiometricsProtoEnums.MODALITY_FACE, atomTag, data); + case FrameworkStatsLog.PROC_STATS: + return pullProcStats(ProcessStats.REPORT_ALL, atomTag, data); + case FrameworkStatsLog.PROC_STATS_PKG_PROC: + return pullProcStats(ProcessStats.REPORT_PKG_PROC_STATS, atomTag, data); + case FrameworkStatsLog.DISK_IO: + return pullDiskIO(atomTag, data); + case FrameworkStatsLog.POWER_PROFILE: + return pullPowerProfile(atomTag, data); + case FrameworkStatsLog.PROCESS_CPU_TIME: + return pullProcessCpuTime(atomTag, data); + case FrameworkStatsLog.CPU_TIME_PER_THREAD_FREQ: + return pullCpuTimePerThreadFreq(atomTag, data); + case FrameworkStatsLog.DEVICE_CALCULATED_POWER_USE: + return pullDeviceCalculatedPowerUse(atomTag, data); + case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_UID: + return pullDeviceCalculatedPowerBlameUid(atomTag, data); + case FrameworkStatsLog.DEVICE_CALCULATED_POWER_BLAME_OTHER: + return pullDeviceCalculatedPowerBlameOther(atomTag, data); + case FrameworkStatsLog.DEBUG_ELAPSED_CLOCK: + return pullDebugElapsedClock(atomTag, data); + case FrameworkStatsLog.DEBUG_FAILING_ELAPSED_CLOCK: + return pullDebugFailingElapsedClock(atomTag, data); + case FrameworkStatsLog.BUILD_INFORMATION: + return pullBuildInformation(atomTag, data); + case FrameworkStatsLog.ROLE_HOLDER: + return pullRoleHolder(atomTag, data); + case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE: + return pullDangerousPermissionState(atomTag, data); + case FrameworkStatsLog.TIME_ZONE_DATA_INFO: + return pullTimeZoneDataInfo(atomTag, data); + case FrameworkStatsLog.EXTERNAL_STORAGE_INFO: + return pullExternalStorageInfo(atomTag, data); + case FrameworkStatsLog.APPS_ON_EXTERNAL_STORAGE_INFO: + return pullAppsOnExternalStorageInfo(atomTag, data); + case FrameworkStatsLog.FACE_SETTINGS: + return pullFaceSettings(atomTag, data); + case FrameworkStatsLog.APP_OPS: + return pullAppOps(atomTag, data); + case FrameworkStatsLog.RUNTIME_APP_OP_ACCESS: + return pullRuntimeAppOpAccessMessage(atomTag, data); + case FrameworkStatsLog.NOTIFICATION_REMOTE_VIEWS: + return pullNotificationRemoteViews(atomTag, data); + case FrameworkStatsLog.DANGEROUS_PERMISSION_STATE_SAMPLED: + return pullDangerousPermissionState(atomTag, data); + case FrameworkStatsLog.BATTERY_LEVEL: + case FrameworkStatsLog.REMAINING_BATTERY_CAPACITY: + case FrameworkStatsLog.FULL_BATTERY_CAPACITY: + case FrameworkStatsLog.BATTERY_VOLTAGE: + case FrameworkStatsLog.BATTERY_CYCLE_COUNT: + return pullHealthHal(atomTag, data); + default: + throw new UnsupportedOperationException("Unknown tagId=" + atomTag); + } + } finally { + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); } } } diff --git a/services/core/java/com/android/server/wm/InputManagerCallback.java b/services/core/java/com/android/server/wm/InputManagerCallback.java index 5b892f808e2f..deaec0ac75ae 100644 --- a/services/core/java/com/android/server/wm/InputManagerCallback.java +++ b/services/core/java/com/android/server/wm/InputManagerCallback.java @@ -158,7 +158,8 @@ final class InputManagerCallback implements InputManagerService.WindowManagerCal } final File tracesFile = ActivityManagerService.dumpStackTraces(firstPids, - null /* processCpuTracker */, null /* lastPids */, nativePids); + null /* processCpuTracker */, null /* lastPids */, nativePids, + null /* logExceptionCreatingFile */); if (tracesFile != null) { tracesFile.renameTo(new File(tracesFile.getParent(), tracesFile.getName() + "_pre")); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 46d8800463eb..440b779b8566 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -11176,6 +11176,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { mInjector.binderRestoreCallingIdentity(id); } } + if (uninstallBlocked) { + final PackageManagerInternal pmi = mInjector.getPackageManagerInternal(); + pmi.removeNonSystemPackageSuspensions(packageName, userId); + pmi.removeDistractingPackageRestrictions(packageName, userId); + pmi.flushPackageRestrictions(userId); + } final boolean isDelegate = (who == null); DevicePolicyEventLogger .createEvent(DevicePolicyEnums.SET_UNINSTALL_BLOCKED) diff --git a/tests/net/common/java/android/net/NetworkScoreTest.kt b/tests/net/common/java/android/net/NetworkScoreTest.kt index a7e33b3d63b6..a63d58d5a0f6 100644 --- a/tests/net/common/java/android/net/NetworkScoreTest.kt +++ b/tests/net/common/java/android/net/NetworkScoreTest.kt @@ -16,9 +16,7 @@ package android.net -import android.net.NetworkScore.POLICY_DEFAULT_SUBSCRIPTION -import android.net.NetworkScore.POLICY_IGNORE_ON_WIFI -import android.net.NetworkScore.RANGE_MEDIUM +import android.net.NetworkScore.Metrics.BANDWIDTH_UNKNOWN import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 import com.android.testutils.assertParcelSane @@ -34,30 +32,26 @@ private const val TEST_SCORE = 80 @RunWith(AndroidJUnit4::class) @SmallTest class NetworkScoreTest { - private fun makeScoreBuilder() = NetworkScore.Builder() - .setLegacyScore(TEST_SCORE) - .addPolicy(POLICY_IGNORE_ON_WIFI) - .addPolicy(POLICY_DEFAULT_SUBSCRIPTION) - .setExiting(false) - .setEndToEndMetrics(NetworkScore.Metrics(145 /* latency */, - 2500 /* downlinkBandwidth */, 1430 /* uplinkBandwidth */)) - .setRange(RANGE_MEDIUM) - .setSignalStrength(400) - @Test fun testParcelNetworkScore() { val defaultCap = NetworkCapabilities() - val legacyBuilder = NetworkScore.Builder().setLegacyScore(TEST_SCORE) - assertEquals(TEST_SCORE, legacyBuilder.build().getLegacyScore()) - assertParcelSane(legacyBuilder.build(), 7) + val builder = NetworkScore.Builder().setLegacyScore(TEST_SCORE) + assertEquals(TEST_SCORE, builder.build().getLegacyScore()) + assertParcelSane(builder.build(), 7) - val builder = makeScoreBuilder() + builder.addPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI) + .addPolicy(NetworkScore.POLICY_DEFAULT_SUBSCRIPTION) + .setLinkLayerMetrics(NetworkScore.Metrics(44 /* latency */, + 380 /* downlinkBandwidth */, BANDWIDTH_UNKNOWN /* uplinkBandwidth */)) + .setEndToEndMetrics(NetworkScore.Metrics(11 /* latency */, + BANDWIDTH_UNKNOWN /* downlinkBandwidth */, 100_000 /* uplinkBandwidth */)) + .setRange(NetworkScore.RANGE_MEDIUM) assertParcelSane(builder.build(), 7) - builder.clearPolicy(POLICY_IGNORE_ON_WIFI) + builder.clearPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI) val ns = builder.build() assertParcelSane(ns, 7) - assertFalse(ns.hasPolicy(POLICY_IGNORE_ON_WIFI)) - assertTrue(ns.hasPolicy(POLICY_DEFAULT_SUBSCRIPTION)) + assertFalse(ns.hasPolicy(NetworkScore.POLICY_IGNORE_ON_WIFI)) + assertTrue(ns.hasPolicy(NetworkScore.POLICY_DEFAULT_SUBSCRIPTION)) val exitingNs = ns.withExiting(true) assertNotEquals(ns.isExiting, exitingNs.isExiting) @@ -79,10 +73,4 @@ class NetworkScoreTest { assertTrue(builder1.build().equals(builder2.build())) assertEquals(builder1.build().hashCode(), builder2.build().hashCode()) } - - @Test - fun testBuilderEquals() { - val ns = makeScoreBuilder().build() - assertEquals(ns, NetworkScore.Builder(ns).build()) - } } diff --git a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt index a6b371a23b58..86c91165f61b 100644 --- a/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt +++ b/tests/net/java/com/android/server/connectivity/NetworkRankerTest.kt @@ -16,7 +16,6 @@ package com.android.server.connectivity -import android.net.NetworkCapabilities import android.net.NetworkRequest import androidx.test.filters.SmallTest import androidx.test.runner.AndroidJUnit4 @@ -36,7 +35,6 @@ class NetworkRankerTest { private fun makeNai(satisfy: Boolean, score: Int) = mock(NetworkAgentInfo::class.java).also { doReturn(satisfy).`when`(it).satisfies(any()) doReturn(score).`when`(it).currentScore - it.networkCapabilities = NetworkCapabilities() } @Test diff --git a/wifi/Android.bp b/wifi/Android.bp index 5c9fb4e86bc7..0c6cf1c170f5 100644 --- a/wifi/Android.bp +++ b/wifi/Android.bp @@ -89,6 +89,7 @@ java_library { ], srcs: [ ":framework-wifi-updatable-sources", + ":framework-wifi-util-lib-aidls", ], // java_api_finder must accompany `srcs` plugins: ["java_api_finder"], |