diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-08-10 01:07:11 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-08-10 01:07:11 +0000 |
commit | 0064adf9f128374d9c8ec6cfe22845c46bedd072 (patch) | |
tree | 0fc13272143c01b53e56a65fbb2769c4fdc4d53b | |
parent | 65b6baa27991d3d2c2d7b8c729ad11733673ace0 (diff) | |
parent | 23ee1b87bb87301a8f2f8044603b29141ae76a69 (diff) |
Snap for 7625910 from 23ee1b87bb87301a8f2f8044603b29141ae76a69 to sc-release
Change-Id: Ie4f54c1939e4c67742037aab0131a6bac86aea21
15 files changed, 207 insertions, 185 deletions
diff --git a/core/java/android/content/pm/PackageItemInfo.java b/core/java/android/content/pm/PackageItemInfo.java index dd2080b60b37..2bac066ed186 100644 --- a/core/java/android/content/pm/PackageItemInfo.java +++ b/core/java/android/content/pm/PackageItemInfo.java @@ -207,7 +207,9 @@ public class PackageItemInfo { return loadSafeLabel(pm, DEFAULT_MAX_LABEL_SIZE_PX, SAFE_STRING_FLAG_TRIM | SAFE_STRING_FLAG_FIRST_LINE); } else { - return loadUnsafeLabel(pm); + // Trims the label string to the MAX_SAFE_LABEL_LENGTH. This is to prevent that the + // system is overwhelmed by an enormous string returned by the application. + return TextUtils.trimToSize(loadUnsafeLabel(pm), MAX_SAFE_LABEL_LENGTH); } } diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index 025be7b2b6c1..2f3a509831d1 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -482,6 +482,12 @@ nsecs_t CanvasContext::draw() { if (dirty.isEmpty() && Properties::skipEmptyFrames && !surfaceRequiresRedraw()) { mCurrentFrameInfo->addFlag(FrameInfoFlags::SkippedFrame); + if (auto grContext = getGrContext()) { + // Submit to ensure that any texture uploads complete and Skia can + // free its staging buffers. + grContext->flushAndSubmit(); + } + // Notify the callbacks, even if there's nothing to draw so they aren't waiting // indefinitely waitOnFences(); diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index 1e3ee22fee2f..db301f698753 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -3585,7 +3585,7 @@ public class SettingsProvider extends ContentProvider { } private final class UpgradeController { - private static final int SETTINGS_VERSION = 203; + private static final int SETTINGS_VERSION = 204; private final int mUserId; @@ -5189,6 +5189,44 @@ public class SettingsProvider extends ContentProvider { currentVersion = 203; } + if (currentVersion == 203) { + // Version 204: Replace 'wifi' or 'cell' tiles with 'internet' if existed. + final SettingsState secureSettings = getSecureSettingsLocked(userId); + final Setting currentValue = secureSettings.getSettingLocked(Secure.QS_TILES); + if (!currentValue.isNull()) { + String tileList = currentValue.getValue(); + String[] tileSplit = tileList.split(","); + final ArrayList<String> tiles = new ArrayList<String>(); + boolean hasInternetTile = false; + for (int i = 0; i < tileSplit.length; i++) { + String tile = tileSplit[i].trim(); + if (tile.isEmpty()) continue; + tiles.add(tile); + if (tile.equals("internet")) hasInternetTile = true; + } + if (!hasInternetTile) { + if (tiles.contains("wifi")) { + // Replace the WiFi with Internet, and remove the Cell + tiles.set(tiles.indexOf("wifi"), "internet"); + tiles.remove("cell"); + } else if (tiles.contains("cell")) { + // Replace the Cell with Internet + tiles.set(tiles.indexOf("cell"), "internet"); + } + } else { + tiles.remove("wifi"); + tiles.remove("cell"); + } + secureSettings.insertSettingOverrideableByRestoreLocked( + Secure.QS_TILES, + TextUtils.join(",", tiles), + null /* tag */, + true /* makeDefault */, + SettingsState.SYSTEM_PACKAGE_NAME); + } + currentVersion = 204; + } + // vXXX: Add new settings above this point. if (currentVersion != newVersion) { diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 11850b4332e6..d274c917c26d 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -107,7 +107,7 @@ <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" --> <string name="quick_settings_tiles_stock" translatable="false"> - internet,wifi,cell,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle,location,hotspot,inversion,saver,dark,work,night,reverse,reduce_brightness + internet,bt,flashlight,dnd,alarm,airplane,controls,wallet,rotation,battery,cast,screenrecord,mictoggle,cameratoggle,location,hotspot,inversion,saver,dark,work,night,reverse,reduce_brightness </string> <!-- The tiles to display in QuickSettings --> diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index 756ad9939886..541ee2c4fe8f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -51,7 +51,6 @@ import com.android.systemui.qs.external.TileServices; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; @@ -512,33 +511,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D } } } - // TODO(b/174753536): Move it into the config file. - // Only do the below hacking when at least one of the below tiles exist - // --InternetTile - // --WiFiTile - // --CellularTIle - if (tiles.contains("internet") || tiles.contains("wifi") || tiles.contains("cell")) { - if (FeatureFlags.isProviderModelSettingEnabled(context)) { - if (!tiles.contains("internet")) { - if (tiles.contains("wifi")) { - // Replace the WiFi with Internet, and remove the Cell - tiles.set(tiles.indexOf("wifi"), "internet"); - tiles.remove("cell"); - } else if (tiles.contains("cell")) { - // Replace the Cell with Internet - tiles.set(tiles.indexOf("cell"), "internet"); - } - } else { - tiles.remove("wifi"); - tiles.remove("cell"); - } - } else { - if (tiles.contains("internet")) { - tiles.set(tiles.indexOf("internet"), "wifi"); - tiles.add("cell"); - } - } - } return tiles; } @@ -558,14 +530,6 @@ public class QSTileHost implements QSHost, Tunable, PluginListener<QSFactory>, D && GarbageMonitor.ADD_MEMORY_TILE_TO_DEFAULT_ON_DEBUGGABLE_BUILDS) { tiles.add(GarbageMonitor.MemoryTile.TILE_SPEC); } - // TODO(b/174753536): Change the config file directly. - // Filter out unused tiles from the default QS config. - if (FeatureFlags.isProviderModelSettingEnabled(context)) { - tiles.remove("cell"); - tiles.remove("wifi"); - } else { - tiles.remove("internet"); - } return tiles; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java index 3cb715cee8e9..3c2f35b954ea 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java +++ b/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java @@ -41,7 +41,6 @@ import com.android.systemui.qs.dagger.QSScope; import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.tileimpl.QSTileImpl.DrawableIcon; import com.android.systemui.settings.UserTracker; -import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.util.leak.GarbageMonitor; import java.util.ArrayList; @@ -63,7 +62,6 @@ public class TileQueryHelper { private final Executor mBgExecutor; private final Context mContext; private final UserTracker mUserTracker; - private final FeatureFlags mFeatureFlags; private TileStateListener mListener; private boolean mFinished; @@ -73,14 +71,12 @@ public class TileQueryHelper { Context context, UserTracker userTracker, @Main Executor mainExecutor, - @Background Executor bgExecutor, - FeatureFlags featureFlags + @Background Executor bgExecutor ) { mContext = context; mMainExecutor = mainExecutor; mBgExecutor = bgExecutor; mUserTracker = userTracker; - mFeatureFlags = featureFlags; } public void setListener(TileStateListener listener) { @@ -121,19 +117,11 @@ public class TileQueryHelper { } final ArrayList<QSTile> tilesToAdd = new ArrayList<>(); - // TODO(b/174753536): Move it into the config file. - if (mFeatureFlags.isProviderModelSettingEnabled()) { - possibleTiles.remove("cell"); - possibleTiles.remove("wifi"); - } else { - possibleTiles.remove("internet"); - } for (String spec : possibleTiles) { // Only add current and stock tiles that can be created from QSFactoryImpl. // Do not include CustomTile. Those will be created by `addPackageTiles`. if (spec.startsWith(CustomTile.PREFIX)) continue; - // TODO(b/174753536): Move it into the config file. final QSTile tile = host.createTile(spec); if (tile == null) { continue; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt index a5b868b6f8a3..6b52dca42eda 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt @@ -149,14 +149,18 @@ class UnlockedScreenOffAnimationController @Inject constructor( lightRevealAnimationPlaying = false aodUiAnimationPlaying = false - // Make sure the status bar is in the correct keyguard state, forcing it if necessary. This - // is required if the screen off animation is cancelled, since it might be incorrectly left - // in the KEYGUARD or SHADE states depending on when it was cancelled and whether 'lock - // instantly' is enabled. We need to force it so that the state is set even if we're going - // from SHADE to SHADE or KEYGUARD to KEYGUARD, since we might have changed parts of the UI - // (such as showing AOD in the shade) without actually changing the StatusBarState. This - // ensures that the UI definitely reflects the desired state. - statusBar.updateIsKeyguard(true /* force */) + // If we can't control the screen off animation, we shouldn't mess with the StatusBar's + // keyguard state unnecessarily. + if (dozeParameters.get().canControlUnlockedScreenOff()) { + // Make sure the status bar is in the correct keyguard state, forcing it if necessary. + // This is required if the screen off animation is cancelled, since it might be + // incorrectly left in the KEYGUARD or SHADE states depending on when it was cancelled + // and whether 'lock instantly' is enabled. We need to force it so that the state is set + // even if we're going from SHADE to SHADE or KEYGUARD to KEYGUARD, since we might have + // changed parts of the UI (such as showing AOD in the shade) without actually changing + // the StatusBarState. This ensures that the UI definitely reflects the desired state. + statusBar.updateIsKeyguard(true /* force */) + } } override fun onStartedGoingToSleep() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java index f208b807f747..9e97f801be3e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSTileHostTest.java @@ -44,7 +44,6 @@ import android.view.View; import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; -import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.UiEventLogger; import com.android.internal.util.CollectionUtils; @@ -64,22 +63,18 @@ import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import com.android.systemui.settings.UserTracker; import com.android.systemui.shared.plugins.PluginManager; -import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.statusbar.phone.AutoTileManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.tuner.TunerService; import com.android.systemui.util.settings.SecureSettings; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.mockito.MockitoSession; -import org.mockito.quality.Strictness; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -133,16 +128,9 @@ public class QSTileHostTest extends SysuiTestCase { private Handler mHandler; private TestableLooper mLooper; private QSTileHost mQSTileHost; - MockitoSession mMockingSession = null; @Before public void setUp() { - // TODO(b/174753536): Remove the mMockingSession when - // FeatureFlagUtils.SETTINGS_PROVIDER_MODEL is removed. - mMockingSession = ExtendedMockito.mockitoSession().strictness(Strictness.LENIENT) - .mockStatic(FeatureFlags.class).startMocking(); - ExtendedMockito.doReturn(false) - .when(() -> FeatureFlags.isProviderModelSettingEnabled(mContext)); MockitoAnnotations.initMocks(this); mLooper = TestableLooper.get(this); mHandler = new Handler(mLooper.getLooper()); @@ -156,13 +144,6 @@ public class QSTileHostTest extends SysuiTestCase { .thenReturn(""); } - @After - public void tearDown() throws Exception { - if (mMockingSession != null) { - mMockingSession.finishMocking(); - } - } - private void setUpTileFactory() { when(mMockState.toString()).thenReturn(MOCK_STATE_STRING); // Only create this kind of tiles diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java index 4a1411a329be..4efcc5c3fc73 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/customize/TileQueryHelperTest.java @@ -45,13 +45,11 @@ import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.text.TextUtils; import android.util.ArraySet; -import android.util.FeatureFlagUtils; import android.view.View; import androidx.annotation.Nullable; import androidx.test.filters.SmallTest; -import com.android.dx.mockito.inline.extended.ExtendedMockito; import com.android.internal.logging.InstanceId; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; @@ -60,11 +58,9 @@ import com.android.systemui.plugins.qs.QSIconView; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.qs.QSTileHost; import com.android.systemui.settings.UserTracker; -import com.android.systemui.statusbar.FeatureFlags; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.time.FakeSystemClock; -import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -74,8 +70,6 @@ import org.mockito.Captor; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import org.mockito.MockitoSession; -import org.mockito.quality.Strictness; import java.util.ArrayList; import java.util.Arrays; @@ -114,7 +108,6 @@ public class TileQueryHelperTest extends SysuiTestCase { private PackageManager mPackageManager; @Mock private UserTracker mUserTracker; - @Mock private FeatureFlags mFeatureFlags; @Captor private ArgumentCaptor<List<TileQueryHelper.TileInfo>> mCaptor; @@ -122,18 +115,10 @@ public class TileQueryHelperTest extends SysuiTestCase { private TileQueryHelper mTileQueryHelper; private FakeExecutor mMainExecutor; private FakeExecutor mBgExecutor; - MockitoSession mMockingSession = null; @Before public void setup() { MockitoAnnotations.initMocks(this); - // TODO(b/174753536): Remove the mMockingSession when - // FeatureFlagUtils.SETTINGS_PROVIDER_MODEL is removed. - mMockingSession = ExtendedMockito.mockitoSession().strictness(Strictness.LENIENT) - .mockStatic(FeatureFlagUtils.class).startMocking(); - ExtendedMockito.doReturn(false).when(() -> FeatureFlagUtils.isEnabled(mContext, - FeatureFlagUtils.SETTINGS_PROVIDER_MODEL)); - mContext.setMockPackageManager(mPackageManager); mState = new QSTile.State(); @@ -153,17 +138,10 @@ public class TileQueryHelperTest extends SysuiTestCase { mMainExecutor = new FakeExecutor(clock); mBgExecutor = new FakeExecutor(clock); mTileQueryHelper = new TileQueryHelper( - mContext, mUserTracker, mMainExecutor, mBgExecutor, mFeatureFlags); + mContext, mUserTracker, mMainExecutor, mBgExecutor); mTileQueryHelper.setListener(mListener); } - @After - public void tearDown() throws Exception { - if (mMockingSession != null) { - mMockingSession.finishMocking(); - } - } - @Test public void testIsFinished_falseBeforeQuerying() { assertFalse(mTileQueryHelper.isFinished()); diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 45e6f1ec4bf8..f41036cde433 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -807,10 +807,12 @@ public final class ActiveServices { if (fgRequired) { // We are now effectively running a foreground service. - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(true, mAm.mProcessStats.getMemFactorLocked(), - r.lastActivity); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(true, mAm.mProcessStats.getMemFactorLocked(), + r.lastActivity); + } } mAm.mAppOpsService.startOperation(AppOpsManager.getToken(mAm.mAppOpsService), AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName, null, @@ -1082,9 +1084,11 @@ public final class ActiveServices { ComponentName startServiceInnerLocked(ServiceMap smap, Intent service, ServiceRecord r, boolean callerFg, boolean addToStarting) throws TransactionTooLargeException { - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setStarted(true, mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setStarted(true, mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); + } } r.callStart = false; @@ -1144,8 +1148,10 @@ public final class ActiveServices { mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); service.startRequested = false; if (service.tracker != null) { - service.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + service.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } service.callStart = false; @@ -1320,8 +1326,10 @@ public final class ActiveServices { mAm.mBatteryStatsService.noteServiceStopRunning(uid, packageName, serviceName); r.startRequested = false; if (r.tracker != null) { - r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + r.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } r.callStart = false; final long origId = Binder.clearCallingIdentity(); @@ -1877,10 +1885,12 @@ public final class ActiveServices { r.mStartForegroundCount++; r.mFgsEnterTime = SystemClock.uptimeMillis(); if (!stopProcStatsOp) { - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(true, - mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(true, + mAm.mProcessStats.getMemFactorLocked(), r.lastActivity); + } } } else { stopProcStatsOp = false; @@ -1915,10 +1925,12 @@ public final class ActiveServices { if (stopProcStatsOp) { // We got through to this point with it actively being started foreground, // and never decided we wanted to keep it like that, so drop it. - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } } if (alreadyStartedOp) { @@ -1960,10 +1972,12 @@ public final class ActiveServices { r.isForeground = false; r.mFgsExitTime = SystemClock.uptimeMillis(); - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } mAm.mAppOpsService.finishOperation( AppOpsManager.getToken(mAm.mAppOpsService), @@ -2738,10 +2752,12 @@ public final class ActiveServices { s.lastActivity = SystemClock.uptimeMillis(); if (!s.hasAutoCreateConnections()) { // This is the first binding, let the tracker know. - ServiceState stracker = s.getTracker(); - if (stracker != null) { - stracker.setBound(true, mAm.mProcessStats.getMemFactorLocked(), - s.lastActivity); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = s.getTracker(); + if (stracker != null) { + stracker.setBound(true, mAm.mProcessStats.getMemFactorLocked(), + s.lastActivity); + } } } } @@ -3378,9 +3394,11 @@ public final class ActiveServices { ProcessServiceRecord psr; if (r.executeNesting == 0) { r.executeFg = fg; - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setExecuting(true, mAm.mProcessStats.getMemFactorLocked(), now); + synchronized (mAm.mProcessStats.mLock) { + final ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setExecuting(true, mAm.mProcessStats.getMemFactorLocked(), now); + } } if (r.app != null) { psr = r.app.mServices; @@ -3575,7 +3593,9 @@ public final class ActiveServices { if (!mRestartingServices.contains(r)) { r.createdFromFg = false; mRestartingServices.add(r); - r.makeRestarting(mAm.mProcessStats.getMemFactorLocked(), now); + synchronized (mAm.mProcessStats.mLock) { + r.makeRestarting(mAm.mProcessStats.getMemFactorLocked(), now); + } } cancelForegroundNotificationLocked(r); @@ -3653,8 +3673,10 @@ public final class ActiveServices { } } if (!stillTracking) { - r.restartTracker.setRestarting(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + r.restartTracker.setRestarting(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } r.restartTracker = null; } } @@ -4174,9 +4196,11 @@ public final class ActiveServices { + r); r.fgRequired = false; r.fgWaiting = false; - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), now); + synchronized (mAm.mProcessStats.mLock) { + ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), now); + } } mAm.mAppOpsService.finishOperation(AppOpsManager.getToken(mAm.mAppOpsService), AppOpsManager.OP_START_FOREGROUND, r.appInfo.uid, r.packageName, null); @@ -4233,9 +4257,11 @@ public final class ActiveServices { cancelForegroundNotificationLocked(r); if (r.isForeground) { decActiveForegroundAppLocked(smap, r); - ServiceState stracker = r.getTracker(); - if (stracker != null) { - stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), now); + synchronized (mAm.mProcessStats.mLock) { + ServiceState stracker = r.getTracker(); + if (stracker != null) { + stracker.setForeground(false, mAm.mProcessStats.getMemFactorLocked(), now); + } } mAm.mAppOpsService.finishOperation( AppOpsManager.getToken(mAm.mAppOpsService), @@ -4303,13 +4329,15 @@ public final class ActiveServices { ((ServiceRestarter)r.restarter).setService(null); } - int memFactor = mAm.mProcessStats.getMemFactorLocked(); - if (r.tracker != null) { - r.tracker.setStarted(false, memFactor, now); - r.tracker.setBound(false, memFactor, now); - if (r.executeNesting == 0) { - r.tracker.clearCurrentOwner(r, false); - r.tracker = null; + synchronized (mAm.mProcessStats.mLock) { + final int memFactor = mAm.mProcessStats.getMemFactorLocked(); + if (r.tracker != null) { + r.tracker.setStarted(false, memFactor, now); + r.tracker.setBound(false, memFactor, now); + if (r.executeNesting == 0) { + r.tracker.clearCurrentOwner(r, false); + r.tracker = null; + } } } @@ -4440,8 +4468,10 @@ public final class ActiveServices { boolean hasAutoCreate = s.hasAutoCreateConnections(); if (!hasAutoCreate) { if (s.tracker != null) { - s.tracker.setBound(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + s.tracker.setBound(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } } bringDownServiceIfNeededLocked(s, true, hasAutoCreate, enqueueOomAdj); @@ -4533,12 +4563,14 @@ public final class ActiveServices { private void serviceProcessGoneLocked(ServiceRecord r, boolean enqueueOomAdj) { if (r.tracker != null) { - int memFactor = mAm.mProcessStats.getMemFactorLocked(); - long now = SystemClock.uptimeMillis(); - r.tracker.setExecuting(false, memFactor, now); - r.tracker.setForeground(false, memFactor, now); - r.tracker.setBound(false, memFactor, now); - r.tracker.setStarted(false, memFactor, now); + synchronized (mAm.mProcessStats.mLock) { + final int memFactor = mAm.mProcessStats.getMemFactorLocked(); + final long now = SystemClock.uptimeMillis(); + r.tracker.setExecuting(false, memFactor, now); + r.tracker.setForeground(false, memFactor, now); + r.tracker.setBound(false, memFactor, now); + r.tracker.setStarted(false, memFactor, now); + } } serviceDoneExecutingLocked(r, true, true, enqueueOomAdj); } @@ -4585,13 +4617,15 @@ public final class ActiveServices { } r.executeFg = false; if (r.tracker != null) { - final int memFactor = mAm.mProcessStats.getMemFactorLocked(); - final long now = SystemClock.uptimeMillis(); - r.tracker.setExecuting(false, memFactor, now); - r.tracker.setForeground(false, memFactor, now); - if (finishing) { - r.tracker.clearCurrentOwner(r, false); - r.tracker = null; + synchronized (mAm.mProcessStats.mLock) { + final int memFactor = mAm.mProcessStats.getMemFactorLocked(); + final long now = SystemClock.uptimeMillis(); + r.tracker.setExecuting(false, memFactor, now); + r.tracker.setForeground(false, memFactor, now); + if (finishing) { + r.tracker.clearCurrentOwner(r, false); + r.tracker = null; + } } } if (finishing) { @@ -4976,8 +5010,10 @@ public final class ActiveServices { // down it. sr.startRequested = false; if (sr.tracker != null) { - sr.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), - SystemClock.uptimeMillis()); + synchronized (mAm.mProcessStats.mLock) { + sr.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(), + SystemClock.uptimeMillis()); + } } } } diff --git a/services/core/java/com/android/server/am/ConnectionRecord.java b/services/core/java/com/android/server/am/ConnectionRecord.java index e6cd509f50dc..916127126117 100644 --- a/services/core/java/com/android/server/am/ConnectionRecord.java +++ b/services/core/java/com/android/server/am/ConnectionRecord.java @@ -47,6 +47,7 @@ final class ConnectionRecord { public AssociationState.SourceState association; // Association tracking String stringName; // Caching of toString. boolean serviceDead; // Well is it? + private Object mProcStatsLock; // Internal lock for accessing AssociationState // Please keep the following two enum list synced. private static final int[] BIND_ORIG_ENUMS = new int[] { @@ -137,23 +138,29 @@ final class ConnectionRecord { Slog.wtf(TAG_AM, "Inactive holder in referenced service " + binding.service.shortInstanceName + ": proc=" + binding.service.app); } else { - association = holder.pkg.getAssociationStateLocked(holder.state, - binding.service.instanceName.getClassName()).startSource(clientUid, - clientProcessName, clientPackageName); - + mProcStatsLock = binding.service.app.mService.mProcessStats.mLock; + synchronized (mProcStatsLock) { + association = holder.pkg.getAssociationStateLocked(holder.state, + binding.service.instanceName.getClassName()).startSource(clientUid, + clientProcessName, clientPackageName); + } } } } public void trackProcState(int procState, int seq, long now) { if (association != null) { - association.trackProcState(procState, seq, now); + synchronized (mProcStatsLock) { + association.trackProcState(procState, seq, now); + } } } public void stopAssociation() { if (association != null) { - association.stop(); + synchronized (mProcStatsLock) { + association.stop(); + } association = null; } } diff --git a/services/core/java/com/android/server/am/ContentProviderConnection.java b/services/core/java/com/android/server/am/ContentProviderConnection.java index 3bc4fcf08921..3b9d47d509ad 100644 --- a/services/core/java/com/android/server/am/ContentProviderConnection.java +++ b/services/core/java/com/android/server/am/ContentProviderConnection.java @@ -38,6 +38,7 @@ public final class ContentProviderConnection extends Binder { public final String clientPackage; public AssociationState.SourceState association; public final long createTime; + private Object mProcStatsLock; // Internal lock for accessing AssociationState /** * Internal lock that guards access to the two counters. @@ -87,23 +88,29 @@ public final class ContentProviderConnection extends Binder { Slog.wtf(TAG_AM, "Inactive holder in referenced provider " + provider.name.toShortString() + ": proc=" + provider.proc); } else { - association = holder.pkg.getAssociationStateLocked(holder.state, - provider.name.getClassName()).startSource(client.uid, client.processName, - clientPackage); - + mProcStatsLock = provider.proc.mService.mProcessStats.mLock; + synchronized (mProcStatsLock) { + association = holder.pkg.getAssociationStateLocked(holder.state, + provider.name.getClassName()).startSource(client.uid, + client.processName, clientPackage); + } } } } public void trackProcState(int procState, int seq, long now) { if (association != null) { - association.trackProcState(procState, seq, now); + synchronized (mProcStatsLock) { + association.trackProcState(procState, seq, now); + } } } public void stopAssociation() { if (association != null) { - association.stop(); + synchronized (mProcStatsLock) { + association.stop(); + } association = null; } } diff --git a/services/core/java/com/android/server/am/ContentProviderRecord.java b/services/core/java/com/android/server/am/ContentProviderRecord.java index 5fd15db79d66..75f31c0ac29f 100644 --- a/services/core/java/com/android/server/am/ContentProviderRecord.java +++ b/services/core/java/com/android/server/am/ContentProviderRecord.java @@ -321,6 +321,7 @@ final class ContentProviderRecord implements ComponentName.WithComponentName { final String mOwningProcessName; int mAcquisitionCount; AssociationState.SourceState mAssociation; + private Object mProcStatsLock; // Internal lock for accessing AssociationState public ExternalProcessHandle(IBinder token, int owningUid, String owningProcessName) { mToken = token; @@ -353,17 +354,21 @@ final class ContentProviderRecord implements ComponentName.WithComponentName { Slog.wtf(TAG_AM, "Inactive holder in referenced provider " + provider.name.toShortString() + ": proc=" + provider.proc); } else { - mAssociation = holder.pkg.getAssociationStateLocked(holder.state, - provider.name.getClassName()).startSource(mOwningUid, - mOwningProcessName, null); - + mProcStatsLock = provider.proc.mService.mProcessStats.mLock; + synchronized (mProcStatsLock) { + mAssociation = holder.pkg.getAssociationStateLocked(holder.state, + provider.name.getClassName()).startSource(mOwningUid, + mOwningProcessName, null); + } } } } public void stopAssociation() { if (mAssociation != null) { - mAssociation.stop(); + synchronized (mProcStatsLock) { + mAssociation.stop(); + } mAssociation = null; } } diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index d6bf8dbe0a6a..5c19ceb7067a 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -2792,8 +2792,10 @@ public class OomAdjuster { state.setNotCachedSinceIdle(false); } if (!doingAll) { - mService.setProcessTrackerStateLOSP(app, - mService.mProcessStats.getMemFactorLocked(), now); + synchronized (mService.mProcessStats.mLock) { + mService.setProcessTrackerStateLOSP(app, + mService.mProcessStats.getMemFactorLocked(), now); + } } else { state.setProcStateChanged(true); } diff --git a/services/core/java/com/android/server/power/hint/HintManagerService.java b/services/core/java/com/android/server/power/hint/HintManagerService.java index 6014d0cee171..2491565dd376 100644 --- a/services/core/java/com/android/server/power/hint/HintManagerService.java +++ b/services/core/java/com/android/server/power/hint/HintManagerService.java @@ -255,7 +255,11 @@ public final class HintManagerService extends SystemService { private boolean checkTidValid(int uid, int tgid, int [] tids) { // Make sure all tids belongs to the same UID (including isolated UID), // tids can belong to different application processes. - List<Integer> eligiblePids = mAmInternal.getIsolatedProcesses(uid); + List<Integer> eligiblePids = null; + // To avoid deadlock, do not call into AMS if the call is from system. + if (uid != Process.SYSTEM_UID) { + eligiblePids = mAmInternal.getIsolatedProcesses(uid); + } if (eligiblePids == null) { eligiblePids = new ArrayList<>(); } |