diff options
| author | 2019-04-18 19:25:14 +0000 | |
|---|---|---|
| committer | 2019-04-18 19:25:14 +0000 | |
| commit | 6c4094c67da5e8ed7549e88d57d6c74d3f71a316 (patch) | |
| tree | cbd11f4a0e62860ecbcd082b118c8dfd67dd28e0 | |
| parent | 094b9acb0dc6782783dd4efcba98598b71bbb232 (diff) | |
| parent | 34a27c4c455d490116572c02f7d8443842164fd3 (diff) | |
Merge "Don't call ConnectivityService when holding ActivityManagerService lock." into qt-dev
3 files changed, 25 insertions, 18 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 5e5611bcf058..474f25bd5533 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -1073,9 +1073,8 @@ public final class ActivityThread extends ClientTransactionHandler { } public void updateHttpProxy() { - final ConnectivityManager cm = ConnectivityManager.from( + ActivityThread.updateHttpProxy( getApplication() != null ? getApplication() : getSystemContext()); - Proxy.setHttpProxySystemProperty(cm.getDefaultProxy()); } public void processInBackground() { @@ -6948,6 +6947,11 @@ public final class ActivityThread extends ClientTransactionHandler { return thread; } + public static void updateHttpProxy(@NonNull Context context) { + final ConnectivityManager cm = ConnectivityManager.from(context); + Proxy.setHttpProxySystemProperty(cm.getDefaultProxy()); + } + @UnsupportedAppUsage public final void installSystemProviders(List<ProviderInfo> providers) { if (providers != null) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index aad45e6ad466..881a4ae92bc4 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -1635,9 +1635,7 @@ public class ActivityManagerService extends IActivityManager.Stub } } break; case UPDATE_HTTP_PROXY_MSG: { - synchronized (ActivityManagerService.this) { - mProcessList.setAllHttpProxyLocked(); - } + mProcessList.setAllHttpProxy(); } break; case PROC_START_TIMEOUT_MSG: { ProcessRecord app = (ProcessRecord)msg.obj; @@ -1826,7 +1824,7 @@ public class ActivityManagerService extends IActivityManager.Stub } break; } } - }; + } static final int COLLECT_PSS_BG_MSG = 1; diff --git a/services/core/java/com/android/server/am/ProcessList.java b/services/core/java/com/android/server/am/ProcessList.java index 316368a52ce2..b85c452c7104 100644 --- a/services/core/java/com/android/server/am/ProcessList.java +++ b/services/core/java/com/android/server/am/ProcessList.java @@ -46,6 +46,7 @@ import static com.android.server.am.ActivityManagerService.TAG_PSS; import static com.android.server.am.ActivityManagerService.TAG_UID_OBSERVERS; import android.app.ActivityManager; +import android.app.ActivityThread; import android.app.AppGlobals; import android.app.AppProtoEnums; import android.app.IApplicationThread; @@ -2486,21 +2487,25 @@ public final class ProcessList { } } - @GuardedBy("mService") - void setAllHttpProxyLocked() { - for (int i = mLruProcesses.size() - 1; i >= 0; i--) { - ProcessRecord r = mLruProcesses.get(i); - // Don't dispatch to isolated processes as they can't access - // ConnectivityManager and don't have network privileges anyway. - if (r.thread != null && !r.isolated) { - try { - r.thread.updateHttpProxy(); - } catch (RemoteException ex) { - Slog.w(TAG, "Failed to update http proxy for: " + - r.info.processName); + void setAllHttpProxy() { + // Update the HTTP proxy for each application thread. + synchronized (mService) { + for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) { + ProcessRecord r = mLruProcesses.get(i); + // Don't dispatch to isolated processes as they can't access ConnectivityManager and + // don't have network privileges anyway. Exclude system server and update it + // separately outside the AMS lock, to avoid deadlock with Connectivity Service. + if (r.pid != ActivityManagerService.MY_PID && r.thread != null && !r.isolated) { + try { + r.thread.updateHttpProxy(); + } catch (RemoteException ex) { + Slog.w(TAG, "Failed to update http proxy for: " + + r.info.processName); + } } } } + ActivityThread.updateHttpProxy(mService.mContext); } @GuardedBy("mService") |