17d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/* 27d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Copyright (C) 2011 The Android Open Source Project 37d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * 47d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 57d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * you may not use this file except in compliance with the License. 67d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * You may obtain a copy of the License at 77d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * 87d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 97d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * 107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Unless required by applicable law or agreed to in writing, software 117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * See the License for the specific language governing permissions and 147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * limitations under the License. 157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */ 167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornpackage com.android.server.am; 187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport java.io.IOException; 20bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.io.OutputStream; 21bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.nio.ByteBuffer; 227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackbornimport android.app.ActivityManager; 249d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackbornimport android.os.Build; 25ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackbornimport android.os.SystemClock; 267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.internal.util.MemInfoReader; 277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.server.wm.WindowManagerService; 287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 29fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Crossimport android.content.res.Resources; 307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.graphics.Point; 3159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Crossimport android.os.SystemProperties; 32bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocketAddress; 33bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocket; 347d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.util.Slog; 3559c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display; 367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/** 387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Activity manager code dealing with processes. 397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */ 40be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornfinal class ProcessList { 417d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The minimum time we allow between crashes, for us to consider this 427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // application to be bad and stop and its services and reject broadcasts. 437d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int MIN_CRASH_INTERVAL = 60*1000; 447d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 457d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // OOM adjustments for processes in various states: 467d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 47c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // Adjustment used in certain places where we don't know it yet. 48c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // (Generally this is something that is going to be cached, but we 49c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // don't know the exact value in the cached range to assign yet.) 50c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn static final int UNKNOWN_ADJ = 16; 51c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn 527d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are not visible, 53e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // so it can be killed without any disruption. 54be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn static final int CACHED_APP_MAX_ADJ = 15; 5520cdcee47d10986969e7e2a53a40a6ecabae3827Dianne Hackborn static final int CACHED_APP_MIN_ADJ = 9; 56e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn 57e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // The B list of SERVICE_ADJ -- these are the old and decrepit 58e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // services that aren't as shiny and interesting as the ones in the A list. 59f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn static final int SERVICE_B_ADJ = 8; 60f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn 61f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This is the process of the previous application that the user was in. 62f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This process is kept above other things, because it is very common to 63f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // switch back to the previous app. This is important both for recent 64f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // task switch (toggling between the two top recent apps) as well as normal 65f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // UI flow such as clicking on a URI in the e-mail app to view in the browser, 66f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // and then pressing back to return to e-mail. 67f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn static final int PREVIOUS_APP_ADJ = 7; 687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 697d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process holding the home application -- we want to try 707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // avoiding killing it, even if it would normally be in the background, 717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // because the user interacts with it so much. 727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int HOME_APP_ADJ = 6; 737d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 74e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a process holding an application service -- killing it will not 75e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // have much of an impact as far as the user is concerned. 76e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn static final int SERVICE_ADJ = 5; 777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process with a heavy-weight application. It is in the 797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // background, but we want to try to avoid killing it. Value set in 807d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // system/rootdir/init.rc on startup. 81c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn static final int HEAVY_WEIGHT_APP_ADJ = 4; 82c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn 83c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // This is a process currently hosting a backup operation. Killing it 84c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // is not entirely fatal but is generally a bad idea. 85c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn static final int BACKUP_APP_ADJ = 3; 867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting components that are perceptible to the 887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // user, and we really want to avoid killing them, but they are not 89e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // immediately visible. An example is background music playback. 907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int PERCEPTIBLE_APP_ADJ = 2; 917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 927d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are visible to the 93e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // user, so we'd prefer they don't disappear. 947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int VISIBLE_APP_ADJ = 1; 957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is the process running the current foreground app. We'd really 97e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // rather not kill it! 987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int FOREGROUND_APP_ADJ = 0; 997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 100ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn // This is a process that the system or a persistent process has bound to, 101ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn // and indicated it is important. 102ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn static final int PERSISTENT_SERVICE_ADJ = -11; 103ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn 104e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a system persistent process, such as telephony. Definitely 1057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // don't want to kill it, but doing so is not completely fatal. 106e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn static final int PERSISTENT_PROC_ADJ = -12; 1077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The system process runs at the default adjustment. 1097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int SYSTEM_ADJ = -16; 1107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1118e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn // Special code for native processes that are not being managed by the system (so 1128e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn // don't have an oom adj assigned by the system). 1138e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn static final int NATIVE_ADJ = -17; 1148e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 1157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Memory pages are 4K. 1167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int PAGE_SIZE = 4*1024; 1177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 118be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // The minimum number of cached apps we want to be able to keep around, 1197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // without empty apps being able to push them out of memory. 120be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn static final int MIN_CACHED_APPS = 2; 1217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1222286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // The maximum number of cached processes we will keep around before killing them. 1232286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // NOTE: this constant is *only* a control to not let us go too crazy with 1242286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // keeping around processes on devices with large amounts of RAM. For devices that 1252286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // are tighter on RAM, the out of memory killer is responsible for killing background 1262286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // processes as RAM is needed, and we should *never* be relying on this limit to 1272286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // kill them. Also note that this limit only applies to cached background processes; 1282286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // we have no limit on the number of service, visible, foreground, or other such 1292286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // processes and the number of those processes does not count against the cached 1302286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // process limit. 131465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn static final int MAX_CACHED_APPS = 32; 132b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 133b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // We allow empty processes to stick around for at most 30 minutes. 134b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final long MAX_EMPTY_TIME = 30*60*1000; 135b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 1362286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // The maximum number of empty app processes we will let sit around. 1372286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn private static final int MAX_EMPTY_APPS = computeEmptyProcessLimit(MAX_CACHED_APPS); 138b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 139b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // The number of empty apps at which we don't consider it necessary to do 140b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // memory trimming. 1412286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn static final int TRIM_EMPTY_APPS = MAX_EMPTY_APPS/2; 1422286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn 1432286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // The number of cached at which we don't consider it necessary to do 1442286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // memory trimming. 145465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn static final int TRIM_CACHED_APPS = (MAX_CACHED_APPS-MAX_EMPTY_APPS)/3; 146b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 147be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // Threshold of number of cached+empty where we consider memory critical. 148b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_CRITICAL_THRESHOLD = 3; 149b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 150be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // Threshold of number of cached+empty where we consider memory critical. 151b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_LOW_THRESHOLD = 5; 1527d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 153bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // Low Memory Killer Daemon command codes. 154bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // These must be kept in sync with the definitions in lmkd.c 155bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // 156bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_TARGET <minfree> <minkillprio> ... (up to 6 pairs) 157bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_PROCPRIO <pid> <prio> 158bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_PROCREMOVE <pid> 159bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_TARGET = 0; 160bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_PROCPRIO = 1; 161bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_PROCREMOVE = 2; 162bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 1637d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the various interesting memory levels that we will give to 1647d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // the OOM killer. Note that the OOM killer only supports 6 slots, so we 1657d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // can't give it a different value for every possible kind of process. 1667d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final int[] mOomAdj = new int[] { 1677d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ, 168be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn BACKUP_APP_ADJ, CACHED_APP_MIN_ADJ, CACHED_APP_MAX_ADJ 1697d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the low-end OOM level limits. This is appropriate for an 1717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HVGA or smaller phone with less than 512MB. Values are in KB. 172bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFreeLow = new int[] { 1733f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn 12288, 18432, 24576, 1743f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn 36864, 43008, 49152 1757d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the high-end OOM level limits. This is appropriate for a 1777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 1280x800 or larger screen with around 1GB RAM. Values are in KB. 178bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFreeHigh = new int[] { 1793f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn 73728, 92160, 110592, 180824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn 129024, 147456, 184320 1817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1827d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The actual OOM killer memory levels we are using. 183bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFree = new int[mOomAdj.length]; 1847d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final long mTotalMemMb; 1867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private long mCachedRestoreLevel; 1883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 1897d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private boolean mHaveDisplaySize; 1907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 191bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static LocalSocket sLmkdSocket; 192bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static OutputStream sLmkdOutputStream; 193bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 1947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn ProcessList() { 1957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn MemInfoReader minfo = new MemInfoReader(); 1967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn minfo.readMemInfo(); 1977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mTotalMemMb = minfo.getTotalSize()/(1024*1024); 1987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(0, 0, false); 1997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn void applyDisplaySize(WindowManagerService wm) { 2027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (!mHaveDisplaySize) { 2037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn Point p = new Point(); 204637dbfcaf0a1f43f81d3d195461b50bfc0fd5f14Colin Cross wm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, p); 2057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (p.x != 0 && p.y != 0) { 2067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(p.x, p.y, true); 2077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mHaveDisplaySize = true; 2087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private void updateOomLevels(int displayWidth, int displayHeight, boolean write) { 2137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from avail memory: at 300MB we use the lowest values to 2147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 700MB or more for the top values. 215824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn float scaleMem = ((float)(mTotalMemMb-350))/(700-350); 2167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from screen size. 218635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minSize = 480*800; // 384000 2197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn int maxSize = 1280*800; // 1024000 230400 870400 .264 2207d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scaleDisp = ((float)(displayWidth*displayHeight)-minSize)/(maxSize-minSize); 221635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn if (false) { 222635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "scaleMem=" + scaleMem); 223635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "scaleDisp=" + scaleDisp + " dw=" + displayWidth 224635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn + " dh=" + displayHeight); 225635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn } 2267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scale = scaleMem > scaleDisp ? scaleMem : scaleDisp; 2287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (scale < 0) scale = 0; 2297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn else if (scale > 1) scale = 1; 230635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minfree_adj = Resources.getSystem().getInteger( 231635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAdjust); 232635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minfree_abs = Resources.getSystem().getInteger( 233635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAbsolute); 234635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn if (false) { 235635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "minfree_adj=" + minfree_adj + " minfree_abs=" + minfree_abs); 236635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn } 237fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 238c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn final boolean is64bit = Build.SUPPORTED_64_BIT_ABIS.length > 0; 2399d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn 2407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 241bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor int low = mOomMinFreeLow[i]; 242bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor int high = mOomMinFreeHigh[i]; 243c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn if (is64bit) { 244c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn // Increase the high min-free levels for cached processes for 64-bit 245c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn if (i == 4) high = (high*3)/2; 246c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn else if (i == 5) high = (high*7)/4; 247c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn } 248bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor mOomMinFree[i] = (int)(low + ((high-low)*scale)); 249fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 250fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 251fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (minfree_abs >= 0) { 252fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross for (int i=0; i<mOomAdj.length; i++) { 2539d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn mOomMinFree[i] = (int)((float)minfree_abs * mOomMinFree[i] 2549d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn / mOomMinFree[mOomAdj.length - 1]); 255fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 256fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 2577d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 258fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (minfree_adj != 0) { 259fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross for (int i=0; i<mOomAdj.length; i++) { 2609d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn mOomMinFree[i] += (int)((float)minfree_adj * mOomMinFree[i] 2619d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn / mOomMinFree[mOomAdj.length - 1]); 262fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (mOomMinFree[i] < 0) { 263fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross mOomMinFree[i] = 0; 264fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 265fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 266fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 267fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 2683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // The maximum size we will restore a process from cached to background, when under 2693bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // memory duress, is 1/3 the size we have reserved for kernel caches and other overhead 2703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // before killing background processes. 2713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mCachedRestoreLevel = (getMemLevel(ProcessList.CACHED_APP_MAX_ADJ)/1024) / 3; 2723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 27359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross // Ask the kernel to try to keep enough memory free to allocate 3 full 27459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross // screen 32bpp buffers without entering direct reclaim. 27559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve = displayWidth * displayHeight * 4 * 3 / 1024; 27659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve_adj = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAdjust); 27759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve_abs = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAbsolute); 27859d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 27959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve_abs >= 0) { 28059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve = reserve_abs; 28159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 28259d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 28359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve_adj != 0) { 28459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve += reserve_adj; 28559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve < 0) { 28659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve = 0; 28759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 28859d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 28959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 2907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (write) { 291bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor ByteBuffer buf = ByteBuffer.allocate(4 * (2*mOomAdj.length + 1)); 292bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_TARGET); 293bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor for (int i=0; i<mOomAdj.length; i++) { 294bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt((mOomMinFree[i]*1024)/PAGE_SIZE); 295bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(mOomAdj[i]); 296bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 297bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 298bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 29959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross SystemProperties.set("sys.sysctl.extra_free_kbytes", Integer.toString(reserve)); 3007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 3017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // GB: 2048,3072,4096,6144,7168,8192 3027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HC: 8192,10240,12288,14336,16384,20480 3037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 3047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 3052286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn public static int computeEmptyProcessLimit(int totalProcessLimit) { 306465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn return totalProcessLimit/2; 3072286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn } 3082286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn 3098e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn private static String buildOomTag(String prefix, String space, int val, int base) { 3108e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (val == base) { 3118e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (space == null) return prefix; 3128e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return prefix + " "; 3138e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3148e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return prefix + "+" + Integer.toString(val-base); 3158e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3168e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 3178e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn public static String makeOomAdjString(int setAdj) { 3188e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { 3198e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("cch", " ", setAdj, ProcessList.CACHED_APP_MIN_ADJ); 3208e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SERVICE_B_ADJ) { 3218e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("svcb ", null, setAdj, ProcessList.SERVICE_B_ADJ); 3228e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PREVIOUS_APP_ADJ) { 3238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("prev ", null, setAdj, ProcessList.PREVIOUS_APP_ADJ); 3248e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.HOME_APP_ADJ) { 3258e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("home ", null, setAdj, ProcessList.HOME_APP_ADJ); 3268e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SERVICE_ADJ) { 3278e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("svc ", null, setAdj, ProcessList.SERVICE_ADJ); 3288e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.HEAVY_WEIGHT_APP_ADJ) { 3298e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("hvy ", null, setAdj, ProcessList.HEAVY_WEIGHT_APP_ADJ); 3308e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.BACKUP_APP_ADJ) { 3318e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("bkup ", null, setAdj, ProcessList.BACKUP_APP_ADJ); 3328e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) { 3338e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("prcp ", null, setAdj, ProcessList.PERCEPTIBLE_APP_ADJ); 3348e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.VISIBLE_APP_ADJ) { 3358e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("vis ", null, setAdj, ProcessList.VISIBLE_APP_ADJ); 3368e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.FOREGROUND_APP_ADJ) { 3378e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("fore ", null, setAdj, ProcessList.FOREGROUND_APP_ADJ); 338ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn } else if (setAdj >= ProcessList.PERSISTENT_SERVICE_ADJ) { 339ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn return buildOomTag("psvc ", null, setAdj, ProcessList.PERSISTENT_SERVICE_ADJ); 3408e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PERSISTENT_PROC_ADJ) { 3418e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("pers ", null, setAdj, ProcessList.PERSISTENT_PROC_ADJ); 3428e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SYSTEM_ADJ) { 3438e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("sys ", null, setAdj, ProcessList.SYSTEM_ADJ); 3448e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.NATIVE_ADJ) { 3458e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("ntv ", null, setAdj, ProcessList.NATIVE_ADJ); 3468e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else { 3478e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return Integer.toString(setAdj); 3488e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3498e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3508e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 3513bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn public static String makeProcStateString(int curProcState) { 3523bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn String procState; 3533bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn switch (curProcState) { 3543bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case -1: 3553bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "N "; 3563bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3573bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_PERSISTENT: 3583bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "P "; 3593bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3603bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_PERSISTENT_UI: 3613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "PU"; 3623bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3633bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_TOP: 3643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "T "; 3653bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND: 3673bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "IF"; 3683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3693bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND: 3703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "IB"; 3713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_BACKUP: 3733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "BU"; 3743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT: 3763bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "HW"; 3773bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_SERVICE: 3793bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "S "; 3803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3813bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_RECEIVER: 3823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "R "; 3833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_HOME: 3853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "HO"; 3863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_LAST_ACTIVITY: 3883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "LA"; 3893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY: 3913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "CA"; 3923bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: 3943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "Ca"; 3953bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3963bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_EMPTY: 3973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "CE"; 3983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn default: 4003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "??"; 4013bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 4023bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return procState; 4043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4053bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 4063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn public static void appendRamKb(StringBuilder sb, long ramKb) { 4073bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn for (int j=0, fact=10; j<6; j++, fact*=10) { 4083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (ramKb < fact) { 4093bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn sb.append(' '); 4103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4113bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn sb.append(ramKb); 4133bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 415ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn // How long after a state change that it is safe to collect PSS without it being dirty. 416ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn public static final int PSS_SAFE_TIME_FROM_STATE_CHANGE = 1000; 417ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn 418ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn // The minimum time interval after a state change it is safe to collect PSS. 419f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_MIN_TIME_FROM_STATE_CHANGE = 15*1000; 420f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 421f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The maximum amount of time we want to go between PSS collections. 422f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_MAX_INTERVAL = 30*60*1000; 423f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 424f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The minimum amount of time between successive PSS requests for *all* processes. 425f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_ALL_INTERVAL = 10*60*1000; 426f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 427f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The minimum amount of time between successive PSS requests for a process. 428f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SHORT_INTERVAL = 2*60*1000; 429f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 430f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a process first becomes top. 4313bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_TOP_INTERVAL = 10*1000; 4323bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 4333bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // The amount of time until PSS when a process first goes into the background. 4343bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_BACKGROUND_INTERVAL = 20*1000; 435f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 436f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a process first becomes cached. 4373bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_CACHED_INTERVAL = 30*1000; 438f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 439f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when an important process stays in the same state. 440f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SAME_IMPORTANT_INTERVAL = 15*60*1000; 441f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 442f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a service process stays in the same state. 443f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SAME_SERVICE_INTERVAL = 20*60*1000; 444f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 445f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a cached process stays in the same state. 446f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SAME_CACHED_INTERVAL = 30*60*1000; 447f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 448ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn // The minimum time interval after a state change it is safe to collect PSS. 449ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn public static final int PSS_TEST_MIN_TIME_FROM_STATE_CHANGE = 10*1000; 450ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn 4511a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when a process first becomes top. 4521a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_FIRST_TOP_INTERVAL = 3*1000; 4531a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 4541a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when a process first goes into the background. 4551a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_FIRST_BACKGROUND_INTERVAL = 5*1000; 4561a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 4571a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when an important process stays in same state. 4581a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_SAME_IMPORTANT_INTERVAL = 10*1000; 4591a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 4601a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when a background process stays in same state. 4611a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_SAME_BACKGROUND_INTERVAL = 15*1000; 4621a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 463f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_PERSISTENT = 0; 464f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_TOP = 1; 465f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_IMPORTANT = 2; 466f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_SERVICE = 3; 467f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_CACHED = 4; 468f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 469f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int[] sProcStateToProcMem = new int[] { 470f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT 471f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 472f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_TOP, // ActivityManager.PROCESS_STATE_TOP 473f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 474f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 475f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_BACKUP 476f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 477f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE 478f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_RECEIVER 479f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_HOME 480f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 481f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 482f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 483f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 484f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 485f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 486f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final long[] sFirstAwakePssTimes = new long[] { 487f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SHORT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 488f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SHORT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 489f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_TOP_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 4903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 4913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 4923bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 4933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 4943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 4953bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 496f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 497f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 498f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 499f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 500f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 501f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 502f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 503f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final long[] sSameAwakePssTimes = new long[] { 504f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 505f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 506f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SHORT_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 507f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 508f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 509f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 510f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 511f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_SERVICE_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 512f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_SERVICE_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 513f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 514f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 515f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 516f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 517f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 518f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 519f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 5201a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final long[] sTestFirstAwakePssTimes = new long[] { 5211a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_TOP_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 5221a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_TOP_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 5231a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_TOP_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 5241a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 5251a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 5261a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 5271a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 5281a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 5291a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 5301a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 5311a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 5321a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 5331a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 5341a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 5351a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn }; 5361a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 5371a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final long[] sTestSameAwakePssTimes = new long[] { 5381a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 5391a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 5401a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 5411a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 5421a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 5431a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 5441a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 5451a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 5461a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 5471a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 5481a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 5491a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 5501a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 5511a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 5521a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn }; 5531a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 554f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static boolean procStatesDifferForMem(int procState1, int procState2) { 555f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn return sProcStateToProcMem[procState1] != sProcStateToProcMem[procState2]; 556f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 557f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 558ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn public static long minTimeFromStateChange(boolean test) { 559ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn return test ? PSS_TEST_MIN_TIME_FROM_STATE_CHANGE : PSS_MIN_TIME_FROM_STATE_CHANGE; 560ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn } 561ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn 5621a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn public static long computeNextPssTime(int procState, boolean first, boolean test, 5631a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn boolean sleeping, long now) { 5641a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn final long[] table = test 565f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn ? (first 5661a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn ? sTestFirstAwakePssTimes 5671a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn : sTestSameAwakePssTimes) 568f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn : (first 569f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn ? sFirstAwakePssTimes 570f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn : sSameAwakePssTimes); 571f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn return now + table[procState]; 572f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 573f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 5747d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn long getMemLevel(int adjustment) { 5757d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 5767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (adjustment <= mOomAdj[i]) { 5777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[i] * 1024; 5787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 5797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 5807d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[mOomAdj.length-1] * 1024; 5817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 5827d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 583bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor /** 5843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn * Return the maximum pss size in kb that we consider a process acceptable to 5853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn * restore from its cached state for running in the background when RAM is low. 5863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn */ 587cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn long getCachedRestoreThresholdKb() { 5883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return mCachedRestoreLevel; 5893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 5903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 5919bef5b67dc48568e6f8be065dd7016f04058351cDianne Hackborn /** 592bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * Set the out-of-memory badness adjustment for a process. 593bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * 594bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * @param pid The process identifier to set. 595d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross * @param uid The uid of the app 596bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * @param amt Adjustment value -- lmkd allows -16 to +15. 597bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * 598bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * {@hide} 599bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor */ 600d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross public static final void setOomAdj(int pid, int uid, int amt) { 601bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (amt == UNKNOWN_ADJ) 602bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return; 603bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 604ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn long start = SystemClock.elapsedRealtime(); 605d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross ByteBuffer buf = ByteBuffer.allocate(4 * 4); 606bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_PROCPRIO); 607bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(pid); 608d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross buf.putInt(uid); 609bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(amt); 610bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 611ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn long now = SystemClock.elapsedRealtime(); 612ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn if ((now-start) > 250) { 613ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn Slog.w("ActivityManager", "SLOW OOM ADJ: " + (now-start) + "ms for pid " + pid 614ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn + " = " + amt); 615ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn } 616bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 617bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 618bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor /* 619bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * {@hide} 620bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor */ 621bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor public static final void remove(int pid) { 622bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor ByteBuffer buf = ByteBuffer.allocate(4 * 2); 623bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_PROCREMOVE); 624bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(pid); 625bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 626bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 627bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 628bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static boolean openLmkdSocket() { 6297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 630bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = new LocalSocket(LocalSocket.SOCKET_SEQPACKET); 631bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket.connect( 632bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor new LocalSocketAddress("lmkd", 633bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor LocalSocketAddress.Namespace.RESERVED)); 634bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdOutputStream = sLmkdSocket.getOutputStream(); 635bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex) { 636bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor Slog.w(ActivityManagerService.TAG, 637bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor "lowmemorykiller daemon socket open failed"); 638bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = null; 639bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return false; 640bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 641bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 642bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return true; 643bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 644bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 645bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static void writeLmkd(ByteBuffer buf) { 646bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 647bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor for (int i = 0; i < 3; i++) { 648bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (sLmkdSocket == null) { 649bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (openLmkdSocket() == false) { 650bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor try { 651bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor Thread.sleep(1000); 652bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (InterruptedException ie) { 653bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 654bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor continue; 655bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 656bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 657bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 658bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor try { 659bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdOutputStream.write(buf.array(), 0, buf.position()); 660bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return; 661bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex) { 662bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor Slog.w(ActivityManagerService.TAG, 663bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor "Error writing to lowmemorykiller socket"); 664bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 6657d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 666bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket.close(); 667bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex2) { 6687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 669bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 670bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = null; 6717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6737d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6747d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn} 675