Loading core/java/android/content/pm/parsing/component/ParsedIntentInfo.java +0 −14 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package android.content.pm.parsing.component; import android.annotation.Nullable; import android.content.IntentFilter; import android.os.Parcel; import android.os.Parcelable; import android.util.Pair; import com.android.internal.util.DataClass; Loading Loading @@ -168,19 +167,6 @@ public final class ParsedIntentInfo extends IntentFilter { + '}'; } public static final Parcelable.Creator<ParsedIntentInfo> CREATOR = new Parcelable.Creator<ParsedIntentInfo>() { @Override public ParsedIntentInfo createFromParcel(Parcel source) { return new ParsedIntentInfo(source); } @Override public ParsedIntentInfo[] newArray(int size) { return new ParsedIntentInfo[size]; } }; public boolean isHasDefault() { return hasDefault; } Loading core/java/android/text/Layout.java +5 −4 Original line number Diff line number Diff line Loading @@ -2350,7 +2350,10 @@ public abstract class Layout { final int ellipsisStringLen = ellipsisString.length(); // Use the ellipsis string only if there are that at least as many characters to replace. final boolean useEllipsisString = ellipsisCount >= ellipsisStringLen; for (int i = 0; i < ellipsisCount; i++) { final int min = Math.max(0, start - ellipsisStart - lineStart); final int max = Math.min(ellipsisCount, end - ellipsisStart - lineStart); for (int i = min; i < max; i++) { final char c; if (useEllipsisString && i < ellipsisStringLen) { c = ellipsisString.charAt(i); Loading @@ -2359,11 +2362,9 @@ public abstract class Layout { } final int a = i + ellipsisStart + lineStart; if (start <= a && a < end) { dest[destoff + a - start] = c; } } } /** * Stores information about bidirectional (left-to-right or right-to-left) Loading packages/Shell/AndroidManifest.xml +1 −1 Original line number Diff line number Diff line Loading @@ -346,7 +346,7 @@ <provider android:name=".HeapDumpProvider" android:authorities="com.android.shell.heapdump" android:grantUriPermissions="true" android:exported="true" /> android:exported="false" /> <activity android:name=".BugreportWarningActivity" Loading services/core/java/com/android/server/am/ActiveServices.java +81 −22 Original line number Diff line number Diff line Loading @@ -734,11 +734,8 @@ public final class ActiveServices { } ComponentName cmp = startServiceInnerLocked(smap, service, r, callerFg, addToStarting); if (!r.mAllowWhileInUsePermissionInFgs) { r.mAllowWhileInUsePermissionInFgs = shouldAllowWhileInUsePermissionInFgsLocked(callingPackage, callingPid, callingUid, service, r, allowBackgroundActivityStarts); } setFgsRestrictionLocked(callingPackage, callingPid, callingUid, r, allowBackgroundActivityStarts); return cmp; } Loading Loading @@ -1411,14 +1408,6 @@ public final class ActiveServices { + String.format("0x%08X", manifestType) + " in service element of manifest file"); } // If the foreground service is not started from TOP process, do not allow it to // have while-in-use location/camera/microphone access. if (!r.mAllowWhileInUsePermissionInFgs) { Slog.w(TAG, "Foreground service started from background can not have " + "location/camera/microphone access: service " + r.shortInstanceName); } } boolean alreadyStartedOp = false; boolean stopProcStatsOp = false; Loading Loading @@ -1466,6 +1455,57 @@ public final class ActiveServices { ignoreForeground = true; } if (!ignoreForeground) { if (r.mStartForegroundCount == 0) { /* If the service was started with startService(), not startForegroundService(), and if startForeground() isn't called within mFgsStartForegroundTimeoutMs, then we check the state of the app (who owns the service, which is the app that called startForeground()) again. If the app is in the foreground, or in any other cases where FGS-starts are allowed, then we still allow the FGS to be started. Otherwise, startForeground() would fail. If the service was started with startForegroundService(), then the service must call startForeground() within a timeout anyway, so we don't need this check. */ if (!r.fgRequired) { final long delayMs = SystemClock.elapsedRealtime() - r.createRealTime; if (delayMs > mAm.mConstants.mFgsStartForegroundTimeoutMs) { resetFgsRestrictionLocked(r); setFgsRestrictionLocked(r.serviceInfo.packageName, r.app.pid, r.appInfo.uid, r, false); EventLog.writeEvent(0x534e4554, "183147114", r.appInfo.uid, "call setFgsRestrictionLocked again due to " + "startForegroundTimeout"); } } } else if (r.mStartForegroundCount >= 1) { // The second or later time startForeground() is called after service is // started. Check for app state again. final long delayMs = SystemClock.elapsedRealtime() - r.mLastSetFgsRestrictionTime; if (delayMs > mAm.mConstants.mFgsStartForegroundTimeoutMs) { resetFgsRestrictionLocked(r); setFgsRestrictionLocked(r.serviceInfo.packageName, r.app.pid, r.appInfo.uid, r, false); EventLog.writeEvent(0x534e4554, "183147114", r.appInfo.uid, "call setFgsRestrictionLocked for " + (r.mStartForegroundCount + 1) + "th startForeground"); } } // If the foreground service is not started from TOP process, do not allow it to // have while-in-use location/camera/microphone access. if (!r.mAllowWhileInUsePermissionInFgs) { Slog.w(TAG, "Foreground service started from background can not have " + "location/camera/microphone access: service " + r.shortInstanceName); } } // Apps under strict background restrictions simply don't get to have foreground // services, so now that we've enforced the startForegroundService() contract // we only do the machinery of making the service foreground when the app Loading Loading @@ -1501,6 +1541,7 @@ public final class ActiveServices { active.mNumActive++; } r.isForeground = true; r.mStartForegroundCount++; if (!stopProcStatsOp) { ServiceState stracker = r.getTracker(); if (stracker != null) { Loading Loading @@ -1559,6 +1600,7 @@ public final class ActiveServices { decActiveForegroundAppLocked(smap, r); } r.isForeground = false; resetFgsRestrictionLocked(r); ServiceState stracker = r.getTracker(); if (stracker != null) { stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), Loading Loading @@ -2118,12 +2160,7 @@ public final class ActiveServices { } } if (!s.mAllowWhileInUsePermissionInFgs) { s.mAllowWhileInUsePermissionInFgs = shouldAllowWhileInUsePermissionInFgsLocked(callingPackage, callingPid, callingUid, service, s, false); } setFgsRestrictionLocked(callingPackage, callingPid, callingUid, s, false); if (s.app != null) { if ((flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) { Loading Loading @@ -3419,7 +3456,7 @@ public final class ActiveServices { r.isForeground = false; r.foregroundId = 0; r.foregroundNoti = null; r.mAllowWhileInUsePermissionInFgs = false; resetFgsRestrictionLocked(r); // Clear start entries. r.clearDeliveredStartsLocked(); Loading Loading @@ -4900,7 +4937,7 @@ public final class ActiveServices { * @return true if allow, false otherwise. */ private boolean shouldAllowWhileInUsePermissionInFgsLocked(String callingPackage, int callingPid, int callingUid, Intent intent, ServiceRecord r, int callingPid, int callingUid, ServiceRecord r, boolean allowBackgroundActivityStarts) { // Is the background FGS start restriction turned on? if (!mAm.mConstants.mFlagBackgroundFgsStartRestrictionEnabled) { Loading Loading @@ -4986,6 +5023,28 @@ public final class ActiveServices { boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid, String callingPackage) { return shouldAllowWhileInUsePermissionInFgsLocked( callingPackage, callingPid, callingUid, null, null, false); callingPackage, callingPid, callingUid, null, false); } /** * In R, mAllowWhileInUsePermissionInFgs is to allow while-in-use permissions in foreground * service or not. while-in-use permissions in FGS started from background might be restricted. * @param callingPackage caller app's package name. * @param callingUid caller app's uid. * @param r the service to start. * @return true if allow, false otherwise. */ private void setFgsRestrictionLocked(String callingPackage, int callingPid, int callingUid, ServiceRecord r, boolean allowBackgroundActivityStarts) { r.mLastSetFgsRestrictionTime = SystemClock.elapsedRealtime(); if (!r.mAllowWhileInUsePermissionInFgs) { r.mAllowWhileInUsePermissionInFgs = shouldAllowWhileInUsePermissionInFgsLocked( callingPackage, callingPid, callingUid, r, allowBackgroundActivityStarts); } } private void resetFgsRestrictionLocked(ServiceRecord r) { r.mAllowWhileInUsePermissionInFgs = false; } } services/core/java/com/android/server/am/ActivityManagerConstants.java +20 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ final class ActivityManagerConstants extends ContentObserver { static final String KEY_PROCESS_START_ASYNC = "process_start_async"; static final String KEY_MEMORY_INFO_THROTTLE_TIME = "memory_info_throttle_time"; static final String KEY_TOP_TO_FGS_GRACE_DURATION = "top_to_fgs_grace_duration"; static final String KEY_FGS_START_FOREGROUND_TIMEOUT = "fgs_start_foreground_timeout"; static final String KEY_PENDINGINTENT_WARNING_THRESHOLD = "pendingintent_warning_threshold"; private static final int DEFAULT_MAX_CACHED_PROCESSES = 32; Loading Loading @@ -121,6 +122,7 @@ final class ActivityManagerConstants extends ContentObserver { private static final boolean DEFAULT_PROCESS_START_ASYNC = true; private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000; private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000; private static final int DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS = 10 * 1000; private static final int DEFAULT_PENDINGINTENT_WARNING_THRESHOLD = 2000; // Flag stored in the DeviceConfig API. Loading Loading @@ -273,6 +275,12 @@ final class ActivityManagerConstants extends ContentObserver { // this long. public long TOP_TO_FGS_GRACE_DURATION = DEFAULT_TOP_TO_FGS_GRACE_DURATION; /** * When service started from background, before the timeout it can be promoted to FGS by calling * Service.startForeground(). */ volatile long mFgsStartForegroundTimeoutMs = DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS; // Indicates whether the activity starts logging is enabled. // Controlled by Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED volatile boolean mFlagActivityStartsLoggingEnabled; Loading Loading @@ -421,6 +429,9 @@ final class ActivityManagerConstants extends ContentObserver { case KEY_MIN_ASSOC_LOG_DURATION: updateMinAssocLogDuration(); break; case KEY_FGS_START_FOREGROUND_TIMEOUT: updateFgsStartForegroundTimeout(); break; default: break; } Loading Loading @@ -697,6 +708,13 @@ final class ActivityManagerConstants extends ContentObserver { /* defaultValue */ DEFAULT_MIN_ASSOC_LOG_DURATION); } private void updateFgsStartForegroundTimeout() { mFgsStartForegroundTimeoutMs = DeviceConfig.getLong( DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_FGS_START_FOREGROUND_TIMEOUT, DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS); } void dump(PrintWriter pw) { pw.println("ACTIVITY MANAGER SETTINGS (dumpsys activity settings) " + Settings.Global.ACTIVITY_MANAGER_CONSTANTS + ":"); Loading Loading @@ -769,6 +787,8 @@ final class ActivityManagerConstants extends ContentObserver { pw.println(Arrays.toString(IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.toArray())); pw.print(" "); pw.print(KEY_MIN_ASSOC_LOG_DURATION); pw.print("="); pw.println(MIN_ASSOC_LOG_DURATION); pw.print(" "); pw.print(KEY_FGS_START_FOREGROUND_TIMEOUT); pw.print("="); pw.println(mFgsStartForegroundTimeoutMs); pw.println(); if (mOverrideMaxCachedProcesses >= 0) { Loading Loading
core/java/android/content/pm/parsing/component/ParsedIntentInfo.java +0 −14 Original line number Diff line number Diff line Loading @@ -19,7 +19,6 @@ package android.content.pm.parsing.component; import android.annotation.Nullable; import android.content.IntentFilter; import android.os.Parcel; import android.os.Parcelable; import android.util.Pair; import com.android.internal.util.DataClass; Loading Loading @@ -168,19 +167,6 @@ public final class ParsedIntentInfo extends IntentFilter { + '}'; } public static final Parcelable.Creator<ParsedIntentInfo> CREATOR = new Parcelable.Creator<ParsedIntentInfo>() { @Override public ParsedIntentInfo createFromParcel(Parcel source) { return new ParsedIntentInfo(source); } @Override public ParsedIntentInfo[] newArray(int size) { return new ParsedIntentInfo[size]; } }; public boolean isHasDefault() { return hasDefault; } Loading
core/java/android/text/Layout.java +5 −4 Original line number Diff line number Diff line Loading @@ -2350,7 +2350,10 @@ public abstract class Layout { final int ellipsisStringLen = ellipsisString.length(); // Use the ellipsis string only if there are that at least as many characters to replace. final boolean useEllipsisString = ellipsisCount >= ellipsisStringLen; for (int i = 0; i < ellipsisCount; i++) { final int min = Math.max(0, start - ellipsisStart - lineStart); final int max = Math.min(ellipsisCount, end - ellipsisStart - lineStart); for (int i = min; i < max; i++) { final char c; if (useEllipsisString && i < ellipsisStringLen) { c = ellipsisString.charAt(i); Loading @@ -2359,11 +2362,9 @@ public abstract class Layout { } final int a = i + ellipsisStart + lineStart; if (start <= a && a < end) { dest[destoff + a - start] = c; } } } /** * Stores information about bidirectional (left-to-right or right-to-left) Loading
packages/Shell/AndroidManifest.xml +1 −1 Original line number Diff line number Diff line Loading @@ -346,7 +346,7 @@ <provider android:name=".HeapDumpProvider" android:authorities="com.android.shell.heapdump" android:grantUriPermissions="true" android:exported="true" /> android:exported="false" /> <activity android:name=".BugreportWarningActivity" Loading
services/core/java/com/android/server/am/ActiveServices.java +81 −22 Original line number Diff line number Diff line Loading @@ -734,11 +734,8 @@ public final class ActiveServices { } ComponentName cmp = startServiceInnerLocked(smap, service, r, callerFg, addToStarting); if (!r.mAllowWhileInUsePermissionInFgs) { r.mAllowWhileInUsePermissionInFgs = shouldAllowWhileInUsePermissionInFgsLocked(callingPackage, callingPid, callingUid, service, r, allowBackgroundActivityStarts); } setFgsRestrictionLocked(callingPackage, callingPid, callingUid, r, allowBackgroundActivityStarts); return cmp; } Loading Loading @@ -1411,14 +1408,6 @@ public final class ActiveServices { + String.format("0x%08X", manifestType) + " in service element of manifest file"); } // If the foreground service is not started from TOP process, do not allow it to // have while-in-use location/camera/microphone access. if (!r.mAllowWhileInUsePermissionInFgs) { Slog.w(TAG, "Foreground service started from background can not have " + "location/camera/microphone access: service " + r.shortInstanceName); } } boolean alreadyStartedOp = false; boolean stopProcStatsOp = false; Loading Loading @@ -1466,6 +1455,57 @@ public final class ActiveServices { ignoreForeground = true; } if (!ignoreForeground) { if (r.mStartForegroundCount == 0) { /* If the service was started with startService(), not startForegroundService(), and if startForeground() isn't called within mFgsStartForegroundTimeoutMs, then we check the state of the app (who owns the service, which is the app that called startForeground()) again. If the app is in the foreground, or in any other cases where FGS-starts are allowed, then we still allow the FGS to be started. Otherwise, startForeground() would fail. If the service was started with startForegroundService(), then the service must call startForeground() within a timeout anyway, so we don't need this check. */ if (!r.fgRequired) { final long delayMs = SystemClock.elapsedRealtime() - r.createRealTime; if (delayMs > mAm.mConstants.mFgsStartForegroundTimeoutMs) { resetFgsRestrictionLocked(r); setFgsRestrictionLocked(r.serviceInfo.packageName, r.app.pid, r.appInfo.uid, r, false); EventLog.writeEvent(0x534e4554, "183147114", r.appInfo.uid, "call setFgsRestrictionLocked again due to " + "startForegroundTimeout"); } } } else if (r.mStartForegroundCount >= 1) { // The second or later time startForeground() is called after service is // started. Check for app state again. final long delayMs = SystemClock.elapsedRealtime() - r.mLastSetFgsRestrictionTime; if (delayMs > mAm.mConstants.mFgsStartForegroundTimeoutMs) { resetFgsRestrictionLocked(r); setFgsRestrictionLocked(r.serviceInfo.packageName, r.app.pid, r.appInfo.uid, r, false); EventLog.writeEvent(0x534e4554, "183147114", r.appInfo.uid, "call setFgsRestrictionLocked for " + (r.mStartForegroundCount + 1) + "th startForeground"); } } // If the foreground service is not started from TOP process, do not allow it to // have while-in-use location/camera/microphone access. if (!r.mAllowWhileInUsePermissionInFgs) { Slog.w(TAG, "Foreground service started from background can not have " + "location/camera/microphone access: service " + r.shortInstanceName); } } // Apps under strict background restrictions simply don't get to have foreground // services, so now that we've enforced the startForegroundService() contract // we only do the machinery of making the service foreground when the app Loading Loading @@ -1501,6 +1541,7 @@ public final class ActiveServices { active.mNumActive++; } r.isForeground = true; r.mStartForegroundCount++; if (!stopProcStatsOp) { ServiceState stracker = r.getTracker(); if (stracker != null) { Loading Loading @@ -1559,6 +1600,7 @@ public final class ActiveServices { decActiveForegroundAppLocked(smap, r); } r.isForeground = false; resetFgsRestrictionLocked(r); ServiceState stracker = r.getTracker(); if (stracker != null) { stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), Loading Loading @@ -2118,12 +2160,7 @@ public final class ActiveServices { } } if (!s.mAllowWhileInUsePermissionInFgs) { s.mAllowWhileInUsePermissionInFgs = shouldAllowWhileInUsePermissionInFgsLocked(callingPackage, callingPid, callingUid, service, s, false); } setFgsRestrictionLocked(callingPackage, callingPid, callingUid, s, false); if (s.app != null) { if ((flags&Context.BIND_TREAT_LIKE_ACTIVITY) != 0) { Loading Loading @@ -3419,7 +3456,7 @@ public final class ActiveServices { r.isForeground = false; r.foregroundId = 0; r.foregroundNoti = null; r.mAllowWhileInUsePermissionInFgs = false; resetFgsRestrictionLocked(r); // Clear start entries. r.clearDeliveredStartsLocked(); Loading Loading @@ -4900,7 +4937,7 @@ public final class ActiveServices { * @return true if allow, false otherwise. */ private boolean shouldAllowWhileInUsePermissionInFgsLocked(String callingPackage, int callingPid, int callingUid, Intent intent, ServiceRecord r, int callingPid, int callingUid, ServiceRecord r, boolean allowBackgroundActivityStarts) { // Is the background FGS start restriction turned on? if (!mAm.mConstants.mFlagBackgroundFgsStartRestrictionEnabled) { Loading Loading @@ -4986,6 +5023,28 @@ public final class ActiveServices { boolean canAllowWhileInUsePermissionInFgsLocked(int callingPid, int callingUid, String callingPackage) { return shouldAllowWhileInUsePermissionInFgsLocked( callingPackage, callingPid, callingUid, null, null, false); callingPackage, callingPid, callingUid, null, false); } /** * In R, mAllowWhileInUsePermissionInFgs is to allow while-in-use permissions in foreground * service or not. while-in-use permissions in FGS started from background might be restricted. * @param callingPackage caller app's package name. * @param callingUid caller app's uid. * @param r the service to start. * @return true if allow, false otherwise. */ private void setFgsRestrictionLocked(String callingPackage, int callingPid, int callingUid, ServiceRecord r, boolean allowBackgroundActivityStarts) { r.mLastSetFgsRestrictionTime = SystemClock.elapsedRealtime(); if (!r.mAllowWhileInUsePermissionInFgs) { r.mAllowWhileInUsePermissionInFgs = shouldAllowWhileInUsePermissionInFgsLocked( callingPackage, callingPid, callingUid, r, allowBackgroundActivityStarts); } } private void resetFgsRestrictionLocked(ServiceRecord r) { r.mAllowWhileInUsePermissionInFgs = false; } }
services/core/java/com/android/server/am/ActivityManagerConstants.java +20 −0 Original line number Diff line number Diff line Loading @@ -88,6 +88,7 @@ final class ActivityManagerConstants extends ContentObserver { static final String KEY_PROCESS_START_ASYNC = "process_start_async"; static final String KEY_MEMORY_INFO_THROTTLE_TIME = "memory_info_throttle_time"; static final String KEY_TOP_TO_FGS_GRACE_DURATION = "top_to_fgs_grace_duration"; static final String KEY_FGS_START_FOREGROUND_TIMEOUT = "fgs_start_foreground_timeout"; static final String KEY_PENDINGINTENT_WARNING_THRESHOLD = "pendingintent_warning_threshold"; private static final int DEFAULT_MAX_CACHED_PROCESSES = 32; Loading Loading @@ -121,6 +122,7 @@ final class ActivityManagerConstants extends ContentObserver { private static final boolean DEFAULT_PROCESS_START_ASYNC = true; private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000; private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000; private static final int DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS = 10 * 1000; private static final int DEFAULT_PENDINGINTENT_WARNING_THRESHOLD = 2000; // Flag stored in the DeviceConfig API. Loading Loading @@ -273,6 +275,12 @@ final class ActivityManagerConstants extends ContentObserver { // this long. public long TOP_TO_FGS_GRACE_DURATION = DEFAULT_TOP_TO_FGS_GRACE_DURATION; /** * When service started from background, before the timeout it can be promoted to FGS by calling * Service.startForeground(). */ volatile long mFgsStartForegroundTimeoutMs = DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS; // Indicates whether the activity starts logging is enabled. // Controlled by Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED volatile boolean mFlagActivityStartsLoggingEnabled; Loading Loading @@ -421,6 +429,9 @@ final class ActivityManagerConstants extends ContentObserver { case KEY_MIN_ASSOC_LOG_DURATION: updateMinAssocLogDuration(); break; case KEY_FGS_START_FOREGROUND_TIMEOUT: updateFgsStartForegroundTimeout(); break; default: break; } Loading Loading @@ -697,6 +708,13 @@ final class ActivityManagerConstants extends ContentObserver { /* defaultValue */ DEFAULT_MIN_ASSOC_LOG_DURATION); } private void updateFgsStartForegroundTimeout() { mFgsStartForegroundTimeoutMs = DeviceConfig.getLong( DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_FGS_START_FOREGROUND_TIMEOUT, DEFAULT_FGS_START_FOREGROUND_TIMEOUT_MS); } void dump(PrintWriter pw) { pw.println("ACTIVITY MANAGER SETTINGS (dumpsys activity settings) " + Settings.Global.ACTIVITY_MANAGER_CONSTANTS + ":"); Loading Loading @@ -769,6 +787,8 @@ final class ActivityManagerConstants extends ContentObserver { pw.println(Arrays.toString(IMPERCEPTIBLE_KILL_EXEMPT_PACKAGES.toArray())); pw.print(" "); pw.print(KEY_MIN_ASSOC_LOG_DURATION); pw.print("="); pw.println(MIN_ASSOC_LOG_DURATION); pw.print(" "); pw.print(KEY_FGS_START_FOREGROUND_TIMEOUT); pw.print("="); pw.println(mFgsStartForegroundTimeoutMs); pw.println(); if (mOverrideMaxCachedProcesses >= 0) { Loading