Loading services/core/java/com/android/server/am/ActivityManagerService.java +43 −7 Original line number Original line Diff line number Diff line Loading @@ -316,6 +316,9 @@ public final class ActivityManagerService extends ActivityManagerNative // How long we wait for a launched process to attach to the activity manager // How long we wait for a launched process to attach to the activity manager // before we decide it's never going to come up for real. // before we decide it's never going to come up for real. static final int PROC_START_TIMEOUT = 10*1000; static final int PROC_START_TIMEOUT = 10*1000; // How long we wait for an attached process to publish its content providers // before we decide it must be hung. static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000; // How long we wait for a launched process to attach to the activity manager // How long we wait for a launched process to attach to the activity manager // before we decide it's never going to come up for real, when the process was // before we decide it's never going to come up for real, when the process was Loading Loading @@ -1368,6 +1371,7 @@ public final class ActivityManagerService extends ActivityManagerNative static final int REPORT_USER_SWITCH_COMPLETE_MSG = 56; static final int REPORT_USER_SWITCH_COMPLETE_MSG = 56; static final int SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG = 57; static final int SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG = 57; static final int APP_BOOST_DEACTIVATE_MSG = 58; static final int APP_BOOST_DEACTIVATE_MSG = 58; static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG = 59; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_BROADCAST_QUEUE_MSG = 200; static final int FIRST_BROADCAST_QUEUE_MSG = 200; Loading Loading @@ -1701,6 +1705,12 @@ public final class ActivityManagerService extends ActivityManagerNative processStartTimedOutLocked(app); processStartTimedOutLocked(app); } } } break; } break; case CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG: { ProcessRecord app = (ProcessRecord)msg.obj; synchronized (ActivityManagerService.this) { processContentProviderPublishTimedOutLocked(app); } } break; case DO_PENDING_ACTIVITY_LAUNCHES_MSG: { case DO_PENDING_ACTIVITY_LAUNCHES_MSG: { synchronized (ActivityManagerService.this) { synchronized (ActivityManagerService.this) { mStackSupervisor.doPendingActivityLaunchesLocked(true); mStackSupervisor.doPendingActivityLaunchesLocked(true); Loading Loading @@ -5944,6 +5954,11 @@ public final class ActivityManagerService extends ActivityManagerNative return needRestart; return needRestart; } } private final void processContentProviderPublishTimedOutLocked(ProcessRecord app) { cleanupAppInLaunchingProvidersLocked(app, true); removeProcessLocked(app, false, true, "timeout publishing content providers"); } private final void processStartTimedOutLocked(ProcessRecord app) { private final void processStartTimedOutLocked(ProcessRecord app) { final int pid = app.pid; final int pid = app.pid; boolean gone = false; boolean gone = false; Loading @@ -5970,7 +5985,7 @@ public final class ActivityManagerService extends ActivityManagerNative mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); } } // Take care of any launching providers waiting for this process. // Take care of any launching providers waiting for this process. checkAppInLaunchingProvidersLocked(app, true); cleanupAppInLaunchingProvidersLocked(app, true); // Take care of any services that are waiting for the process. // Take care of any services that are waiting for the process. mServices.processStartTimedOutLocked(app); mServices.processStartTimedOutLocked(app); app.kill("start timeout", true); app.kill("start timeout", true); Loading Loading @@ -6066,6 +6081,12 @@ public final class ActivityManagerService extends ActivityManagerNative boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info); boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info); List<ProviderInfo> providers = normalMode ? generateApplicationProvidersLocked(app) : null; List<ProviderInfo> providers = normalMode ? generateApplicationProvidersLocked(app) : null; if (providers != null && checkAppInLaunchingProvidersLocked(app)) { Message msg = mHandler.obtainMessage(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG); msg.obj = app; mHandler.sendMessageDelayed(msg, CONTENT_PROVIDER_PUBLISH_TIMEOUT); } if (!normalMode) { if (!normalMode) { Slog.i(TAG, "Launching preboot mode app: " + app); Slog.i(TAG, "Launching preboot mode app: " + app); } } Loading Loading @@ -9912,14 +9933,19 @@ public final class ActivityManagerService extends ActivityManagerNative mProviderMap.putProviderByName(names[j], dst); mProviderMap.putProviderByName(names[j], dst); } } int NL = mLaunchingProviders.size(); int launchingCount = mLaunchingProviders.size(); int j; int j; for (j=0; j<NL; j++) { boolean wasInLaunchingProviders = false; for (j = 0; j < launchingCount; j++) { if (mLaunchingProviders.get(j) == dst) { if (mLaunchingProviders.get(j) == dst) { mLaunchingProviders.remove(j); mLaunchingProviders.remove(j); wasInLaunchingProviders = true; j--; j--; NL--; launchingCount--; } } } if (wasInLaunchingProviders) { mHandler.removeMessages(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG, r); } } synchronized (dst) { synchronized (dst) { dst.provider = src.provider; dst.provider = src.provider; Loading Loading @@ -15531,7 +15557,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.pubProviders.clear(); app.pubProviders.clear(); // Take care of any launching providers waiting for this process. // Take care of any launching providers waiting for this process. if (checkAppInLaunchingProvidersLocked(app, false)) { if (cleanupAppInLaunchingProvidersLocked(app, false)) { restart = true; restart = true; } } Loading Loading @@ -15653,7 +15679,17 @@ public final class ActivityManagerService extends ActivityManagerNative return false; return false; } } boolean checkAppInLaunchingProvidersLocked(ProcessRecord app, boolean alwaysBad) { boolean checkAppInLaunchingProvidersLocked(ProcessRecord app) { for (int i = mLaunchingProviders.size() - 1; i >= 0; i--) { ContentProviderRecord cpr = mLaunchingProviders.get(i); if (cpr.launchingApp == app) { return true; } } return false; } boolean cleanupAppInLaunchingProvidersLocked(ProcessRecord app, boolean alwaysBad) { // Look through the content providers we are waiting to have launched, // Look through the content providers we are waiting to have launched, // and if any run in this process then either schedule a restart of // and if any run in this process then either schedule a restart of // the process or kill the client waiting for it if this process has // the process or kill the client waiting for it if this process has Loading
services/core/java/com/android/server/am/ActivityManagerService.java +43 −7 Original line number Original line Diff line number Diff line Loading @@ -316,6 +316,9 @@ public final class ActivityManagerService extends ActivityManagerNative // How long we wait for a launched process to attach to the activity manager // How long we wait for a launched process to attach to the activity manager // before we decide it's never going to come up for real. // before we decide it's never going to come up for real. static final int PROC_START_TIMEOUT = 10*1000; static final int PROC_START_TIMEOUT = 10*1000; // How long we wait for an attached process to publish its content providers // before we decide it must be hung. static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10*1000; // How long we wait for a launched process to attach to the activity manager // How long we wait for a launched process to attach to the activity manager // before we decide it's never going to come up for real, when the process was // before we decide it's never going to come up for real, when the process was Loading Loading @@ -1368,6 +1371,7 @@ public final class ActivityManagerService extends ActivityManagerNative static final int REPORT_USER_SWITCH_COMPLETE_MSG = 56; static final int REPORT_USER_SWITCH_COMPLETE_MSG = 56; static final int SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG = 57; static final int SHUTDOWN_UI_AUTOMATION_CONNECTION_MSG = 57; static final int APP_BOOST_DEACTIVATE_MSG = 58; static final int APP_BOOST_DEACTIVATE_MSG = 58; static final int CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG = 59; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_BROADCAST_QUEUE_MSG = 200; static final int FIRST_BROADCAST_QUEUE_MSG = 200; Loading Loading @@ -1701,6 +1705,12 @@ public final class ActivityManagerService extends ActivityManagerNative processStartTimedOutLocked(app); processStartTimedOutLocked(app); } } } break; } break; case CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG: { ProcessRecord app = (ProcessRecord)msg.obj; synchronized (ActivityManagerService.this) { processContentProviderPublishTimedOutLocked(app); } } break; case DO_PENDING_ACTIVITY_LAUNCHES_MSG: { case DO_PENDING_ACTIVITY_LAUNCHES_MSG: { synchronized (ActivityManagerService.this) { synchronized (ActivityManagerService.this) { mStackSupervisor.doPendingActivityLaunchesLocked(true); mStackSupervisor.doPendingActivityLaunchesLocked(true); Loading Loading @@ -5944,6 +5954,11 @@ public final class ActivityManagerService extends ActivityManagerNative return needRestart; return needRestart; } } private final void processContentProviderPublishTimedOutLocked(ProcessRecord app) { cleanupAppInLaunchingProvidersLocked(app, true); removeProcessLocked(app, false, true, "timeout publishing content providers"); } private final void processStartTimedOutLocked(ProcessRecord app) { private final void processStartTimedOutLocked(ProcessRecord app) { final int pid = app.pid; final int pid = app.pid; boolean gone = false; boolean gone = false; Loading @@ -5970,7 +5985,7 @@ public final class ActivityManagerService extends ActivityManagerNative mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); } } // Take care of any launching providers waiting for this process. // Take care of any launching providers waiting for this process. checkAppInLaunchingProvidersLocked(app, true); cleanupAppInLaunchingProvidersLocked(app, true); // Take care of any services that are waiting for the process. // Take care of any services that are waiting for the process. mServices.processStartTimedOutLocked(app); mServices.processStartTimedOutLocked(app); app.kill("start timeout", true); app.kill("start timeout", true); Loading Loading @@ -6066,6 +6081,12 @@ public final class ActivityManagerService extends ActivityManagerNative boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info); boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info); List<ProviderInfo> providers = normalMode ? generateApplicationProvidersLocked(app) : null; List<ProviderInfo> providers = normalMode ? generateApplicationProvidersLocked(app) : null; if (providers != null && checkAppInLaunchingProvidersLocked(app)) { Message msg = mHandler.obtainMessage(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG); msg.obj = app; mHandler.sendMessageDelayed(msg, CONTENT_PROVIDER_PUBLISH_TIMEOUT); } if (!normalMode) { if (!normalMode) { Slog.i(TAG, "Launching preboot mode app: " + app); Slog.i(TAG, "Launching preboot mode app: " + app); } } Loading Loading @@ -9912,14 +9933,19 @@ public final class ActivityManagerService extends ActivityManagerNative mProviderMap.putProviderByName(names[j], dst); mProviderMap.putProviderByName(names[j], dst); } } int NL = mLaunchingProviders.size(); int launchingCount = mLaunchingProviders.size(); int j; int j; for (j=0; j<NL; j++) { boolean wasInLaunchingProviders = false; for (j = 0; j < launchingCount; j++) { if (mLaunchingProviders.get(j) == dst) { if (mLaunchingProviders.get(j) == dst) { mLaunchingProviders.remove(j); mLaunchingProviders.remove(j); wasInLaunchingProviders = true; j--; j--; NL--; launchingCount--; } } } if (wasInLaunchingProviders) { mHandler.removeMessages(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG, r); } } synchronized (dst) { synchronized (dst) { dst.provider = src.provider; dst.provider = src.provider; Loading Loading @@ -15531,7 +15557,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.pubProviders.clear(); app.pubProviders.clear(); // Take care of any launching providers waiting for this process. // Take care of any launching providers waiting for this process. if (checkAppInLaunchingProvidersLocked(app, false)) { if (cleanupAppInLaunchingProvidersLocked(app, false)) { restart = true; restart = true; } } Loading Loading @@ -15653,7 +15679,17 @@ public final class ActivityManagerService extends ActivityManagerNative return false; return false; } } boolean checkAppInLaunchingProvidersLocked(ProcessRecord app, boolean alwaysBad) { boolean checkAppInLaunchingProvidersLocked(ProcessRecord app) { for (int i = mLaunchingProviders.size() - 1; i >= 0; i--) { ContentProviderRecord cpr = mLaunchingProviders.get(i); if (cpr.launchingApp == app) { return true; } } return false; } boolean cleanupAppInLaunchingProvidersLocked(ProcessRecord app, boolean alwaysBad) { // Look through the content providers we are waiting to have launched, // Look through the content providers we are waiting to have launched, // and if any run in this process then either schedule a restart of // and if any run in this process then either schedule a restart of // the process or kill the client waiting for it if this process has // the process or kill the client waiting for it if this process has