blob: 1751856066fbd1e14471a8f8e935c9a76f99555f [file] [log] [blame]
Dianne Hackborn0ef403e2017-01-24 18:22:15 -08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.am;
18
Michal Karpinski8596ded2018-11-14 14:43:48 +000019import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER_QUICK;
20
Ben Murdochc26a5a82019-01-16 10:05:58 +000021import android.app.ActivityThread;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080022import android.content.ContentResolver;
23import android.database.ContentObserver;
24import android.net.Uri;
25import android.os.Handler;
Ben Murdochc26a5a82019-01-16 10:05:58 +000026import android.provider.DeviceConfig;
27import android.provider.DeviceConfig.OnPropertyChangedListener;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080028import android.provider.Settings;
Ben Murdochc26a5a82019-01-16 10:05:58 +000029import android.text.TextUtils;
Michal Karpinski666631b2019-02-26 16:59:11 +000030import android.text.TextUtils.SimpleStringSplitter;
31import android.util.ArraySet;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080032import android.util.KeyValueListParser;
33import android.util.Slog;
34
35import java.io.PrintWriter;
36
37/**
38 * Settings constants that can modify the activity manager's behavior.
39 */
40final class ActivityManagerConstants extends ContentObserver {
Amith Yamasanib0c8a882017-08-28 09:36:42 -070041
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080042 // Key names stored in the settings value.
Dianne Hackborn83b40f62017-04-26 13:59:47 -070043 private static final String KEY_BACKGROUND_SETTLE_TIME = "background_settle_time";
Dianne Hackborncb015632017-06-14 17:30:15 -070044 private static final String KEY_FGSERVICE_MIN_SHOWN_TIME
45 = "fgservice_min_shown_time";
46 private static final String KEY_FGSERVICE_MIN_REPORT_TIME
47 = "fgservice_min_report_time";
48 private static final String KEY_FGSERVICE_SCREEN_ON_BEFORE_TIME
49 = "fgservice_screen_on_before_time";
50 private static final String KEY_FGSERVICE_SCREEN_ON_AFTER_TIME
51 = "fgservice_screen_on_after_time";
Dianne Hackborn83b40f62017-04-26 13:59:47 -070052 private static final String KEY_CONTENT_PROVIDER_RETAIN_TIME = "content_provider_retain_time";
53 private static final String KEY_GC_TIMEOUT = "gc_timeout";
54 private static final String KEY_GC_MIN_INTERVAL = "gc_min_interval";
55 private static final String KEY_FULL_PSS_MIN_INTERVAL = "full_pss_min_interval";
56 private static final String KEY_FULL_PSS_LOWERED_INTERVAL = "full_pss_lowered_interval";
Dianne Hackbornffca58b2017-05-24 16:15:45 -070057 private static final String KEY_POWER_CHECK_INTERVAL = "power_check_interval";
58 private static final String KEY_POWER_CHECK_MAX_CPU_1 = "power_check_max_cpu_1";
59 private static final String KEY_POWER_CHECK_MAX_CPU_2 = "power_check_max_cpu_2";
60 private static final String KEY_POWER_CHECK_MAX_CPU_3 = "power_check_max_cpu_3";
61 private static final String KEY_POWER_CHECK_MAX_CPU_4 = "power_check_max_cpu_4";
Dianne Hackborn83b40f62017-04-26 13:59:47 -070062 private static final String KEY_SERVICE_USAGE_INTERACTION_TIME
63 = "service_usage_interaction_time";
64 private static final String KEY_USAGE_STATS_INTERACTION_INTERVAL
65 = "usage_stats_interaction_interval";
66 static final String KEY_SERVICE_RESTART_DURATION = "service_restart_duration";
67 static final String KEY_SERVICE_RESET_RUN_DURATION = "service_reset_run_duration";
68 static final String KEY_SERVICE_RESTART_DURATION_FACTOR = "service_restart_duration_factor";
69 static final String KEY_SERVICE_MIN_RESTART_TIME_BETWEEN = "service_min_restart_time_between";
70 static final String KEY_MAX_SERVICE_INACTIVITY = "service_max_inactivity";
71 static final String KEY_BG_START_TIMEOUT = "service_bg_start_timeout";
Michal Karpinskie069b002019-03-07 16:15:14 +000072 static final String KEY_SERVICE_BG_ACTIVITY_START_TIMEOUT = "service_bg_activity_start_timeout";
Amith Yamasanib0c8a882017-08-28 09:36:42 -070073 static final String KEY_BOUND_SERVICE_CRASH_RESTART_DURATION = "service_crash_restart_duration";
74 static final String KEY_BOUND_SERVICE_CRASH_MAX_RETRY = "service_crash_max_retry";
Sudheer Shankaf6690102017-10-16 10:20:32 -070075 static final String KEY_PROCESS_START_ASYNC = "process_start_async";
Dianne Hackborn8c76d912018-08-23 15:20:05 -070076 static final String KEY_MEMORY_INFO_THROTTLE_TIME = "memory_info_throttle_time";
Amith Yamasanie5bfeee2018-09-05 18:52:35 -070077 static final String KEY_TOP_TO_FGS_GRACE_DURATION = "top_to_fgs_grace_duration";
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080078
Dianne Hackborn0ef403e2017-01-24 18:22:15 -080079 private static final int DEFAULT_MAX_CACHED_PROCESSES = 32;
Dianne Hackborn83b40f62017-04-26 13:59:47 -070080 private static final long DEFAULT_BACKGROUND_SETTLE_TIME = 60*1000;
Dianne Hackborncb015632017-06-14 17:30:15 -070081 private static final long DEFAULT_FGSERVICE_MIN_SHOWN_TIME = 2*1000;
82 private static final long DEFAULT_FGSERVICE_MIN_REPORT_TIME = 3*1000;
83 private static final long DEFAULT_FGSERVICE_SCREEN_ON_BEFORE_TIME = 1*1000;
84 private static final long DEFAULT_FGSERVICE_SCREEN_ON_AFTER_TIME = 5*1000;
Dianne Hackborn83b40f62017-04-26 13:59:47 -070085 private static final long DEFAULT_CONTENT_PROVIDER_RETAIN_TIME = 20*1000;
86 private static final long DEFAULT_GC_TIMEOUT = 5*1000;
87 private static final long DEFAULT_GC_MIN_INTERVAL = 60*1000;
Dianne Hackborn052e3142017-12-19 16:08:30 -080088 private static final long DEFAULT_FULL_PSS_MIN_INTERVAL = 20*60*1000;
89 private static final long DEFAULT_FULL_PSS_LOWERED_INTERVAL = 5*60*1000;
Dianne Hackbornffca58b2017-05-24 16:15:45 -070090 private static final long DEFAULT_POWER_CHECK_INTERVAL = (DEBUG_POWER_QUICK ? 1 : 5) * 60*1000;
91 private static final int DEFAULT_POWER_CHECK_MAX_CPU_1 = 25;
92 private static final int DEFAULT_POWER_CHECK_MAX_CPU_2 = 25;
93 private static final int DEFAULT_POWER_CHECK_MAX_CPU_3 = 10;
94 private static final int DEFAULT_POWER_CHECK_MAX_CPU_4 = 2;
Dianne Hackborn83b40f62017-04-26 13:59:47 -070095 private static final long DEFAULT_SERVICE_USAGE_INTERACTION_TIME = 30*60*1000;
Amith Yamasani119be9a2018-02-18 22:23:00 -080096 private static final long DEFAULT_USAGE_STATS_INTERACTION_INTERVAL = 2*60*60*1000L;
Dianne Hackborn83b40f62017-04-26 13:59:47 -070097 private static final long DEFAULT_SERVICE_RESTART_DURATION = 1*1000;
98 private static final long DEFAULT_SERVICE_RESET_RUN_DURATION = 60*1000;
99 private static final int DEFAULT_SERVICE_RESTART_DURATION_FACTOR = 4;
100 private static final long DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN = 10*1000;
101 private static final long DEFAULT_MAX_SERVICE_INACTIVITY = 30*60*1000;
102 private static final long DEFAULT_BG_START_TIMEOUT = 15*1000;
Michal Karpinskie069b002019-03-07 16:15:14 +0000103 private static final long DEFAULT_SERVICE_BG_ACTIVITY_START_TIMEOUT = 10_000;
Amith Yamasanib0c8a882017-08-28 09:36:42 -0700104 private static final long DEFAULT_BOUND_SERVICE_CRASH_RESTART_DURATION = 30*60_000;
105 private static final int DEFAULT_BOUND_SERVICE_CRASH_MAX_RETRY = 16;
Sudheer Shankaf6690102017-10-16 10:20:32 -0700106 private static final boolean DEFAULT_PROCESS_START_ASYNC = true;
Dianne Hackborn8c76d912018-08-23 15:20:05 -0700107 private static final long DEFAULT_MEMORY_INFO_THROTTLE_TIME = 5*60*1000;
Amith Yamasanie5bfeee2018-09-05 18:52:35 -0700108 private static final long DEFAULT_TOP_TO_FGS_GRACE_DURATION = 15 * 1000;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800109
Matt Pape40074da2019-02-12 13:53:26 -0800110 // Flag stored in the DeviceConfig API.
111 /**
112 * Maximum number of cached processes.
113 */
114 private static final String KEY_MAX_CACHED_PROCESSES = "max_cached_processes";
115
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800116 // Maximum number of cached processes we will allow.
117 public int MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
118
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700119 // This is the amount of time we allow an app to settle after it goes into the background,
120 // before we start restricting what it can do.
121 public long BACKGROUND_SETTLE_TIME = DEFAULT_BACKGROUND_SETTLE_TIME;
122
Dianne Hackborncb015632017-06-14 17:30:15 -0700123 // The minimum time we allow a foreground service to run with a notification and the
124 // screen on without otherwise telling the user about it. (If it runs for less than this,
125 // it will still be reported to the user as a running app for at least this amount of time.)
126 public long FGSERVICE_MIN_SHOWN_TIME = DEFAULT_FGSERVICE_MIN_SHOWN_TIME;
127
128 // If a foreground service is shown for less than FGSERVICE_MIN_SHOWN_TIME, we will display
129 // the background app running notification about it for at least this amount of time (if it
130 // is larger than the remaining shown time).
131 public long FGSERVICE_MIN_REPORT_TIME = DEFAULT_FGSERVICE_MIN_REPORT_TIME;
132
133 // The minimum amount of time the foreground service needs to have remain being shown
134 // before the screen goes on for us to consider it not worth showing to the user. That is
135 // if an app has a foreground service that stops itself this amount of time or more before
136 // the user turns on the screen, we will just let it go without the user being told about it.
137 public long FGSERVICE_SCREEN_ON_BEFORE_TIME = DEFAULT_FGSERVICE_SCREEN_ON_BEFORE_TIME;
138
139 // The minimum amount of time a foreground service should remain reported to the user if
140 // it is stopped when the screen turns on. This is the time from when the screen turns
141 // on until we will stop reporting it.
142 public long FGSERVICE_SCREEN_ON_AFTER_TIME = DEFAULT_FGSERVICE_SCREEN_ON_AFTER_TIME;
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700143
144 // How long we will retain processes hosting content providers in the "last activity"
145 // state before allowing them to drop down to the regular cached LRU list. This is
146 // to avoid thrashing of provider processes under low memory situations.
147 long CONTENT_PROVIDER_RETAIN_TIME = DEFAULT_CONTENT_PROVIDER_RETAIN_TIME;
148
149 // How long to wait after going idle before forcing apps to GC.
150 long GC_TIMEOUT = DEFAULT_GC_TIMEOUT;
151
152 // The minimum amount of time between successive GC requests for a process.
153 long GC_MIN_INTERVAL = DEFAULT_GC_MIN_INTERVAL;
154
155 // The minimum amount of time between successive PSS requests for a process.
156 long FULL_PSS_MIN_INTERVAL = DEFAULT_FULL_PSS_MIN_INTERVAL;
157
158 // The minimum amount of time between successive PSS requests for a process
159 // when the request is due to the memory state being lowered.
160 long FULL_PSS_LOWERED_INTERVAL = DEFAULT_FULL_PSS_LOWERED_INTERVAL;
161
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700162 // The minimum sample duration we will allow before deciding we have
163 // enough data on CPU usage to start killing things.
Dianne Hackbornffca58b2017-05-24 16:15:45 -0700164 long POWER_CHECK_INTERVAL = DEFAULT_POWER_CHECK_INTERVAL;
165
166 // The maximum CPU (as a percentage) a process is allowed to use over the first
167 // power check interval that it is cached.
168 int POWER_CHECK_MAX_CPU_1 = DEFAULT_POWER_CHECK_MAX_CPU_1;
169
170 // The maximum CPU (as a percentage) a process is allowed to use over the second
171 // power check interval that it is cached. The home app will never check for less
172 // CPU than this (it will not test against the 3 or 4 levels).
173 int POWER_CHECK_MAX_CPU_2 = DEFAULT_POWER_CHECK_MAX_CPU_2;
174
175 // The maximum CPU (as a percentage) a process is allowed to use over the third
176 // power check interval that it is cached.
177 int POWER_CHECK_MAX_CPU_3 = DEFAULT_POWER_CHECK_MAX_CPU_3;
178
179 // The maximum CPU (as a percentage) a process is allowed to use over the fourth
180 // power check interval that it is cached.
181 int POWER_CHECK_MAX_CPU_4 = DEFAULT_POWER_CHECK_MAX_CPU_4;
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700182
183 // This is the amount of time an app needs to be running a foreground service before
184 // we will consider it to be doing interaction for usage stats.
185 long SERVICE_USAGE_INTERACTION_TIME = DEFAULT_SERVICE_USAGE_INTERACTION_TIME;
186
187 // Maximum amount of time we will allow to elapse before re-reporting usage stats
188 // interaction with foreground processes.
189 long USAGE_STATS_INTERACTION_INTERVAL = DEFAULT_USAGE_STATS_INTERACTION_INTERVAL;
190
191 // How long a service needs to be running until restarting its process
192 // is no longer considered to be a relaunch of the service.
193 public long SERVICE_RESTART_DURATION = DEFAULT_SERVICE_RESTART_DURATION;
194
195 // How long a service needs to be running until it will start back at
196 // SERVICE_RESTART_DURATION after being killed.
197 public long SERVICE_RESET_RUN_DURATION = DEFAULT_SERVICE_RESET_RUN_DURATION;
198
199 // Multiplying factor to increase restart duration time by, for each time
200 // a service is killed before it has run for SERVICE_RESET_RUN_DURATION.
201 public int SERVICE_RESTART_DURATION_FACTOR = DEFAULT_SERVICE_RESTART_DURATION_FACTOR;
202
203 // The minimum amount of time between restarting services that we allow.
204 // That is, when multiple services are restarting, we won't allow each
205 // to restart less than this amount of time from the last one.
206 public long SERVICE_MIN_RESTART_TIME_BETWEEN = DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN;
207
208 // Maximum amount of time for there to be no activity on a service before
209 // we consider it non-essential and allow its process to go on the
210 // LRU background list.
211 public long MAX_SERVICE_INACTIVITY = DEFAULT_MAX_SERVICE_INACTIVITY;
212
213 // How long we wait for a background started service to stop itself before
214 // allowing the next pending start to run.
215 public long BG_START_TIMEOUT = DEFAULT_BG_START_TIMEOUT;
216
Michal Karpinskie069b002019-03-07 16:15:14 +0000217 // For how long after a whitelisted service's start its process can start a background activity
218 public long SERVICE_BG_ACTIVITY_START_TIMEOUT = DEFAULT_SERVICE_BG_ACTIVITY_START_TIMEOUT;
219
Amith Yamasanib0c8a882017-08-28 09:36:42 -0700220 // Initial backoff delay for retrying bound foreground services
221 public long BOUND_SERVICE_CRASH_RESTART_DURATION = DEFAULT_BOUND_SERVICE_CRASH_RESTART_DURATION;
222
223 // Maximum number of retries for bound foreground services that crash soon after start
224 public long BOUND_SERVICE_MAX_CRASH_RETRY = DEFAULT_BOUND_SERVICE_CRASH_MAX_RETRY;
225
Sudheer Shankaf6690102017-10-16 10:20:32 -0700226 // Indicates if the processes need to be started asynchronously.
227 public boolean FLAG_PROCESS_START_ASYNC = DEFAULT_PROCESS_START_ASYNC;
228
Dianne Hackborn8c76d912018-08-23 15:20:05 -0700229 // The minimum time we allow between requests for the MemoryInfo of a process to
230 // throttle requests from apps.
231 public long MEMORY_INFO_THROTTLE_TIME = DEFAULT_MEMORY_INFO_THROTTLE_TIME;
232
Amith Yamasanie5bfeee2018-09-05 18:52:35 -0700233 // Allow app just moving from TOP to FOREGROUND_SERVICE to stay in a higher adj value for
234 // this long.
235 public long TOP_TO_FGS_GRACE_DURATION = DEFAULT_TOP_TO_FGS_GRACE_DURATION;
236
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100237 // Indicates whether the activity starts logging is enabled.
238 // Controlled by Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED
Wale Ogunwale342fbe92018-10-09 08:44:10 -0700239 volatile boolean mFlagActivityStartsLoggingEnabled;
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100240
Michal Karpinski8596ded2018-11-14 14:43:48 +0000241 // Indicates whether the background activity starts is enabled.
242 // Controlled by Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED
243 volatile boolean mFlagBackgroundActivityStartsEnabled;
244
Michal Karpinski666631b2019-02-26 16:59:11 +0000245 volatile ArraySet<String> mPackageNamesWhitelistedForBgActivityStarts = new ArraySet<>();
246
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800247 private final ActivityManagerService mService;
248 private ContentResolver mResolver;
249 private final KeyValueListParser mParser = new KeyValueListParser(',');
250
251 private int mOverrideMaxCachedProcesses = -1;
252
253 // The maximum number of cached processes we will keep around before killing them.
254 // NOTE: this constant is *only* a control to not let us go too crazy with
255 // keeping around processes on devices with large amounts of RAM. For devices that
256 // are tighter on RAM, the out of memory killer is responsible for killing background
257 // processes as RAM is needed, and we should *never* be relying on this limit to
258 // kill them. Also note that this limit only applies to cached background processes;
259 // we have no limit on the number of service, visible, foreground, or other such
260 // processes and the number of those processes does not count against the cached
261 // process limit.
262 public int CUR_MAX_CACHED_PROCESSES;
263
264 // The maximum number of empty app processes we will let sit around.
265 public int CUR_MAX_EMPTY_PROCESSES;
266
267 // The number of empty apps at which we don't consider it necessary to do
268 // memory trimming.
269 public int CUR_TRIM_EMPTY_PROCESSES;
270
271 // The number of cached at which we don't consider it necessary to do
272 // memory trimming.
273 public int CUR_TRIM_CACHED_PROCESSES;
274
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100275 private static final Uri ACTIVITY_MANAGER_CONSTANTS_URI = Settings.Global.getUriFor(
276 Settings.Global.ACTIVITY_MANAGER_CONSTANTS);
277
278 private static final Uri ACTIVITY_STARTS_LOGGING_ENABLED_URI = Settings.Global.getUriFor(
279 Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED);
280
Michal Karpinski8596ded2018-11-14 14:43:48 +0000281 private static final Uri BACKGROUND_ACTIVITY_STARTS_ENABLED_URI =
282 Settings.Global.getUriFor(
283 Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED);
284
Michal Karpinski666631b2019-02-26 16:59:11 +0000285 private static final Uri BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST_URI =
286 Settings.Global.getUriFor(
287 Settings.Global.BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST);
288
Ben Murdochc26a5a82019-01-16 10:05:58 +0000289 private final OnPropertyChangedListener mOnDeviceConfigChangedListener =
290 new OnPropertyChangedListener() {
291 @Override
292 public void onPropertyChanged(String namespace, String name, String value) {
293 if (KEY_MAX_CACHED_PROCESSES.equals(name)) {
294 updateMaxCachedProcesses();
295 }
296 }
297 };
298
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800299 public ActivityManagerConstants(ActivityManagerService service, Handler handler) {
300 super(handler);
301 mService = service;
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800302 }
303
304 public void start(ContentResolver resolver) {
305 mResolver = resolver;
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100306 mResolver.registerContentObserver(ACTIVITY_MANAGER_CONSTANTS_URI, false, this);
307 mResolver.registerContentObserver(ACTIVITY_STARTS_LOGGING_ENABLED_URI, false, this);
Michal Karpinski8596ded2018-11-14 14:43:48 +0000308 mResolver.registerContentObserver(BACKGROUND_ACTIVITY_STARTS_ENABLED_URI, false, this);
Michal Karpinski666631b2019-02-26 16:59:11 +0000309 mResolver.registerContentObserver(BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST_URI,
310 false, this);
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800311 updateConstants();
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100312 updateActivityStartsLoggingEnabled();
Michal Karpinski8596ded2018-11-14 14:43:48 +0000313 updateBackgroundActivityStartsEnabled();
Michal Karpinski666631b2019-02-26 16:59:11 +0000314 updateBackgroundActivityStartsPackageNamesWhitelist();
Matt Pape40074da2019-02-12 13:53:26 -0800315 DeviceConfig.addOnPropertyChangedListener(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER,
Ben Murdochc26a5a82019-01-16 10:05:58 +0000316 ActivityThread.currentApplication().getMainExecutor(),
317 mOnDeviceConfigChangedListener);
318 updateMaxCachedProcesses();
319
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800320 }
321
322 public void setOverrideMaxCachedProcesses(int value) {
323 mOverrideMaxCachedProcesses = value;
324 updateMaxCachedProcesses();
325 }
326
327 public int getOverrideMaxCachedProcesses() {
328 return mOverrideMaxCachedProcesses;
329 }
330
331 public static int computeEmptyProcessLimit(int totalProcessLimit) {
332 return totalProcessLimit/2;
333 }
334
335 @Override
336 public void onChange(boolean selfChange, Uri uri) {
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100337 if (uri == null) return;
338 if (ACTIVITY_MANAGER_CONSTANTS_URI.equals(uri)) {
339 updateConstants();
340 } else if (ACTIVITY_STARTS_LOGGING_ENABLED_URI.equals(uri)) {
341 updateActivityStartsLoggingEnabled();
Michal Karpinski8596ded2018-11-14 14:43:48 +0000342 } else if (BACKGROUND_ACTIVITY_STARTS_ENABLED_URI.equals(uri)) {
343 updateBackgroundActivityStartsEnabled();
Michal Karpinski666631b2019-02-26 16:59:11 +0000344 } else if (BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST_URI.equals(uri)) {
345 updateBackgroundActivityStartsPackageNamesWhitelist();
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100346 }
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800347 }
348
349 private void updateConstants() {
Makoto Onuki73360ab2017-03-17 11:50:13 -0700350 final String setting = Settings.Global.getString(mResolver,
351 Settings.Global.ACTIVITY_MANAGER_CONSTANTS);
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800352 synchronized (mService) {
353 try {
Makoto Onuki73360ab2017-03-17 11:50:13 -0700354 mParser.setString(setting);
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800355 } catch (IllegalArgumentException e) {
356 // Failed to parse the settings string, log this and move on
357 // with defaults.
358 Slog.e("ActivityManagerConstants", "Bad activity manager config settings", e);
359 }
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700360 BACKGROUND_SETTLE_TIME = mParser.getLong(KEY_BACKGROUND_SETTLE_TIME,
361 DEFAULT_BACKGROUND_SETTLE_TIME);
Dianne Hackborncb015632017-06-14 17:30:15 -0700362 FGSERVICE_MIN_SHOWN_TIME = mParser.getLong(KEY_FGSERVICE_MIN_SHOWN_TIME,
363 DEFAULT_FGSERVICE_MIN_SHOWN_TIME);
364 FGSERVICE_MIN_REPORT_TIME = mParser.getLong(KEY_FGSERVICE_MIN_REPORT_TIME,
365 DEFAULT_FGSERVICE_MIN_REPORT_TIME);
366 FGSERVICE_SCREEN_ON_BEFORE_TIME = mParser.getLong(KEY_FGSERVICE_SCREEN_ON_BEFORE_TIME,
367 DEFAULT_FGSERVICE_SCREEN_ON_BEFORE_TIME);
368 FGSERVICE_SCREEN_ON_AFTER_TIME = mParser.getLong(KEY_FGSERVICE_SCREEN_ON_AFTER_TIME,
369 DEFAULT_FGSERVICE_SCREEN_ON_AFTER_TIME);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700370 CONTENT_PROVIDER_RETAIN_TIME = mParser.getLong(KEY_CONTENT_PROVIDER_RETAIN_TIME,
371 DEFAULT_CONTENT_PROVIDER_RETAIN_TIME);
372 GC_TIMEOUT = mParser.getLong(KEY_GC_TIMEOUT,
373 DEFAULT_GC_TIMEOUT);
374 GC_MIN_INTERVAL = mParser.getLong(KEY_GC_MIN_INTERVAL,
375 DEFAULT_GC_MIN_INTERVAL);
376 FULL_PSS_MIN_INTERVAL = mParser.getLong(KEY_FULL_PSS_MIN_INTERVAL,
377 DEFAULT_FULL_PSS_MIN_INTERVAL);
378 FULL_PSS_LOWERED_INTERVAL = mParser.getLong(KEY_FULL_PSS_LOWERED_INTERVAL,
379 DEFAULT_FULL_PSS_LOWERED_INTERVAL);
Dianne Hackbornffca58b2017-05-24 16:15:45 -0700380 POWER_CHECK_INTERVAL = mParser.getLong(KEY_POWER_CHECK_INTERVAL,
381 DEFAULT_POWER_CHECK_INTERVAL);
382 POWER_CHECK_MAX_CPU_1 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_1,
383 DEFAULT_POWER_CHECK_MAX_CPU_1);
384 POWER_CHECK_MAX_CPU_2 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_2,
385 DEFAULT_POWER_CHECK_MAX_CPU_2);
386 POWER_CHECK_MAX_CPU_3 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_3,
387 DEFAULT_POWER_CHECK_MAX_CPU_3);
388 POWER_CHECK_MAX_CPU_4 = mParser.getInt(KEY_POWER_CHECK_MAX_CPU_4,
389 DEFAULT_POWER_CHECK_MAX_CPU_4);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700390 SERVICE_USAGE_INTERACTION_TIME = mParser.getLong(KEY_SERVICE_USAGE_INTERACTION_TIME,
391 DEFAULT_SERVICE_USAGE_INTERACTION_TIME);
392 USAGE_STATS_INTERACTION_INTERVAL = mParser.getLong(KEY_USAGE_STATS_INTERACTION_INTERVAL,
393 DEFAULT_USAGE_STATS_INTERACTION_INTERVAL);
394 SERVICE_RESTART_DURATION = mParser.getLong(KEY_SERVICE_RESTART_DURATION,
395 DEFAULT_SERVICE_RESTART_DURATION);
396 SERVICE_RESET_RUN_DURATION = mParser.getLong(KEY_SERVICE_RESET_RUN_DURATION,
397 DEFAULT_SERVICE_RESET_RUN_DURATION);
398 SERVICE_RESTART_DURATION_FACTOR = mParser.getInt(KEY_SERVICE_RESTART_DURATION_FACTOR,
399 DEFAULT_SERVICE_RESTART_DURATION_FACTOR);
400 SERVICE_MIN_RESTART_TIME_BETWEEN = mParser.getLong(KEY_SERVICE_MIN_RESTART_TIME_BETWEEN,
401 DEFAULT_SERVICE_MIN_RESTART_TIME_BETWEEN);
402 MAX_SERVICE_INACTIVITY = mParser.getLong(KEY_MAX_SERVICE_INACTIVITY,
403 DEFAULT_MAX_SERVICE_INACTIVITY);
404 BG_START_TIMEOUT = mParser.getLong(KEY_BG_START_TIMEOUT,
405 DEFAULT_BG_START_TIMEOUT);
Michal Karpinskie069b002019-03-07 16:15:14 +0000406 SERVICE_BG_ACTIVITY_START_TIMEOUT = mParser.getLong(
407 KEY_SERVICE_BG_ACTIVITY_START_TIMEOUT,
408 DEFAULT_SERVICE_BG_ACTIVITY_START_TIMEOUT);
Amith Yamasanib0c8a882017-08-28 09:36:42 -0700409 BOUND_SERVICE_CRASH_RESTART_DURATION = mParser.getLong(
410 KEY_BOUND_SERVICE_CRASH_RESTART_DURATION,
411 DEFAULT_BOUND_SERVICE_CRASH_RESTART_DURATION);
412 BOUND_SERVICE_MAX_CRASH_RETRY = mParser.getInt(KEY_BOUND_SERVICE_CRASH_MAX_RETRY,
413 DEFAULT_BOUND_SERVICE_CRASH_MAX_RETRY);
Sudheer Shankaf6690102017-10-16 10:20:32 -0700414 FLAG_PROCESS_START_ASYNC = mParser.getBoolean(KEY_PROCESS_START_ASYNC,
415 DEFAULT_PROCESS_START_ASYNC);
Dianne Hackborn8c76d912018-08-23 15:20:05 -0700416 MEMORY_INFO_THROTTLE_TIME = mParser.getLong(KEY_MEMORY_INFO_THROTTLE_TIME,
417 DEFAULT_MEMORY_INFO_THROTTLE_TIME);
Amith Yamasanie5bfeee2018-09-05 18:52:35 -0700418 TOP_TO_FGS_GRACE_DURATION = mParser.getDurationMillis(KEY_TOP_TO_FGS_GRACE_DURATION,
419 DEFAULT_TOP_TO_FGS_GRACE_DURATION);
Ben Murdochc26a5a82019-01-16 10:05:58 +0000420
421 // For new flags that are intended for server-side experiments, please use the new
422 // DeviceConfig package.
Amith Yamasanib0c8a882017-08-28 09:36:42 -0700423
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800424 updateMaxCachedProcesses();
425 }
426 }
427
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100428 private void updateActivityStartsLoggingEnabled() {
429 mFlagActivityStartsLoggingEnabled = Settings.Global.getInt(mResolver,
Michal Karpinskib6394022019-02-26 11:24:34 +0000430 Settings.Global.ACTIVITY_STARTS_LOGGING_ENABLED, 1) == 1;
Michal Karpinski201bc0c2018-07-20 15:32:00 +0100431 }
432
Michal Karpinski8596ded2018-11-14 14:43:48 +0000433 private void updateBackgroundActivityStartsEnabled() {
434 mFlagBackgroundActivityStartsEnabled = Settings.Global.getInt(mResolver,
435 Settings.Global.BACKGROUND_ACTIVITY_STARTS_ENABLED, 1) == 1;
436 }
437
Michal Karpinski666631b2019-02-26 16:59:11 +0000438 private void updateBackgroundActivityStartsPackageNamesWhitelist() {
439 final String setting = Settings.Global.getString(mResolver,
440 Settings.Global.BACKGROUND_ACTIVITY_STARTS_PACKAGE_NAMES_WHITELIST);
441 if (TextUtils.isEmpty(setting)) {
442 return;
443 }
444 ArraySet<String> newSet = new ArraySet<>();
445 SimpleStringSplitter splitter = new SimpleStringSplitter(':');
446 splitter.setString(setting);
447 while (splitter.hasNext()) {
448 newSet.add(splitter.next());
449 }
450 mPackageNamesWhitelistedForBgActivityStarts = newSet;
451 }
452
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800453 private void updateMaxCachedProcesses() {
Ben Murdochc26a5a82019-01-16 10:05:58 +0000454 String maxCachedProcessesFlag = DeviceConfig.getProperty(
Matt Pape40074da2019-02-12 13:53:26 -0800455 DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_MAX_CACHED_PROCESSES);
Ben Murdochc26a5a82019-01-16 10:05:58 +0000456 try {
457 CUR_MAX_CACHED_PROCESSES = mOverrideMaxCachedProcesses < 0
458 ? (TextUtils.isEmpty(maxCachedProcessesFlag)
459 ? DEFAULT_MAX_CACHED_PROCESSES : Integer.parseInt(maxCachedProcessesFlag))
460 : mOverrideMaxCachedProcesses;
461 } catch (NumberFormatException e) {
462 // Bad flag value from Phenotype, revert to default.
463 Slog.e("ActivityManagerConstants",
464 "Unable to parse flag for max_cached_processes: " + maxCachedProcessesFlag, e);
465 CUR_MAX_CACHED_PROCESSES = DEFAULT_MAX_CACHED_PROCESSES;
466 }
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800467 CUR_MAX_EMPTY_PROCESSES = computeEmptyProcessLimit(CUR_MAX_CACHED_PROCESSES);
468
469 // Note the trim levels do NOT depend on the override process limit, we want
470 // to consider the same level the point where we do trimming regardless of any
471 // additional enforced limit.
472 final int rawMaxEmptyProcesses = computeEmptyProcessLimit(MAX_CACHED_PROCESSES);
473 CUR_TRIM_EMPTY_PROCESSES = rawMaxEmptyProcesses/2;
474 CUR_TRIM_CACHED_PROCESSES = (MAX_CACHED_PROCESSES-rawMaxEmptyProcesses)/3;
475 }
476
477 void dump(PrintWriter pw) {
478 pw.println("ACTIVITY MANAGER SETTINGS (dumpsys activity settings) "
479 + Settings.Global.ACTIVITY_MANAGER_CONSTANTS + ":");
480
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800481 pw.print(" "); pw.print(KEY_MAX_CACHED_PROCESSES); pw.print("=");
482 pw.println(MAX_CACHED_PROCESSES);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700483 pw.print(" "); pw.print(KEY_BACKGROUND_SETTLE_TIME); pw.print("=");
484 pw.println(BACKGROUND_SETTLE_TIME);
Dianne Hackborncb015632017-06-14 17:30:15 -0700485 pw.print(" "); pw.print(KEY_FGSERVICE_MIN_SHOWN_TIME); pw.print("=");
486 pw.println(FGSERVICE_MIN_SHOWN_TIME);
487 pw.print(" "); pw.print(KEY_FGSERVICE_MIN_REPORT_TIME); pw.print("=");
488 pw.println(FGSERVICE_MIN_REPORT_TIME);
489 pw.print(" "); pw.print(KEY_FGSERVICE_SCREEN_ON_BEFORE_TIME); pw.print("=");
490 pw.println(FGSERVICE_SCREEN_ON_BEFORE_TIME);
491 pw.print(" "); pw.print(KEY_FGSERVICE_SCREEN_ON_AFTER_TIME); pw.print("=");
492 pw.println(FGSERVICE_SCREEN_ON_AFTER_TIME);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700493 pw.print(" "); pw.print(KEY_CONTENT_PROVIDER_RETAIN_TIME); pw.print("=");
494 pw.println(CONTENT_PROVIDER_RETAIN_TIME);
495 pw.print(" "); pw.print(KEY_GC_TIMEOUT); pw.print("=");
496 pw.println(GC_TIMEOUT);
497 pw.print(" "); pw.print(KEY_GC_MIN_INTERVAL); pw.print("=");
498 pw.println(GC_MIN_INTERVAL);
499 pw.print(" "); pw.print(KEY_FULL_PSS_MIN_INTERVAL); pw.print("=");
500 pw.println(FULL_PSS_MIN_INTERVAL);
501 pw.print(" "); pw.print(KEY_FULL_PSS_LOWERED_INTERVAL); pw.print("=");
502 pw.println(FULL_PSS_LOWERED_INTERVAL);
Dianne Hackbornffca58b2017-05-24 16:15:45 -0700503 pw.print(" "); pw.print(KEY_POWER_CHECK_INTERVAL); pw.print("=");
504 pw.println(POWER_CHECK_INTERVAL);
505 pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_1); pw.print("=");
506 pw.println(POWER_CHECK_MAX_CPU_1);
507 pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_2); pw.print("=");
508 pw.println(POWER_CHECK_MAX_CPU_2);
509 pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_3); pw.print("=");
510 pw.println(POWER_CHECK_MAX_CPU_3);
511 pw.print(" "); pw.print(KEY_POWER_CHECK_MAX_CPU_4); pw.print("=");
512 pw.println(POWER_CHECK_MAX_CPU_4);
Dianne Hackborn83b40f62017-04-26 13:59:47 -0700513 pw.print(" "); pw.print(KEY_SERVICE_USAGE_INTERACTION_TIME); pw.print("=");
514 pw.println(SERVICE_USAGE_INTERACTION_TIME);
515 pw.print(" "); pw.print(KEY_USAGE_STATS_INTERACTION_INTERVAL); pw.print("=");
516 pw.println(USAGE_STATS_INTERACTION_INTERVAL);
517 pw.print(" "); pw.print(KEY_SERVICE_RESTART_DURATION); pw.print("=");
518 pw.println(SERVICE_RESTART_DURATION);
519 pw.print(" "); pw.print(KEY_SERVICE_RESET_RUN_DURATION); pw.print("=");
520 pw.println(SERVICE_RESET_RUN_DURATION);
521 pw.print(" "); pw.print(KEY_SERVICE_RESTART_DURATION_FACTOR); pw.print("=");
522 pw.println(SERVICE_RESTART_DURATION_FACTOR);
523 pw.print(" "); pw.print(KEY_SERVICE_MIN_RESTART_TIME_BETWEEN); pw.print("=");
524 pw.println(SERVICE_MIN_RESTART_TIME_BETWEEN);
525 pw.print(" "); pw.print(KEY_MAX_SERVICE_INACTIVITY); pw.print("=");
526 pw.println(MAX_SERVICE_INACTIVITY);
527 pw.print(" "); pw.print(KEY_BG_START_TIMEOUT); pw.print("=");
528 pw.println(BG_START_TIMEOUT);
Michal Karpinskie069b002019-03-07 16:15:14 +0000529 pw.print(" "); pw.print(KEY_SERVICE_BG_ACTIVITY_START_TIMEOUT); pw.print("=");
530 pw.println(SERVICE_BG_ACTIVITY_START_TIMEOUT);
Dianne Hackborn8c76d912018-08-23 15:20:05 -0700531 pw.print(" "); pw.print(KEY_BOUND_SERVICE_CRASH_RESTART_DURATION); pw.print("=");
532 pw.println(BOUND_SERVICE_CRASH_RESTART_DURATION);
533 pw.print(" "); pw.print(KEY_BOUND_SERVICE_CRASH_MAX_RETRY); pw.print("=");
534 pw.println(BOUND_SERVICE_MAX_CRASH_RETRY);
535 pw.print(" "); pw.print(KEY_PROCESS_START_ASYNC); pw.print("=");
536 pw.println(FLAG_PROCESS_START_ASYNC);
537 pw.print(" "); pw.print(KEY_MEMORY_INFO_THROTTLE_TIME); pw.print("=");
538 pw.println(MEMORY_INFO_THROTTLE_TIME);
Amith Yamasanie5bfeee2018-09-05 18:52:35 -0700539 pw.print(" "); pw.print(KEY_TOP_TO_FGS_GRACE_DURATION); pw.print("=");
540 pw.println(TOP_TO_FGS_GRACE_DURATION);
Dianne Hackborn0ef403e2017-01-24 18:22:15 -0800541
542 pw.println();
543 if (mOverrideMaxCachedProcesses >= 0) {
544 pw.print(" mOverrideMaxCachedProcesses="); pw.println(mOverrideMaxCachedProcesses);
545 }
546 pw.print(" CUR_MAX_CACHED_PROCESSES="); pw.println(CUR_MAX_CACHED_PROCESSES);
547 pw.print(" CUR_MAX_EMPTY_PROCESSES="); pw.println(CUR_MAX_EMPTY_PROCESSES);
548 pw.print(" CUR_TRIM_EMPTY_PROCESSES="); pw.println(CUR_TRIM_EMPTY_PROCESSES);
549 pw.print(" CUR_TRIM_CACHED_PROCESSES="); pw.println(CUR_TRIM_CACHED_PROCESSES);
550 }
551}