ProcessList.java revision bad8d91056e59b77fde1b2d3cc0745137766a31a
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 19e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport static com.android.server.am.ActivityManagerDebugConfig.TAG_AM; 20e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME; 21e23149f1555303940d212b742707518b7f9f84abWale Ogunwale 227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport java.io.IOException; 23bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.io.OutputStream; 24bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.nio.ByteBuffer; 257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 268e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackbornimport android.app.ActivityManager; 279d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackbornimport android.os.Build; 28ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackbornimport android.os.SystemClock; 297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.internal.util.MemInfoReader; 307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.server.wm.WindowManagerService; 317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 32fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Crossimport android.content.res.Resources; 337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.graphics.Point; 3459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Crossimport android.os.SystemProperties; 35bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocketAddress; 36bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocket; 377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.util.Slog; 3859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display; 397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/** 417d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Activity manager code dealing with processes. 427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */ 43352dc57186ff796dbb7a095c609d1a0bae5d3fcaSudheer Shankapublic final class ProcessList { 44e23149f1555303940d212b742707518b7f9f84abWale Ogunwale private static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessList" : TAG_AM; 45e23149f1555303940d212b742707518b7f9f84abWale Ogunwale 467d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The minimum time we allow between crashes, for us to consider this 477d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // application to be bad and stop and its services and reject broadcasts. 487d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int MIN_CRASH_INTERVAL = 60*1000; 497d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 507d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // OOM adjustments for processes in various states: 517d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 52fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang // Uninitialized value for any major or minor adj fields 53fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int INVALID_ADJ = -10000; 54fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang 55c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // Adjustment used in certain places where we don't know it yet. 56c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // (Generally this is something that is going to be cached, but we 57c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // don't know the exact value in the cached range to assign yet.) 58fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int UNKNOWN_ADJ = 1001; 59c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn 607d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are not visible, 61e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // so it can be killed without any disruption. 62fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int CACHED_APP_MAX_ADJ = 906; 63fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int CACHED_APP_MIN_ADJ = 900; 64e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn 65e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // The B list of SERVICE_ADJ -- these are the old and decrepit 66e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // services that aren't as shiny and interesting as the ones in the A list. 67fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int SERVICE_B_ADJ = 800; 68f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn 69f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This is the process of the previous application that the user was in. 70f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This process is kept above other things, because it is very common to 71f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // switch back to the previous app. This is important both for recent 72f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // task switch (toggling between the two top recent apps) as well as normal 73f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // UI flow such as clicking on a URI in the e-mail app to view in the browser, 74f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // and then pressing back to return to e-mail. 75fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int PREVIOUS_APP_ADJ = 700; 767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process holding the home application -- we want to try 787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // avoiding killing it, even if it would normally be in the background, 797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // because the user interacts with it so much. 80fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int HOME_APP_ADJ = 600; 817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 82e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a process holding an application service -- killing it will not 83e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // have much of an impact as far as the user is concerned. 84fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int SERVICE_ADJ = 500; 857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process with a heavy-weight application. It is in the 877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // background, but we want to try to avoid killing it. Value set in 887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // system/rootdir/init.rc on startup. 89fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int HEAVY_WEIGHT_APP_ADJ = 400; 90c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn 91c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // This is a process currently hosting a backup operation. Killing it 92c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // is not entirely fatal but is generally a bad idea. 93fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int BACKUP_APP_ADJ = 300; 947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting components that are perceptible to the 967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // user, and we really want to avoid killing them, but they are not 97e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // immediately visible. An example is background music playback. 98fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int PERCEPTIBLE_APP_ADJ = 200; 997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are visible to the 101e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // user, so we'd prefer they don't disappear. 102fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int VISIBLE_APP_ADJ = 100; 103fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int VISIBLE_APP_LAYER_MAX = PERCEPTIBLE_APP_ADJ - VISIBLE_APP_ADJ - 1; 1047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is the process running the current foreground app. We'd really 106e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // rather not kill it! 1077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int FOREGROUND_APP_ADJ = 0; 1087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 109ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn // This is a process that the system or a persistent process has bound to, 110ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn // and indicated it is important. 111fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int PERSISTENT_SERVICE_ADJ = -700; 112ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn 113e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a system persistent process, such as telephony. Definitely 1147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // don't want to kill it, but doing so is not completely fatal. 115fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int PERSISTENT_PROC_ADJ = -800; 1167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The system process runs at the default adjustment. 118fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int SYSTEM_ADJ = -900; 1197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1208e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn // Special code for native processes that are not being managed by the system (so 1218e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn // don't have an oom adj assigned by the system). 122fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int NATIVE_ADJ = -1000; 1238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 1247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Memory pages are 4K. 1257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int PAGE_SIZE = 4*1024; 1267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 127a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn // Activity manager's version of Process.THREAD_GROUP_BG_NONINTERACTIVE 128a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn static final int SCHED_GROUP_BACKGROUND = 0; 129a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn // Activity manager's version of Process.THREAD_GROUP_DEFAULT 130a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn static final int SCHED_GROUP_DEFAULT = 1; 131a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn // Activity manager's version of Process.THREAD_GROUP_TOP_APP 132a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn static final int SCHED_GROUP_TOP_APP = 2; 13333eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray // Activity manager's version of Process.THREAD_GROUP_TOP_APP 13433eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray // Disambiguate between actual top app and processes bound to the top app 13533eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray static final int SCHED_GROUP_TOP_APP_BOUND = 3; 136a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn 137be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // The minimum number of cached apps we want to be able to keep around, 1387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // without empty apps being able to push them out of memory. 139be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn static final int MIN_CACHED_APPS = 2; 1407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 141b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // We allow empty processes to stick around for at most 30 minutes. 142b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final long MAX_EMPTY_TIME = 30*60*1000; 143b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 144be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // Threshold of number of cached+empty where we consider memory critical. 145b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_CRITICAL_THRESHOLD = 3; 146b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 147be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // Threshold of number of cached+empty where we consider memory critical. 148b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_LOW_THRESHOLD = 5; 1497d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 150bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // Low Memory Killer Daemon command codes. 151bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // These must be kept in sync with the definitions in lmkd.c 152bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // 153bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_TARGET <minfree> <minkillprio> ... (up to 6 pairs) 154fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang // LMK_PROCPRIO <pid> <uid> <prio> 155bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_PROCREMOVE <pid> 156bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_TARGET = 0; 157bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_PROCPRIO = 1; 158bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_PROCREMOVE = 2; 159bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 1607d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the various interesting memory levels that we will give to 1617d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // the OOM killer. Note that the OOM killer only supports 6 slots, so we 1627d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // can't give it a different value for every possible kind of process. 1637d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final int[] mOomAdj = new int[] { 1647d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ, 165be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn BACKUP_APP_ADJ, CACHED_APP_MIN_ADJ, CACHED_APP_MAX_ADJ 1667d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1677d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the low-end OOM level limits. This is appropriate for an 1687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HVGA or smaller phone with less than 512MB. Values are in KB. 169bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFreeLow = new int[] { 1703f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn 12288, 18432, 24576, 1713f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn 36864, 43008, 49152 1727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1737d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the high-end OOM level limits. This is appropriate for a 1747d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 1280x800 or larger screen with around 1GB RAM. Values are in KB. 175bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFreeHigh = new int[] { 1763f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn 73728, 92160, 110592, 177824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn 129024, 147456, 184320 1787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The actual OOM killer memory levels we are using. 180bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFree = new int[mOomAdj.length]; 1817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1827d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final long mTotalMemMb; 1837d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private long mCachedRestoreLevel; 1853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 1867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private boolean mHaveDisplaySize; 1877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 188bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static LocalSocket sLmkdSocket; 189bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static OutputStream sLmkdOutputStream; 190bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 1917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn ProcessList() { 1927d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn MemInfoReader minfo = new MemInfoReader(); 1937d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn minfo.readMemInfo(); 1947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mTotalMemMb = minfo.getTotalSize()/(1024*1024); 1957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(0, 0, false); 1967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 1977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn void applyDisplaySize(WindowManagerService wm) { 1997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (!mHaveDisplaySize) { 2007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn Point p = new Point(); 2011e32e025ad5677ce4e3697ca026c2019fe0bd8e9Andrii Kulian // TODO(multi-display): Compute based on sum of all connected displays' resolutions. 202637dbfcaf0a1f43f81d3d195461b50bfc0fd5f14Colin Cross wm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, p); 2037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (p.x != 0 && p.y != 0) { 2047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(p.x, p.y, true); 2057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mHaveDisplaySize = true; 2067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private void updateOomLevels(int displayWidth, int displayHeight, boolean write) { 2117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from avail memory: at 300MB we use the lowest values to 2127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 700MB or more for the top values. 213824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn float scaleMem = ((float)(mTotalMemMb-350))/(700-350); 2147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from screen size. 216635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minSize = 480*800; // 384000 2177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn int maxSize = 1280*800; // 1024000 230400 870400 .264 2187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scaleDisp = ((float)(displayWidth*displayHeight)-minSize)/(maxSize-minSize); 219635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn if (false) { 220635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "scaleMem=" + scaleMem); 221635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "scaleDisp=" + scaleDisp + " dw=" + displayWidth 222635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn + " dh=" + displayHeight); 223635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn } 2247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scale = scaleMem > scaleDisp ? scaleMem : scaleDisp; 2267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (scale < 0) scale = 0; 2277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn else if (scale > 1) scale = 1; 228635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minfree_adj = Resources.getSystem().getInteger( 229635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAdjust); 230635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minfree_abs = Resources.getSystem().getInteger( 231635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAbsolute); 232635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn if (false) { 233635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "minfree_adj=" + minfree_adj + " minfree_abs=" + minfree_abs); 234635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn } 235fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 236c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn final boolean is64bit = Build.SUPPORTED_64_BIT_ABIS.length > 0; 2379d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn 2387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 239bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor int low = mOomMinFreeLow[i]; 240bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor int high = mOomMinFreeHigh[i]; 241c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn if (is64bit) { 242c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn // Increase the high min-free levels for cached processes for 64-bit 243c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn if (i == 4) high = (high*3)/2; 244c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn else if (i == 5) high = (high*7)/4; 245c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn } 246bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor mOomMinFree[i] = (int)(low + ((high-low)*scale)); 247fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 248fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 249fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (minfree_abs >= 0) { 250fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross for (int i=0; i<mOomAdj.length; i++) { 2519d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn mOomMinFree[i] = (int)((float)minfree_abs * mOomMinFree[i] 2529d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn / mOomMinFree[mOomAdj.length - 1]); 253fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 254fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 2557d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 256fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (minfree_adj != 0) { 257fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross for (int i=0; i<mOomAdj.length; i++) { 2589d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn mOomMinFree[i] += (int)((float)minfree_adj * mOomMinFree[i] 2599d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn / mOomMinFree[mOomAdj.length - 1]); 260fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (mOomMinFree[i] < 0) { 261fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross mOomMinFree[i] = 0; 262fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 263fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 264fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 265fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 2663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // The maximum size we will restore a process from cached to background, when under 2673bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // memory duress, is 1/3 the size we have reserved for kernel caches and other overhead 2683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // before killing background processes. 2693bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mCachedRestoreLevel = (getMemLevel(ProcessList.CACHED_APP_MAX_ADJ)/1024) / 3; 2703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 27159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross // Ask the kernel to try to keep enough memory free to allocate 3 full 27259d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross // screen 32bpp buffers without entering direct reclaim. 27359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve = displayWidth * displayHeight * 4 * 3 / 1024; 27459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve_adj = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAdjust); 27559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve_abs = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAbsolute); 27659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 27759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve_abs >= 0) { 27859d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve = reserve_abs; 27959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 28059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 28159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve_adj != 0) { 28259d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve += reserve_adj; 28359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve < 0) { 28459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve = 0; 28559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 28659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 28759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 2887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (write) { 289bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor ByteBuffer buf = ByteBuffer.allocate(4 * (2*mOomAdj.length + 1)); 290bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_TARGET); 291bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor for (int i=0; i<mOomAdj.length; i++) { 292bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt((mOomMinFree[i]*1024)/PAGE_SIZE); 293bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(mOomAdj[i]); 294bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 295bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 296bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 29759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross SystemProperties.set("sys.sysctl.extra_free_kbytes", Integer.toString(reserve)); 2987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // GB: 2048,3072,4096,6144,7168,8192 3007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HC: 8192,10240,12288,14336,16384,20480 3017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 3027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 3032286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn public static int computeEmptyProcessLimit(int totalProcessLimit) { 304465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn return totalProcessLimit/2; 3052286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn } 3062286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn 3078e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn private static String buildOomTag(String prefix, String space, int val, int base) { 3088e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (val == base) { 3098e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (space == null) return prefix; 3108e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return prefix + " "; 3118e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3128e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return prefix + "+" + Integer.toString(val-base); 3138e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3148e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 3158e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn public static String makeOomAdjString(int setAdj) { 3168e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { 3178e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("cch", " ", setAdj, ProcessList.CACHED_APP_MIN_ADJ); 3188e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SERVICE_B_ADJ) { 3198e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("svcb ", null, setAdj, ProcessList.SERVICE_B_ADJ); 3208e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PREVIOUS_APP_ADJ) { 3218e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("prev ", null, setAdj, ProcessList.PREVIOUS_APP_ADJ); 3228e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.HOME_APP_ADJ) { 3238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("home ", null, setAdj, ProcessList.HOME_APP_ADJ); 3248e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SERVICE_ADJ) { 3258e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("svc ", null, setAdj, ProcessList.SERVICE_ADJ); 3268e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.HEAVY_WEIGHT_APP_ADJ) { 3278e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("hvy ", null, setAdj, ProcessList.HEAVY_WEIGHT_APP_ADJ); 3288e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.BACKUP_APP_ADJ) { 3298e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("bkup ", null, setAdj, ProcessList.BACKUP_APP_ADJ); 3308e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) { 3318e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("prcp ", null, setAdj, ProcessList.PERCEPTIBLE_APP_ADJ); 3328e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.VISIBLE_APP_ADJ) { 3338e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("vis ", null, setAdj, ProcessList.VISIBLE_APP_ADJ); 3348e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.FOREGROUND_APP_ADJ) { 3358e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("fore ", null, setAdj, ProcessList.FOREGROUND_APP_ADJ); 336ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn } else if (setAdj >= ProcessList.PERSISTENT_SERVICE_ADJ) { 337ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn return buildOomTag("psvc ", null, setAdj, ProcessList.PERSISTENT_SERVICE_ADJ); 3388e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PERSISTENT_PROC_ADJ) { 3398e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("pers ", null, setAdj, ProcessList.PERSISTENT_PROC_ADJ); 3408e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SYSTEM_ADJ) { 3418e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("sys ", null, setAdj, ProcessList.SYSTEM_ADJ); 3428e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.NATIVE_ADJ) { 3438e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("ntv ", null, setAdj, ProcessList.NATIVE_ADJ); 3448e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else { 3458e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return Integer.toString(setAdj); 3468e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3478e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3488e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 3493bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn public static String makeProcStateString(int curProcState) { 3503bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn String procState; 3513bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn switch (curProcState) { 3523bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_PERSISTENT: 3539484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "PER "; 3543bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3553bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_PERSISTENT_UI: 3569484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "PERU"; 3573bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3583bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_TOP: 359f4dd3711d1164ce6a442306615cac99119022215Dianne Hackborn procState = "TOP "; 3603bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 361ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE: 3629484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "BFGS"; 363ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn break; 3644870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE: 3659484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "FGS "; 3664870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn break; 3673bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND: 3689484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "IMPF"; 3693bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND: 3719484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "IMPB"; 3723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 37383b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND: 37483b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn procState = "TRNB"; 37583b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn break; 3763bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_BACKUP: 3779484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "BKUP"; 3783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3793bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_SERVICE: 3809484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "SVC "; 3813bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_RECEIVER: 3839484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "RCVR"; 3843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 385bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn case ActivityManager.PROCESS_STATE_TOP_SLEEPING: 386bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn procState = "TPSL"; 387bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn break; 388f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT: 389f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn procState = "HVY "; 390f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn break; 3913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_HOME: 3929484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "HOME"; 3933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_LAST_ACTIVITY: 3959484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "LAST"; 3963bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY: 3989484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "CAC "; 3993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 4003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: 4019484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "CACC"; 4023bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 40368a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_RECENT: 40468a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn procState = "CRE "; 40568a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn break; 4063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_EMPTY: 4079484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "CEM "; 4083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 4095614bf5a1ae4522dfc1a041f003cebc9b25c8b93Dianne Hackborn case ActivityManager.PROCESS_STATE_NONEXISTENT: 4109484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "NONE"; 4115614bf5a1ae4522dfc1a041f003cebc9b25c8b93Dianne Hackborn break; 4123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn default: 4133bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "??"; 4143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 4153bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4163bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return procState; 4173bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4183bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 4193bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn public static void appendRamKb(StringBuilder sb, long ramKb) { 4203bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn for (int j=0, fact=10; j<6; j++, fact*=10) { 4213bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (ramKb < fact) { 4223bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn sb.append(' '); 4233bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4243bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4253bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn sb.append(ramKb); 4263bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4273bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 428ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn // How long after a state change that it is safe to collect PSS without it being dirty. 429ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn public static final int PSS_SAFE_TIME_FROM_STATE_CHANGE = 1000; 430ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn 431ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn // The minimum time interval after a state change it is safe to collect PSS. 432f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_MIN_TIME_FROM_STATE_CHANGE = 15*1000; 433f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 434f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The maximum amount of time we want to go between PSS collections. 435f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_MAX_INTERVAL = 30*60*1000; 436f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 437f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The minimum amount of time between successive PSS requests for *all* processes. 438f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_ALL_INTERVAL = 10*60*1000; 439f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 440f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The minimum amount of time between successive PSS requests for a process. 441f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SHORT_INTERVAL = 2*60*1000; 442f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 443f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a process first becomes top. 4443bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_TOP_INTERVAL = 10*1000; 4453bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 4463bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // The amount of time until PSS when a process first goes into the background. 4473bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_BACKGROUND_INTERVAL = 20*1000; 448f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 449f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a process first becomes cached. 4503bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_CACHED_INTERVAL = 30*1000; 451f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 452f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when an important process stays in the same state. 453f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SAME_IMPORTANT_INTERVAL = 15*60*1000; 454f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 455f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a service process stays in the same state. 456f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SAME_SERVICE_INTERVAL = 20*60*1000; 457f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 458f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a cached process stays in the same state. 459f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SAME_CACHED_INTERVAL = 30*60*1000; 460f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 461ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn // The minimum time interval after a state change it is safe to collect PSS. 462ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn public static final int PSS_TEST_MIN_TIME_FROM_STATE_CHANGE = 10*1000; 463ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn 4641a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when a process first becomes top. 4651a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_FIRST_TOP_INTERVAL = 3*1000; 4661a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 4671a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when a process first goes into the background. 4681a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_FIRST_BACKGROUND_INTERVAL = 5*1000; 4691a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 4701a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when an important process stays in same state. 4711a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_SAME_IMPORTANT_INTERVAL = 10*1000; 4721a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 4731a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when a background process stays in same state. 4741a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_SAME_BACKGROUND_INTERVAL = 15*1000; 4751a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 476f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_PERSISTENT = 0; 477f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_TOP = 1; 478f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_IMPORTANT = 2; 479f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_SERVICE = 3; 480f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_CACHED = 4; 481f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 482f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int[] sProcStateToProcMem = new int[] { 483f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT 484f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 485f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_TOP, // ActivityManager.PROCESS_STATE_TOP 486ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE 4874870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE 488f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 489f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 49083b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND 491f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_BACKUP 492f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE 493f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_RECEIVER 494bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PROC_MEM_TOP, // ActivityManager.PROCESS_STATE_TOP_SLEEPING 495f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 496f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_HOME 497f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 498f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 499f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 50068a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_RECENT 501f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 502f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 503f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 504f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final long[] sFirstAwakePssTimes = new long[] { 505f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SHORT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 506f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SHORT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 507f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_TOP_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 508ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE 5094870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE 5103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 5113bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 51283b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND 5133bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 5143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 5153bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 516bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_TOP_SLEEPING 517bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 518f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 519f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 520f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 521f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 52268a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_RECENT 523f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 524f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 525f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 526f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final long[] sSameAwakePssTimes = new long[] { 527f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 528f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 529f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SHORT_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 530ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE 5314870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE 532f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 533f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 53483b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND 535f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 536f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_SERVICE_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 537f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_SERVICE_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 538bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_TOP_SLEEPING 539bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 540f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 541f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 542f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 543f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 54468a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_RECENT 545f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 546f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 547f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 548f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn private static final long[] sTestFirstPssTimes = new long[] { 5491a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_TOP_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 5501a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_TOP_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 5511a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_TOP_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 552bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE 553bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE 5541a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 5551a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 55683b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND 5571a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 5581a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 5591a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 560bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_TOP_SLEEPING 561f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 5621a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 5631a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 5641a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 5651a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 56668a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_RECENT 5671a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 5681a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn }; 5691a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 570f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn private static final long[] sTestSamePssTimes = new long[] { 5711a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 5721a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 5731a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 574ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE 5754870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE 5761a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 5771a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 57883b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND 5791a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 5801a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 5811a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 582bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_TOP_SLEEPING 583bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 5841a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 5851a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 5861a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 5871a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 58868a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_RECENT 5891a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 5901a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn }; 5911a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 592f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static boolean procStatesDifferForMem(int procState1, int procState2) { 593f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn return sProcStateToProcMem[procState1] != sProcStateToProcMem[procState2]; 594f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 595f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 596ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn public static long minTimeFromStateChange(boolean test) { 597ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn return test ? PSS_TEST_MIN_TIME_FROM_STATE_CHANGE : PSS_MIN_TIME_FROM_STATE_CHANGE; 598ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn } 599ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn 6001a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn public static long computeNextPssTime(int procState, boolean first, boolean test, 6011a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn boolean sleeping, long now) { 6021a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn final long[] table = test 603f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn ? (first 604f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn ? sTestFirstPssTimes 605f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn : sTestSamePssTimes) 606f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn : (first 607f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn ? sFirstAwakePssTimes 608f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn : sSameAwakePssTimes); 609f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn return now + table[procState]; 610f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 611f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 6127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn long getMemLevel(int adjustment) { 6137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 6147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (adjustment <= mOomAdj[i]) { 6157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[i] * 1024; 6167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[mOomAdj.length-1] * 1024; 6197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6207d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 621bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor /** 6223bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn * Return the maximum pss size in kb that we consider a process acceptable to 6233bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn * restore from its cached state for running in the background when RAM is low. 6243bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn */ 625cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn long getCachedRestoreThresholdKb() { 6263bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return mCachedRestoreLevel; 6273bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 6283bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 6299bef5b67dc48568e6f8be065dd7016f04058351cDianne Hackborn /** 630bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * Set the out-of-memory badness adjustment for a process. 631f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka * If {@code pid <= 0}, this method will be a no-op. 632bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * 633bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * @param pid The process identifier to set. 634d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross * @param uid The uid of the app 635bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * @param amt Adjustment value -- lmkd allows -16 to +15. 636bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * 637bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * {@hide} 638bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor */ 639d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross public static final void setOomAdj(int pid, int uid, int amt) { 640f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka // This indicates that the process is not started yet and so no need to proceed further. 641f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka if (pid <= 0) { 642f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka return; 643f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka } 644bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (amt == UNKNOWN_ADJ) 645bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return; 646bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 647ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn long start = SystemClock.elapsedRealtime(); 648d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross ByteBuffer buf = ByteBuffer.allocate(4 * 4); 649bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_PROCPRIO); 650bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(pid); 651d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross buf.putInt(uid); 652bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(amt); 653bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 654ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn long now = SystemClock.elapsedRealtime(); 655ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn if ((now-start) > 250) { 656ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn Slog.w("ActivityManager", "SLOW OOM ADJ: " + (now-start) + "ms for pid " + pid 657ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn + " = " + amt); 658ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn } 659bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 660bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 661bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor /* 662bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * {@hide} 663bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor */ 664bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor public static final void remove(int pid) { 665f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka // This indicates that the process is not started yet and so no need to proceed further. 666f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka if (pid <= 0) { 667f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka return; 668f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka } 669bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor ByteBuffer buf = ByteBuffer.allocate(4 * 2); 670bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_PROCREMOVE); 671bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(pid); 672bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 673bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 674bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 675bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static boolean openLmkdSocket() { 6767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 677bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = new LocalSocket(LocalSocket.SOCKET_SEQPACKET); 678bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket.connect( 679bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor new LocalSocketAddress("lmkd", 680bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor LocalSocketAddress.Namespace.RESERVED)); 681bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdOutputStream = sLmkdSocket.getOutputStream(); 682bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex) { 683e23149f1555303940d212b742707518b7f9f84abWale Ogunwale Slog.w(TAG, "lowmemorykiller daemon socket open failed"); 684bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = null; 685bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return false; 686bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 687bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 688bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return true; 689bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 690bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 691bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static void writeLmkd(ByteBuffer buf) { 692bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 693bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor for (int i = 0; i < 3; i++) { 694bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (sLmkdSocket == null) { 695bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (openLmkdSocket() == false) { 696bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor try { 697bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor Thread.sleep(1000); 698bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (InterruptedException ie) { 699bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 700bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor continue; 701bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 702bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 703bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 704bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor try { 705bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdOutputStream.write(buf.array(), 0, buf.position()); 706bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return; 707bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex) { 708e23149f1555303940d212b742707518b7f9f84abWale Ogunwale Slog.w(TAG, "Error writing to lowmemorykiller socket"); 709bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 7107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 711bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket.close(); 712bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex2) { 7137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 714bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 715bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = null; 7167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 7177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 7187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 7197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn} 720