diff options
| -rw-r--r-- | services/core/java/com/android/server/am/ActiveServices.java | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 0f095ab8b85f..31712becec05 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -56,6 +56,8 @@ import android.app.Service; import android.app.ServiceStartArgs; import android.app.admin.DevicePolicyEventLogger; import android.appwidget.AppWidgetManagerInternal; +import android.compat.annotation.ChangeId; +import android.compat.annotation.Disabled; import android.content.ComponentName; import android.content.ComponentName.WithComponentName; import android.content.Context; @@ -79,6 +81,7 @@ import android.os.Message; import android.os.Process; import android.os.RemoteCallback; import android.os.RemoteException; +import android.os.ServiceManager; import android.os.SystemClock; import android.os.SystemProperties; import android.os.TransactionTooLargeException; @@ -100,6 +103,7 @@ import android.webkit.WebViewZygote; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; import com.android.internal.app.procstats.ServiceState; +import com.android.internal.compat.IPlatformCompat; import com.android.internal.messages.nano.SystemMessageProto; import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.os.BatteryStatsImpl; @@ -234,6 +238,16 @@ public final class ActiveServices { private static final SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + private final IPlatformCompat mPlatformCompat; + + /** + * The BG-launch FGS restriction feature is going to be allowed only for apps targetSdkVersion + * is higher than R. + */ + @ChangeId + @Disabled + static final long FGS_BG_START_RESTRICTION_CHANGE_ID = 170668199L; + final Runnable mLastAnrDumpClearer = new Runnable() { @Override public void run() { synchronized (mAm) { @@ -430,6 +444,9 @@ public final class ActiveServices { } mMaxStartingBackground = maxBg > 0 ? maxBg : ActivityManager.isLowRamDeviceStatic() ? 1 : 8; + + final IBinder b = ServiceManager.getService(Context.PLATFORM_COMPAT_SERVICE); + mPlatformCompat = IPlatformCompat.Stub.asInterface(b); } void systemServicesReady() { @@ -557,7 +574,8 @@ public final class ActiveServices { r.mLoggedInfoAllowStartForeground = true; } if (r.mAllowStartForeground == FGS_FEATURE_DENIED - && mAm.mConstants.mFlagFgsStartRestrictionEnabled) { + && (mAm.mConstants.mFlagFgsStartRestrictionEnabled + || isChangeEnabled(FGS_BG_START_RESTRICTION_CHANGE_ID, r))) { if (mAm.mConstants.mFlagFgsStartTempAllowListEnabled && mAm.isOnDeviceIdleWhitelistLocked(r.appInfo.uid, false)) { // uid is on DeviceIdleController's allowlist. @@ -1468,7 +1486,8 @@ public final class ActiveServices { r.mLoggedInfoAllowStartForeground = true; } if (r.mAllowStartForeground == FGS_FEATURE_DENIED - && mAm.mConstants.mFlagFgsStartRestrictionEnabled) { + && (mAm.mConstants.mFlagFgsStartRestrictionEnabled + || isChangeEnabled(FGS_BG_START_RESTRICTION_CHANGE_ID, r))) { if (mAm.mConstants.mFlagFgsStartTempAllowListEnabled && mAm.isOnDeviceIdleWhitelistLocked(r.appInfo.uid, false)) { // uid is on DeviceIdleController's allowlist. @@ -5101,4 +5120,12 @@ public final class ActiveServices { context.getSystemService(NotificationManager.class).notifyAsUser(Long.toString(now), NOTE_FOREGROUND_SERVICE_BG_LAUNCH, n.build(), UserHandle.ALL); } + + private boolean isChangeEnabled(long changeId, ServiceRecord r) { + boolean enabled = false; + try { + enabled = mPlatformCompat.isChangeEnabled(changeId, r.appInfo); + } catch (RemoteException e) { } + return enabled; + } } |