Merge "Log WTF message when FGS is started by bindService() from a persistent process."

This commit is contained in:
TreeHugger Robot
2022-11-14 22:50:19 +00:00
committed by Android (Google) Code Review

View File

@@ -724,7 +724,7 @@ public final class ActiveServices {
ServiceRecord r = res.record;
setFgsRestrictionLocked(callingPackage, callingPid, callingUid, service, r, userId,
allowBackgroundActivityStarts);
allowBackgroundActivityStarts, false /* isBindService */);
if (!mAm.mUserController.exists(r.userId)) {
Slog.w(TAG, "Trying to start service with non-existent user! " + r.userId);
@@ -1931,7 +1931,9 @@ public final class ActiveServices {
if (delayMs > mAm.mConstants.mFgsStartForegroundTimeoutMs) {
resetFgsRestrictionLocked(r);
setFgsRestrictionLocked(r.serviceInfo.packageName, r.app.getPid(),
r.appInfo.uid, r.intent.getIntent(), r, r.userId, false);
r.appInfo.uid, r.intent.getIntent(), r, r.userId,
false /* allowBackgroundActivityStarts */,
false /* isBindService */);
final String temp = "startForegroundDelayMs:" + delayMs;
if (r.mInfoAllowStartForeground != null) {
r.mInfoAllowStartForeground += "; " + temp;
@@ -1945,7 +1947,9 @@ public final class ActiveServices {
// The second or later time startForeground() is called after service is
// started. Check for app state again.
setFgsRestrictionLocked(r.serviceInfo.packageName, r.app.getPid(),
r.appInfo.uid, r.intent.getIntent(), r, r.userId, false);
r.appInfo.uid, r.intent.getIntent(), r, r.userId,
false /* allowBackgroundActivityStarts */,
false /* isBindService */);
}
// If the foreground service is not started from TOP process, do not allow it to
// have while-in-use location/camera/microphone access.
@@ -2985,7 +2989,7 @@ public final class ActiveServices {
}
}
setFgsRestrictionLocked(callingPackage, callingPid, callingUid, service, s, userId,
false);
false /* allowBackgroundActivityStarts */, true /* isBindService */);
if (s.app != null) {
ProcessServiceRecord servicePsr = s.app.mServices;
@@ -6500,7 +6504,7 @@ public final class ActiveServices {
*/
private void setFgsRestrictionLocked(String callingPackage,
int callingPid, int callingUid, Intent intent, ServiceRecord r, int userId,
boolean allowBackgroundActivityStarts) {
boolean allowBackgroundActivityStarts, boolean isBindService) {
r.mLastSetFgsRestrictionTime = SystemClock.elapsedRealtime();
// Check DeviceConfig flag.
if (!mAm.mConstants.mFlagBackgroundFgsStartRestrictionEnabled) {
@@ -6510,14 +6514,15 @@ public final class ActiveServices {
if (!r.mAllowWhileInUsePermissionInFgs
|| (r.mAllowStartForeground == REASON_DENIED)) {
final @ReasonCode int allowWhileInUse = shouldAllowFgsWhileInUsePermissionLocked(
callingPackage, callingPid, callingUid, r, allowBackgroundActivityStarts);
callingPackage, callingPid, callingUid, r, allowBackgroundActivityStarts,
isBindService);
if (!r.mAllowWhileInUsePermissionInFgs) {
r.mAllowWhileInUsePermissionInFgs = (allowWhileInUse != REASON_DENIED);
}
if (r.mAllowStartForeground == REASON_DENIED) {
r.mAllowStartForeground = shouldAllowFgsStartForegroundWithBindingCheckLocked(
allowWhileInUse, callingPackage, callingPid, callingUid, intent, r,
userId);
userId, isBindService);
}
}
}
@@ -6537,9 +6542,10 @@ public final class ActiveServices {
}
final @ReasonCode int allowWhileInUse = shouldAllowFgsWhileInUsePermissionLocked(
callingPackage, callingPid, callingUid, null /* serviceRecord */,
false /* allowBackgroundActivityStarts */);
false /* allowBackgroundActivityStarts */, false);
@ReasonCode int allowStartFgs = shouldAllowFgsStartForegroundNoBindingCheckLocked(
allowWhileInUse, callingPid, callingUid, callingPackage, null /* targetService */);
allowWhileInUse, callingPid, callingUid, callingPackage, null /* targetService */,
false /* isBindService */);
if (allowStartFgs == REASON_DENIED) {
if (canBindingClientStartFgsLocked(callingUid) != null) {
@@ -6559,7 +6565,7 @@ public final class ActiveServices {
*/
private @ReasonCode int shouldAllowFgsWhileInUsePermissionLocked(String callingPackage,
int callingPid, int callingUid, @Nullable ServiceRecord targetService,
boolean allowBackgroundActivityStarts) {
boolean allowBackgroundActivityStarts, boolean isBindService) {
int ret = REASON_DENIED;
final int uidState = mAm.getUidStateLocked(callingUid);
@@ -6713,12 +6719,12 @@ public final class ActiveServices {
shouldAllowFgsWhileInUsePermissionLocked(
clientPackageName,
clientPid, clientUid, null /* serviceRecord */,
false /* allowBackgroundActivityStarts */);
false /* allowBackgroundActivityStarts */, false);
final @ReasonCode int allowStartFgs =
shouldAllowFgsStartForegroundNoBindingCheckLocked(
allowWhileInUse2,
clientPid, clientUid, clientPackageName,
null /* targetService */);
null /* targetService */, false);
if (allowStartFgs != REASON_DENIED) {
return new Pair<>(allowStartFgs, clientPackageName);
} else {
@@ -6750,11 +6756,11 @@ public final class ActiveServices {
*/
private @ReasonCode int shouldAllowFgsStartForegroundWithBindingCheckLocked(
@ReasonCode int allowWhileInUse, String callingPackage, int callingPid,
int callingUid, Intent intent, ServiceRecord r, int userId) {
int callingUid, Intent intent, ServiceRecord r, int userId, boolean isBindService) {
ActivityManagerService.FgsTempAllowListItem tempAllowListReason =
r.mInfoTempFgsAllowListReason = mAm.isAllowlistedForFgsStartLOSP(callingUid);
int ret = shouldAllowFgsStartForegroundNoBindingCheckLocked(allowWhileInUse, callingPid,
callingUid, callingPackage, r);
callingUid, callingPackage, r, isBindService);
String bindFromPackage = null;
if (ret == REASON_DENIED) {
@@ -6789,6 +6795,7 @@ public final class ActiveServices {
+ "; callerTargetSdkVersion:" + callerTargetSdkVersion
+ "; startForegroundCount:" + r.mStartForegroundCount
+ "; bindFromPackage:" + bindFromPackage
+ ": isBindService:" + isBindService
+ "]";
if (!debugInfo.equals(r.mInfoAllowStartForeground)) {
r.mLoggedInfoAllowStartForeground = false;
@@ -6799,7 +6806,7 @@ public final class ActiveServices {
private @ReasonCode int shouldAllowFgsStartForegroundNoBindingCheckLocked(
@ReasonCode int allowWhileInUse, int callingPid, int callingUid, String callingPackage,
@Nullable ServiceRecord targetService) {
@Nullable ServiceRecord targetService, boolean isBindService) {
int ret = allowWhileInUse;
if (ret == REASON_DENIED) {
@@ -6981,10 +6988,12 @@ public final class ActiveServices {
}
private void logFgsBackgroundStart(ServiceRecord r) {
/*
// Only log if FGS is started from background.
if (!isFgsBgStart(r.mAllowStartForeground)) {
return;
}
*/
if (!r.mLoggedInfoAllowStartForeground) {
final String msg = "Background started FGS: "
+ ((r.mAllowStartForeground != REASON_DENIED) ? "Allowed " : "Disallowed ")
@@ -6996,10 +7005,10 @@ public final class ActiveServices {
}
Slog.i(TAG, msg);
} else {
if (ActivityManagerUtils.shouldSamplePackageForAtom(r.packageName,
mAm.mConstants.mFgsStartDeniedLogSampleRate)) {
//if (ActivityManagerUtils.shouldSamplePackageForAtom(r.packageName,
// mAm.mConstants.mFgsStartDeniedLogSampleRate)) {
Slog.wtfQuiet(TAG, msg);
}
//}
Slog.w(TAG, msg);
}
r.mLoggedInfoAllowStartForeground = true;
@@ -7082,7 +7091,7 @@ public final class ActiveServices {
String callingPackage) {
return shouldAllowFgsWhileInUsePermissionLocked(callingPackage, callingPid, callingUid,
/* targetService */ null,
/* allowBackgroundActivityStarts */ false)
/* allowBackgroundActivityStarts */ false, false)
!= REASON_DENIED;
}