diff options
| author | 2024-10-11 19:58:35 +0000 | |
|---|---|---|
| committer | 2024-10-11 19:58:35 +0000 | |
| commit | b9e31a80dfeece8b91689c096569650b76f66699 (patch) | |
| tree | 979bfcaea3fac099513937c980012bb4d6b3a3a8 | |
| parent | ac9731810400be716e8140d409aea2e9d8825eae (diff) | |
| parent | 4c5373b47032a513c54bf4cf3846df0ea3f95686 (diff) | |
Merge "Fix ContentProvider removal bug" into main
3 files changed, 75 insertions, 34 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index 3bfbc5557024..3f540ad43da1 100644 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -7227,7 +7227,7 @@ public final class ActiveServices { mAm.mBatteryStatsService.noteServiceStopLaunch(sr.appInfo.uid, sr.name.getPackageName(), sr.name.getClassName()); if (sr.app != app && sr.app != null && !sr.app.isPersistent()) { - mAm.mProcessStateController.stopService(psr, sr); + mAm.mProcessStateController.stopService(sr.app.mServices, sr); sr.app.mServices.updateBoundClientUids(); } sr.setProcess(null, null, 0, null); diff --git a/services/core/java/com/android/server/am/ProcessStateController.java b/services/core/java/com/android/server/am/ProcessStateController.java index 428df2361f0d..01468c640f6c 100644 --- a/services/core/java/com/android/server/am/ProcessStateController.java +++ b/services/core/java/com/android/server/am/ProcessStateController.java @@ -395,10 +395,9 @@ public class ProcessStateController { */ public void removeProviderConnection(@NonNull ProcessRecord client, ContentProviderConnection cpc) { - client.mProviders.addProviderConnection(cpc); + client.mProviders.removeProviderConnection(cpc); } - /********************** Content Provider State Events **********************/ /*************************** Service State Events **************************/ /** * Note that a process has started hosting a service. diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java index 412599d463c5..7dbd0578df0d 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java @@ -1540,7 +1540,8 @@ public class MockingOomAdjusterTests { public void testUpdateOomAdj_DoOne_Provider_Self() { ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); - bindProvider(app, app, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(app, null, false); + bindProvider(app, cpr); updateOomAdj(app); final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ @@ -1555,7 +1556,8 @@ public class MockingOomAdjusterTests { MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID, MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false)); - bindProvider(app, client, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(app, null, false); + bindProvider(client, cpr); mProcessStateController.setTreatLikeActivity(client.mServices, true); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(app, client); @@ -1572,7 +1574,8 @@ public class MockingOomAdjusterTests { MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID, MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false)); - bindProvider(app, client, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(app, null, false); + bindProvider(client, cpr); doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState(); doReturn(client).when(mService).getTopApp(); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); @@ -1590,7 +1593,8 @@ public class MockingOomAdjusterTests { ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID, MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false)); mProcessStateController.setHasForegroundServices(client.mServices, true, 0, true); - bindProvider(app, client, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(app, null, false); + bindProvider(client, cpr); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(client, app); @@ -1620,7 +1624,8 @@ public class MockingOomAdjusterTests { mProcessStateController.setHasForegroundServices(client.mServices, true, FOREGROUND_SERVICE_TYPE_SHORT_SERVICE, false); - bindProvider(app, client, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(app, null, false); + bindProvider(client, cpr); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(client, app); @@ -1642,7 +1647,8 @@ public class MockingOomAdjusterTests { MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID, MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false)); - bindProvider(app, client, null, null, true); + final ContentProviderRecord cpr = createContentProviderRecord(app, null, true); + bindProvider(client, cpr); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(client, app); @@ -1655,9 +1661,24 @@ public class MockingOomAdjusterTests { public void testUpdateOomAdj_DoOne_Provider_Retention() { ProcessRecord app = spy(makeDefaultProcessRecord(MOCKAPP_PID, MOCKAPP_UID, MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); - app.mProviders.setLastProviderTime(SystemClock.uptimeMillis()); + ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID, + MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false)); + final String providerName = "aProvider"; + // Go through the motions of binding a provider + final ContentProviderRecord cpr = createContentProviderRecord(app, providerName, false); + final ContentProviderConnection conn = bindProvider(client, cpr); + doReturn(PROCESS_STATE_TOP).when(mService.mAtmInternal).getTopProcessState(); + doReturn(client).when(mService).getTopApp(); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); - updateOomAdj(app); + updateOomAdj(client, app); + + assertProcStates(app, PROCESS_STATE_BOUND_TOP, FOREGROUND_APP_ADJ, SCHED_GROUP_DEFAULT); + + unbindProvider(client, cpr, conn); + mProcessStateController.removePublishedProvider(app, providerName); + final long lastProviderTime = SystemClock.uptimeMillis(); + mProcessStateController.setLastProviderTime(app, SystemClock.uptimeMillis()); + updateOomAdj(client, app); assertProcStates(app, PROCESS_STATE_LAST_ACTIVITY, PREVIOUS_APP_ADJ, SCHED_GROUP_BACKGROUND, "recent-provider"); @@ -1667,7 +1688,9 @@ public class MockingOomAdjusterTests { final ArgumentCaptor<Long> followUpTimeCaptor = ArgumentCaptor.forClass(Long.class); verify(mService.mHandler).sendEmptyMessageAtTime(eq(FOLLOW_UP_OOMADJUSTER_UPDATE_MSG), followUpTimeCaptor.capture()); + mInjector.jumpUptimeAheadTo(followUpTimeCaptor.getValue()); + setProcessesToLru(client, app); mProcessStateController.runFollowUpUpdate(); final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ @@ -2019,7 +2042,8 @@ public class MockingOomAdjusterTests { bindService(app, client, null, null, 0, mock(IBinder.class)); ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID, MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false)); - bindProvider(client, client2, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(client, null, false); + bindProvider(client2, cpr); mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(client, client2, app); @@ -2039,7 +2063,8 @@ public class MockingOomAdjusterTests { bindService(app, client, null, null, 0, mock(IBinder.class)); ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID, MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false)); - bindProvider(client, client2, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(client, null, false); + bindProvider(client2, cpr); mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true); bindService(client2, app, null, null, 0, mock(IBinder.class)); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); @@ -2057,10 +2082,12 @@ public class MockingOomAdjusterTests { MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID, MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false)); - bindProvider(app, client, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(app, null, false); + bindProvider(client, cpr); ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID, MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false)); - bindProvider(client, client2, null, null, false); + final ContentProviderRecord cpr2 = createContentProviderRecord(client, null, false); + bindProvider(client2, cpr2); mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(client, client2, app); @@ -2077,12 +2104,15 @@ public class MockingOomAdjusterTests { MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); ProcessRecord client = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID, MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false)); - bindProvider(app, client, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(app, null, false); + bindProvider(client, cpr); ProcessRecord client2 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID, MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false)); - bindProvider(client, client2, null, null, false); + final ContentProviderRecord cpr2 = createContentProviderRecord(client, null, false); + bindProvider(client2, cpr2); mProcessStateController.setHasForegroundServices(client2.mServices, true, 0, true); - bindProvider(client2, app, null, null, false); + final ContentProviderRecord cpr3 = createContentProviderRecord(client2, null, false); + bindProvider(app, cpr3); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(app, client, client2); @@ -2629,21 +2659,24 @@ public class MockingOomAdjusterTests { MOCKAPP_PROCESSNAME, MOCKAPP_PACKAGENAME, false)); ProcessRecord app2 = spy(makeDefaultProcessRecord(MOCKAPP2_PID, MOCKAPP2_UID, MOCKAPP2_PROCESSNAME, MOCKAPP2_PACKAGENAME, false)); - ContentProviderRecord cr = bindProvider(app, app2, null, null, false); + final ContentProviderRecord cpr = createContentProviderRecord(app, null, false); + bindProvider(app2, cpr); ProcessRecord app3 = spy(makeDefaultProcessRecord(MOCKAPP3_PID, MOCKAPP3_UID, MOCKAPP3_PROCESSNAME, MOCKAPP3_PACKAGENAME, false)); - bindProvider(app2, app3, null, null, false); - bindProvider(app3, app, null, null, false); + final ContentProviderRecord cpr2 = createContentProviderRecord(app2, null, false); + bindProvider(app3, cpr2); + final ContentProviderRecord cpr3 = createContentProviderRecord(app3, null, false); + bindProvider(app, cpr3); WindowProcessController wpc = app3.getWindowProcessController(); doReturn(true).when(wpc).isHomeProcess(); ProcessRecord app4 = spy(makeDefaultProcessRecord(MOCKAPP4_PID, MOCKAPP4_UID, MOCKAPP4_PROCESSNAME, MOCKAPP4_PACKAGENAME, false)); mProcessStateController.setHasOverlayUi(app4, true); - bindProvider(app, app4, cr, null, false); + bindProvider(app4, cpr); ProcessRecord app5 = spy(makeDefaultProcessRecord(MOCKAPP5_PID, MOCKAPP5_UID, MOCKAPP5_PROCESSNAME, MOCKAPP5_PACKAGENAME, false)); mProcessStateController.setHasForegroundServices(app5.mServices, true, 0, true); - bindProvider(app, app5, cr, null, false); + bindProvider(app5, cpr); setWakefulness(PowerManagerInternal.WAKEFULNESS_AWAKE); updateOomAdj(app, app2, app3, app4, app5); @@ -3248,21 +3281,30 @@ public class MockingOomAdjusterTests { } } - private ContentProviderRecord bindProvider(ProcessRecord publisher, ProcessRecord client, - ContentProviderRecord record, String name, boolean hasExternalProviders) { - if (record == null) { - record = mock(ContentProviderRecord.class); - mProcessStateController.addPublishedProvider(publisher, name, record); - record.proc = publisher; - setFieldValue(ContentProviderRecord.class, record, "connections", - new ArrayList<ContentProviderConnection>()); - doReturn(hasExternalProviders).when(record).hasExternalProcessHandles(); - } + private ContentProviderRecord createContentProviderRecord(ProcessRecord publisher, String name, + boolean hasExternalProviders) { + ContentProviderRecord record = mock(ContentProviderRecord.class); + mProcessStateController.addPublishedProvider(publisher, name, record); + record.proc = publisher; + setFieldValue(ContentProviderRecord.class, record, "connections", + new ArrayList<ContentProviderConnection>()); + doReturn(hasExternalProviders).when(record).hasExternalProcessHandles(); + return record; + } + + private ContentProviderConnection bindProvider(ProcessRecord client, + ContentProviderRecord record) { ContentProviderConnection conn = spy(new ContentProviderConnection(record, client, client.info.packageName, UserHandle.getUserId(client.uid))); record.connections.add(conn); mProcessStateController.addProviderConnection(client, conn); - return record; + return conn; + } + + private void unbindProvider(ProcessRecord client, ContentProviderRecord record, + ContentProviderConnection conn) { + record.connections.remove(conn); + mProcessStateController.removeProviderConnection(client, conn); } @SuppressWarnings("GuardedBy") |