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; 24e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport java.io.PrintWriter; 25bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.nio.ByteBuffer; 267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 278e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackbornimport android.app.ActivityManager; 28db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatzimport android.app.AppProtoEnums; 299d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackbornimport android.os.Build; 30ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackbornimport android.os.SystemClock; 317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.internal.util.MemInfoReader; 327d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.server.wm.WindowManagerService; 337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 34fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Crossimport android.content.res.Resources; 357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.graphics.Point; 3659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Crossimport android.os.SystemProperties; 37bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocketAddress; 38bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocket; 397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.util.Slog; 4059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display; 417d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/** 437d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Activity manager code dealing with processes. 447d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */ 45352dc57186ff796dbb7a095c609d1a0bae5d3fcaSudheer Shankapublic final class ProcessList { 46e23149f1555303940d212b742707518b7f9f84abWale Ogunwale private static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessList" : TAG_AM; 47e23149f1555303940d212b742707518b7f9f84abWale Ogunwale 487d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The minimum time we allow between crashes, for us to consider this 497d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // application to be bad and stop and its services and reject broadcasts. 507d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int MIN_CRASH_INTERVAL = 60*1000; 517d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 527d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // OOM adjustments for processes in various states: 537d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 54fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang // Uninitialized value for any major or minor adj fields 55fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int INVALID_ADJ = -10000; 56fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang 57c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // Adjustment used in certain places where we don't know it yet. 58c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // (Generally this is something that is going to be cached, but we 59c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // don't know the exact value in the cached range to assign yet.) 60fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int UNKNOWN_ADJ = 1001; 61c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn 627d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are not visible, 63e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // so it can be killed without any disruption. 64fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int CACHED_APP_MAX_ADJ = 906; 65fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int CACHED_APP_MIN_ADJ = 900; 66e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn 67e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // The B list of SERVICE_ADJ -- these are the old and decrepit 68e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // services that aren't as shiny and interesting as the ones in the A list. 69fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int SERVICE_B_ADJ = 800; 70f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn 71f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This is the process of the previous application that the user was in. 72f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This process is kept above other things, because it is very common to 73f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // switch back to the previous app. This is important both for recent 74f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // task switch (toggling between the two top recent apps) as well as normal 75f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // UI flow such as clicking on a URI in the e-mail app to view in the browser, 76f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // and then pressing back to return to e-mail. 77fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int PREVIOUS_APP_ADJ = 700; 787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process holding the home application -- we want to try 807d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // avoiding killing it, even if it would normally be in the background, 817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // because the user interacts with it so much. 82fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int HOME_APP_ADJ = 600; 837d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 84e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a process holding an application service -- killing it will not 85e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // have much of an impact as far as the user is concerned. 86fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int SERVICE_ADJ = 500; 877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process with a heavy-weight application. It is in the 897d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // background, but we want to try to avoid killing it. Value set in 907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // system/rootdir/init.rc on startup. 91fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int HEAVY_WEIGHT_APP_ADJ = 400; 92c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn 93c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // This is a process currently hosting a backup operation. Killing it 94c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // is not entirely fatal but is generally a bad idea. 95fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int BACKUP_APP_ADJ = 300; 967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting components that are perceptible to the 987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // user, and we really want to avoid killing them, but they are not 99e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // immediately visible. An example is background music playback. 100fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int PERCEPTIBLE_APP_ADJ = 200; 1017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are visible to the 103e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // user, so we'd prefer they don't disappear. 104fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int VISIBLE_APP_ADJ = 100; 105fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int VISIBLE_APP_LAYER_MAX = PERCEPTIBLE_APP_ADJ - VISIBLE_APP_ADJ - 1; 1067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is the process running the current foreground app. We'd really 108e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // rather not kill it! 1097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int FOREGROUND_APP_ADJ = 0; 1107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 111ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn // This is a process that the system or a persistent process has bound to, 112ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn // and indicated it is important. 113fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int PERSISTENT_SERVICE_ADJ = -700; 114ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn 115e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a system persistent process, such as telephony. Definitely 1167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // don't want to kill it, but doing so is not completely fatal. 117fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int PERSISTENT_PROC_ADJ = -800; 1187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The system process runs at the default adjustment. 120fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int SYSTEM_ADJ = -900; 1217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1228e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn // Special code for native processes that are not being managed by the system (so 1238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn // don't have an oom adj assigned by the system). 124fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang static final int NATIVE_ADJ = -1000; 1258e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 1267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Memory pages are 4K. 1277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int PAGE_SIZE = 4*1024; 1287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 129a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn // Activity manager's version of Process.THREAD_GROUP_BG_NONINTERACTIVE 130a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn static final int SCHED_GROUP_BACKGROUND = 0; 131fef10a47a810f375f762e77240718774a5f518aaTim Murray // Activity manager's version of Process.THREAD_GROUP_RESTRICTED 132fef10a47a810f375f762e77240718774a5f518aaTim Murray static final int SCHED_GROUP_RESTRICTED = 1; 133a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn // Activity manager's version of Process.THREAD_GROUP_DEFAULT 134fef10a47a810f375f762e77240718774a5f518aaTim Murray static final int SCHED_GROUP_DEFAULT = 2; 135a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn // Activity manager's version of Process.THREAD_GROUP_TOP_APP 136fef10a47a810f375f762e77240718774a5f518aaTim Murray static final int SCHED_GROUP_TOP_APP = 3; 13733eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray // Activity manager's version of Process.THREAD_GROUP_TOP_APP 13833eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray // Disambiguate between actual top app and processes bound to the top app 139fef10a47a810f375f762e77240718774a5f518aaTim Murray static final int SCHED_GROUP_TOP_APP_BOUND = 4; 140a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn 141be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // The minimum number of cached apps we want to be able to keep around, 1427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // without empty apps being able to push them out of memory. 143be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn static final int MIN_CACHED_APPS = 2; 1447d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 145b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // We allow empty processes to stick around for at most 30 minutes. 146b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final long MAX_EMPTY_TIME = 30*60*1000; 147b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 148be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // Threshold of number of cached+empty where we consider memory critical. 149b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_CRITICAL_THRESHOLD = 3; 150b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 151be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // Threshold of number of cached+empty where we consider memory critical. 152b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_LOW_THRESHOLD = 5; 1537d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 154bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // Low Memory Killer Daemon command codes. 155bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // These must be kept in sync with the definitions in lmkd.c 156bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // 157bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_TARGET <minfree> <minkillprio> ... (up to 6 pairs) 158fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang // LMK_PROCPRIO <pid> <uid> <prio> 159bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_PROCREMOVE <pid> 160bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_TARGET = 0; 161bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_PROCPRIO = 1; 162bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_PROCREMOVE = 2; 163bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 1647d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the various interesting memory levels that we will give to 1657d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // the OOM killer. Note that the OOM killer only supports 6 slots, so we 1667d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // can't give it a different value for every possible kind of process. 1677d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final int[] mOomAdj = new int[] { 1687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ, 169be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn BACKUP_APP_ADJ, CACHED_APP_MIN_ADJ, CACHED_APP_MAX_ADJ 1707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the low-end OOM level limits. This is appropriate for an 1727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HVGA or smaller phone with less than 512MB. Values are in KB. 173bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFreeLow = new int[] { 1743f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn 12288, 18432, 24576, 1753f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn 36864, 43008, 49152 1767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the high-end OOM level limits. This is appropriate for a 1787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 1280x800 or larger screen with around 1GB RAM. Values are in KB. 179bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFreeHigh = new int[] { 1803f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn 73728, 92160, 110592, 181824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn 129024, 147456, 184320 1827d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1837d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The actual OOM killer memory levels we are using. 184bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFree = new int[mOomAdj.length]; 1857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final long mTotalMemMb; 1877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private long mCachedRestoreLevel; 1893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 1907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private boolean mHaveDisplaySize; 1917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 192bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static LocalSocket sLmkdSocket; 193bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static OutputStream sLmkdOutputStream; 194bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 1957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn ProcessList() { 1967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn MemInfoReader minfo = new MemInfoReader(); 1977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn minfo.readMemInfo(); 1987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mTotalMemMb = minfo.getTotalSize()/(1024*1024); 1997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(0, 0, false); 2007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn void applyDisplaySize(WindowManagerService wm) { 2037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (!mHaveDisplaySize) { 2047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn Point p = new Point(); 2051e32e025ad5677ce4e3697ca026c2019fe0bd8e9Andrii Kulian // TODO(multi-display): Compute based on sum of all connected displays' resolutions. 206637dbfcaf0a1f43f81d3d195461b50bfc0fd5f14Colin Cross wm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, p); 2077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (p.x != 0 && p.y != 0) { 2087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(p.x, p.y, true); 2097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mHaveDisplaySize = true; 2107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private void updateOomLevels(int displayWidth, int displayHeight, boolean write) { 2157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from avail memory: at 300MB we use the lowest values to 2167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 700MB or more for the top values. 217824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn float scaleMem = ((float)(mTotalMemMb-350))/(700-350); 2187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from screen size. 220635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minSize = 480*800; // 384000 2217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn int maxSize = 1280*800; // 1024000 230400 870400 .264 2227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scaleDisp = ((float)(displayWidth*displayHeight)-minSize)/(maxSize-minSize); 223635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn if (false) { 224635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "scaleMem=" + scaleMem); 225635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "scaleDisp=" + scaleDisp + " dw=" + displayWidth 226635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn + " dh=" + displayHeight); 227635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn } 2287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scale = scaleMem > scaleDisp ? scaleMem : scaleDisp; 2307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (scale < 0) scale = 0; 2317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn else if (scale > 1) scale = 1; 232635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minfree_adj = Resources.getSystem().getInteger( 233635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAdjust); 234635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minfree_abs = Resources.getSystem().getInteger( 235635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAbsolute); 236635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn if (false) { 237635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "minfree_adj=" + minfree_adj + " minfree_abs=" + minfree_abs); 238635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn } 239fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 240c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn final boolean is64bit = Build.SUPPORTED_64_BIT_ABIS.length > 0; 2419d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn 2427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 243bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor int low = mOomMinFreeLow[i]; 244bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor int high = mOomMinFreeHigh[i]; 245c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn if (is64bit) { 246c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn // Increase the high min-free levels for cached processes for 64-bit 247c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn if (i == 4) high = (high*3)/2; 248c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn else if (i == 5) high = (high*7)/4; 249c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn } 250bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor mOomMinFree[i] = (int)(low + ((high-low)*scale)); 251fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 252fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 253fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (minfree_abs >= 0) { 254fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross for (int i=0; i<mOomAdj.length; i++) { 2559d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn mOomMinFree[i] = (int)((float)minfree_abs * mOomMinFree[i] 2569d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn / mOomMinFree[mOomAdj.length - 1]); 257fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 258fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 2597d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 260fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (minfree_adj != 0) { 261fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross for (int i=0; i<mOomAdj.length; i++) { 2629d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn mOomMinFree[i] += (int)((float)minfree_adj * mOomMinFree[i] 2639d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn / mOomMinFree[mOomAdj.length - 1]); 264fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (mOomMinFree[i] < 0) { 265fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross mOomMinFree[i] = 0; 266fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 267fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 268fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 269fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 2703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // The maximum size we will restore a process from cached to background, when under 2713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // memory duress, is 1/3 the size we have reserved for kernel caches and other overhead 2723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // before killing background processes. 2733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mCachedRestoreLevel = (getMemLevel(ProcessList.CACHED_APP_MAX_ADJ)/1024) / 3; 2743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 27559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross // Ask the kernel to try to keep enough memory free to allocate 3 full 27659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross // screen 32bpp buffers without entering direct reclaim. 27759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve = displayWidth * displayHeight * 4 * 3 / 1024; 27859d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve_adj = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAdjust); 27959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve_abs = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAbsolute); 28059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 28159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve_abs >= 0) { 28259d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve = reserve_abs; 28359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 28459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 28559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve_adj != 0) { 28659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve += reserve_adj; 28759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve < 0) { 28859d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve = 0; 28959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 29059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 29159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 2927d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (write) { 293bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor ByteBuffer buf = ByteBuffer.allocate(4 * (2*mOomAdj.length + 1)); 294bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_TARGET); 295bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor for (int i=0; i<mOomAdj.length; i++) { 296bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt((mOomMinFree[i]*1024)/PAGE_SIZE); 297bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(mOomAdj[i]); 298bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 299bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 300bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 30159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross SystemProperties.set("sys.sysctl.extra_free_kbytes", Integer.toString(reserve)); 3027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 3037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // GB: 2048,3072,4096,6144,7168,8192 3047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HC: 8192,10240,12288,14336,16384,20480 3057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 3067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 3072286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn public static int computeEmptyProcessLimit(int totalProcessLimit) { 308465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn return totalProcessLimit/2; 3092286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn } 3102286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn 3118e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn private static String buildOomTag(String prefix, String space, int val, int base) { 3128e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (val == base) { 3138e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (space == null) return prefix; 3148e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return prefix + " "; 3158e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3168e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return prefix + "+" + Integer.toString(val-base); 3178e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3188e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 3198e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn public static String makeOomAdjString(int setAdj) { 3208e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { 3218e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("cch", " ", setAdj, ProcessList.CACHED_APP_MIN_ADJ); 3228e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SERVICE_B_ADJ) { 3238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("svcb ", null, setAdj, ProcessList.SERVICE_B_ADJ); 3248e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PREVIOUS_APP_ADJ) { 3258e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("prev ", null, setAdj, ProcessList.PREVIOUS_APP_ADJ); 3268e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.HOME_APP_ADJ) { 3278e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("home ", null, setAdj, ProcessList.HOME_APP_ADJ); 3288e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SERVICE_ADJ) { 3298e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("svc ", null, setAdj, ProcessList.SERVICE_ADJ); 3308e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.HEAVY_WEIGHT_APP_ADJ) { 3318e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("hvy ", null, setAdj, ProcessList.HEAVY_WEIGHT_APP_ADJ); 3328e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.BACKUP_APP_ADJ) { 3338e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("bkup ", null, setAdj, ProcessList.BACKUP_APP_ADJ); 3348e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) { 3358e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("prcp ", null, setAdj, ProcessList.PERCEPTIBLE_APP_ADJ); 3368e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.VISIBLE_APP_ADJ) { 3378e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("vis ", null, setAdj, ProcessList.VISIBLE_APP_ADJ); 3388e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.FOREGROUND_APP_ADJ) { 3398e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("fore ", null, setAdj, ProcessList.FOREGROUND_APP_ADJ); 340ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn } else if (setAdj >= ProcessList.PERSISTENT_SERVICE_ADJ) { 341ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn return buildOomTag("psvc ", null, setAdj, ProcessList.PERSISTENT_SERVICE_ADJ); 3428e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PERSISTENT_PROC_ADJ) { 3438e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("pers ", null, setAdj, ProcessList.PERSISTENT_PROC_ADJ); 3448e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SYSTEM_ADJ) { 3458e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("sys ", null, setAdj, ProcessList.SYSTEM_ADJ); 3468e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.NATIVE_ADJ) { 3478e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("ntv ", null, setAdj, ProcessList.NATIVE_ADJ); 3488e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else { 3498e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return Integer.toString(setAdj); 3508e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3518e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3528e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 3533bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn public static String makeProcStateString(int curProcState) { 3543bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn String procState; 3553bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn switch (curProcState) { 3563bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_PERSISTENT: 3579484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "PER "; 3583bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3593bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_PERSISTENT_UI: 3609484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "PERU"; 3613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3623bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_TOP: 363f4dd3711d1164ce6a442306615cac99119022215Dianne Hackborn procState = "TOP "; 3643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3654870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE: 3669484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "FGS "; 3674870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn break; 36810fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE: 36910fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn procState = "BFGS"; 37010fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn break; 3713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND: 3729484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "IMPF"; 3733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND: 3759484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "IMPB"; 3763bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 37783b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND: 37883b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn procState = "TRNB"; 37983b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn break; 3803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_BACKUP: 3819484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "BKUP"; 3823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_SERVICE: 3849484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "SVC "; 3853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_RECEIVER: 3879484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "RCVR"; 3883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 389bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn case ActivityManager.PROCESS_STATE_TOP_SLEEPING: 390bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn procState = "TPSL"; 391bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn break; 392f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT: 393f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn procState = "HVY "; 394f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn break; 3953bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_HOME: 3969484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "HOME"; 3973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_LAST_ACTIVITY: 3999484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "LAST"; 4003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 4013bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY: 4029484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "CAC "; 4033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 4043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: 4059484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "CACC"; 4063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 40768a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_RECENT: 40868a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn procState = "CRE "; 40968a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn break; 4103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_EMPTY: 4119484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "CEM "; 4123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 4135614bf5a1ae4522dfc1a041f003cebc9b25c8b93Dianne Hackborn case ActivityManager.PROCESS_STATE_NONEXISTENT: 4149484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn procState = "NONE"; 4155614bf5a1ae4522dfc1a041f003cebc9b25c8b93Dianne Hackborn break; 4163bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn default: 4173bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "??"; 4183bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 4193bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4203bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return procState; 4213bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4223bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 423148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin public static int makeProcStateProtoEnum(int curProcState) { 424148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin switch (curProcState) { 425148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_PERSISTENT: 426db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_PERSISTENT; 427148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_PERSISTENT_UI: 428db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_PERSISTENT_UI; 429148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_TOP: 430db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_TOP; 431148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE: 432db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_BOUND_FOREGROUND_SERVICE; 433148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE: 434db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_FOREGROUND_SERVICE; 435148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_TOP_SLEEPING: 436db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_TOP_SLEEPING; 437148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND: 438db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_IMPORTANT_FOREGROUND; 439148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND: 440db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_IMPORTANT_BACKGROUND; 441148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND: 442db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_TRANSIENT_BACKGROUND; 443148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_BACKUP: 444db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_BACKUP; 445148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT: 446db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_HEAVY_WEIGHT; 447148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_SERVICE: 448db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_SERVICE; 449148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_RECEIVER: 450db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_RECEIVER; 451148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_HOME: 452db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_HOME; 453148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_LAST_ACTIVITY: 454db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_LAST_ACTIVITY; 455148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY: 456db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_CACHED_ACTIVITY; 457148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: 458db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_CACHED_ACTIVITY_CLIENT; 459148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_CACHED_RECENT: 460db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_CACHED_RECENT; 461148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_CACHED_EMPTY: 462db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_CACHED_EMPTY; 463148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin case ActivityManager.PROCESS_STATE_NONEXISTENT: 464db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_NONEXISTENT; 465db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz case ActivityManager.PROCESS_STATE_UNKNOWN: 466db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_UNKNOWN; 467148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin default: 468db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz return AppProtoEnums.PROCESS_STATE_UNKNOWN_TO_PROTO; 469148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin } 470148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin } 471148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin 4723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn public static void appendRamKb(StringBuilder sb, long ramKb) { 4733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn for (int j=0, fact=10; j<6; j++, fact*=10) { 4743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (ramKb < fact) { 4753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn sb.append(' '); 4763bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4773bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn sb.append(ramKb); 4793bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 4803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 481ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn // How long after a state change that it is safe to collect PSS without it being dirty. 482ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn public static final int PSS_SAFE_TIME_FROM_STATE_CHANGE = 1000; 483ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn 484ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn // The minimum time interval after a state change it is safe to collect PSS. 485f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_MIN_TIME_FROM_STATE_CHANGE = 15*1000; 486f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 487f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The maximum amount of time we want to go between PSS collections. 488e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int PSS_MAX_INTERVAL = 60*60*1000; 489f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 490f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The minimum amount of time between successive PSS requests for *all* processes. 491052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn public static final int PSS_ALL_INTERVAL = 20*60*1000; 492f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 493052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn // The amount of time until PSS when a persistent process first appears. 494052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn private static final int PSS_FIRST_PERSISTENT_INTERVAL = 30*1000; 495f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 496f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a process first becomes top. 4973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_TOP_INTERVAL = 10*1000; 4983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 4993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // The amount of time until PSS when a process first goes into the background. 5003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_BACKGROUND_INTERVAL = 20*1000; 501f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 502f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a process first becomes cached. 503e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn private static final int PSS_FIRST_CACHED_INTERVAL = 20*1000; 504e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 505e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn // The amount of time until PSS when an important process stays in the same state. 506ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn private static final int PSS_SAME_PERSISTENT_INTERVAL = 10*60*1000; 507f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 508052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn // The amount of time until PSS when the top process stays in the same state. 509ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn private static final int PSS_SAME_TOP_INTERVAL = 1*60*1000; 510052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 511f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when an important process stays in the same state. 512ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn private static final int PSS_SAME_IMPORTANT_INTERVAL = 10*60*1000; 513f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 514f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a service process stays in the same state. 515ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn private static final int PSS_SAME_SERVICE_INTERVAL = 5*60*1000; 516f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 517f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a cached process stays in the same state. 518ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn private static final int PSS_SAME_CACHED_INTERVAL = 10*60*1000; 519f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 520052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn // The amount of time until PSS when a persistent process first appears. 521052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn private static final int PSS_FIRST_ASLEEP_PERSISTENT_INTERVAL = 1*60*1000; 522052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 523052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn // The amount of time until PSS when a process first becomes top. 524052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn private static final int PSS_FIRST_ASLEEP_TOP_INTERVAL = 20*1000; 525052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 526052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn // The amount of time until PSS when a process first goes into the background. 527052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn private static final int PSS_FIRST_ASLEEP_BACKGROUND_INTERVAL = 30*1000; 528052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 529052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn // The amount of time until PSS when a process first becomes cached. 530052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn private static final int PSS_FIRST_ASLEEP_CACHED_INTERVAL = 1*60*1000; 531052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 532ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn // The minimum time interval after a state change it is safe to collect PSS. 533ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn public static final int PSS_TEST_MIN_TIME_FROM_STATE_CHANGE = 10*1000; 534ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn 5351a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when a process first becomes top. 5361a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_FIRST_TOP_INTERVAL = 3*1000; 5371a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 5381a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when a process first goes into the background. 5391a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_FIRST_BACKGROUND_INTERVAL = 5*1000; 5401a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 5411a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when an important process stays in same state. 5421a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_SAME_IMPORTANT_INTERVAL = 10*1000; 5431a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 5441a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn // The amount of time during testing until PSS when a background process stays in same state. 5451a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn private static final int PSS_TEST_SAME_BACKGROUND_INTERVAL = 15*1000; 5461a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 547f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_PERSISTENT = 0; 548f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_TOP = 1; 549f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_IMPORTANT = 2; 550f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_SERVICE = 3; 551f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_CACHED = 4; 552e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final int PROC_MEM_NUM = 5; 553f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 554e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn // Map large set of system process states to 555f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int[] sProcStateToProcMem = new int[] { 556f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT 557f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 558f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_TOP, // ActivityManager.PROCESS_STATE_TOP 5594870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE 56010fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE 561f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 562f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 56383b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND 564f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_BACKUP 565f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE 566f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_RECEIVER 567bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn PROC_MEM_TOP, // ActivityManager.PROCESS_STATE_TOP_SLEEPING 568f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 569f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_HOME 570f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 571f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 572f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 57368a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_RECENT 574f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 575f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 576f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 577f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final long[] sFirstAwakePssTimes = new long[] { 578e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_PERSISTENT_INTERVAL, // PROC_MEM_PERSISTENT 579e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_TOP_INTERVAL, // PROC_MEM_TOP 580e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // PROC_MEM_IMPORTANT 581e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // PROC_MEM_SERVICE 582e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_CACHED_INTERVAL, // PROC_MEM_CACHED 583f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 584f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 585f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final long[] sSameAwakePssTimes = new long[] { 586e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_PERSISTENT_INTERVAL, // PROC_MEM_PERSISTENT 587e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_TOP_INTERVAL, // PROC_MEM_TOP 588e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // PROC_MEM_IMPORTANT 589e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_SERVICE_INTERVAL, // PROC_MEM_SERVICE 590e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_CACHED_INTERVAL, // PROC_MEM_CACHED 591052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn }; 592052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 593052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn private static final long[] sFirstAsleepPssTimes = new long[] { 594e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_ASLEEP_PERSISTENT_INTERVAL, // PROC_MEM_PERSISTENT 595e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_ASLEEP_TOP_INTERVAL, // PROC_MEM_TOP 596e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_ASLEEP_BACKGROUND_INTERVAL, // PROC_MEM_IMPORTANT 597e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_ASLEEP_BACKGROUND_INTERVAL, // PROC_MEM_SERVICE 598e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_FIRST_ASLEEP_CACHED_INTERVAL, // PROC_MEM_CACHED 599052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn }; 600052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn 601052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn private static final long[] sSameAsleepPssTimes = new long[] { 602e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_PERSISTENT_INTERVAL, // PROC_MEM_PERSISTENT 603e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_TOP_INTERVAL, // PROC_MEM_TOP 604e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // PROC_MEM_IMPORTANT 605e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_SERVICE_INTERVAL, // PROC_MEM_SERVICE 606e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_SAME_CACHED_INTERVAL, // PROC_MEM_CACHED 607f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 608f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 609f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn private static final long[] sTestFirstPssTimes = new long[] { 610e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_FIRST_TOP_INTERVAL, // PROC_MEM_PERSISTENT 611e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_FIRST_TOP_INTERVAL, // PROC_MEM_TOP 612e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // PROC_MEM_IMPORTANT 613e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // PROC_MEM_SERVICE 614e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_FIRST_BACKGROUND_INTERVAL, // PROC_MEM_CACHED 6151a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn }; 6161a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 617f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn private static final long[] sTestSamePssTimes = new long[] { 618e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // PROC_MEM_PERSISTENT 619e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // PROC_MEM_TOP 620e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_SAME_IMPORTANT_INTERVAL, // PROC_MEM_IMPORTANT 621e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // PROC_MEM_SERVICE 622e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn PSS_TEST_SAME_BACKGROUND_INTERVAL, // PROC_MEM_CACHED 6231a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn }; 6241a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn 625e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static final class ProcStateMemTracker { 626e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn final int[] mHighestMem = new int[PROC_MEM_NUM]; 627ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn final float[] mScalingFactor = new float[PROC_MEM_NUM]; 628e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn int mTotalHighestMem = PROC_MEM_CACHED; 629e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 630e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn int mPendingMemState; 631e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn int mPendingHighestMemState; 632ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn float mPendingScalingFactor; 633e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 634e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public ProcStateMemTracker() { 635e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn for (int i = PROC_MEM_PERSISTENT; i < PROC_MEM_NUM; i++) { 636e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mHighestMem[i] = PROC_MEM_NUM; 637ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn mScalingFactor[i] = 1.0f; 638e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 639e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn mPendingMemState = -1; 640e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 641e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 642e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public void dumpLine(PrintWriter pw) { 643e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print("best="); 644e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(mTotalHighestMem); 645ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print(" ("); 646ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn boolean needSep = false; 647e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn for (int i = 0; i < PROC_MEM_NUM; i++) { 648ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn if (mHighestMem[i] < PROC_MEM_NUM) { 649ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn if (needSep) { 650ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print(", "); 651ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn needSep = false; 652ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn } 653ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print(i); 654ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print("="); 655ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print(mHighestMem[i]); 656ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print(" "); 657ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print(mScalingFactor[i]); 658ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print("x"); 659ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn needSep = true; 660e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 661e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 662e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(")"); 663e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn if (mPendingMemState >= 0) { 664e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(" / pending state="); 665e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(mPendingMemState); 666e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(" highest="); 667e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.print(mPendingHighestMemState); 668ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print(" "); 669ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print(mPendingScalingFactor); 670ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn pw.print("x"); 671e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 672e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn pw.println(); 673e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 674e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 675e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 676f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static boolean procStatesDifferForMem(int procState1, int procState2) { 677f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn return sProcStateToProcMem[procState1] != sProcStateToProcMem[procState2]; 678f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 679f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 680ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn public static long minTimeFromStateChange(boolean test) { 681ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn return test ? PSS_TEST_MIN_TIME_FROM_STATE_CHANGE : PSS_MIN_TIME_FROM_STATE_CHANGE; 682ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn } 683ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn 684e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static void commitNextPssTime(ProcStateMemTracker tracker) { 685e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn if (tracker.mPendingMemState >= 0) { 686e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn tracker.mHighestMem[tracker.mPendingMemState] = tracker.mPendingHighestMemState; 687ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn tracker.mScalingFactor[tracker.mPendingMemState] = tracker.mPendingScalingFactor; 688e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn tracker.mTotalHighestMem = tracker.mPendingHighestMemState; 689e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn tracker.mPendingMemState = -1; 690e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 691e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 692e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 693e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static void abortNextPssTime(ProcStateMemTracker tracker) { 694e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn tracker.mPendingMemState = -1; 695e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 696e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn 697e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn public static long computeNextPssTime(int procState, ProcStateMemTracker tracker, boolean test, 6981a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn boolean sleeping, long now) { 699e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn boolean first; 700ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn float scalingFactor; 701e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn final int memState = sProcStateToProcMem[procState]; 702e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn if (tracker != null) { 703e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn final int highestMemState = memState < tracker.mTotalHighestMem 704e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn ? memState : tracker.mTotalHighestMem; 705e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn first = highestMemState < tracker.mHighestMem[memState]; 706e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn tracker.mPendingMemState = memState; 707e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn tracker.mPendingHighestMemState = highestMemState; 708ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn if (first) { 709ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn tracker.mPendingScalingFactor = scalingFactor = 1.0f; 710ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn } else { 711ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn scalingFactor = tracker.mScalingFactor[memState]; 712ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn tracker.mPendingScalingFactor = scalingFactor * 1.5f; 713ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn } 714e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } else { 715e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn first = true; 716ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn scalingFactor = 1.0f; 717e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 7181a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn final long[] table = test 719f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn ? (first 720e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn ? sTestFirstPssTimes 721e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn : sTestSamePssTimes) 722f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn : (first 723e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn ? (sleeping ? sFirstAsleepPssTimes : sFirstAwakePssTimes) 724e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn : (sleeping ? sSameAsleepPssTimes : sSameAwakePssTimes)); 725ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn long delay = (long)(table[memState] * scalingFactor); 726e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn if (delay > PSS_MAX_INTERVAL) { 727e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn delay = PSS_MAX_INTERVAL; 728e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn } 729e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn return now + delay; 730f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 731f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 7327d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn long getMemLevel(int adjustment) { 7337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 7347d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (adjustment <= mOomAdj[i]) { 7357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[i] * 1024; 7367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 7377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 7387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[mOomAdj.length-1] * 1024; 7397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 7407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 741bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor /** 7423bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn * Return the maximum pss size in kb that we consider a process acceptable to 7433bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn * restore from its cached state for running in the background when RAM is low. 7443bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn */ 745cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn long getCachedRestoreThresholdKb() { 7463bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return mCachedRestoreLevel; 7473bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 7483bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 7499bef5b67dc48568e6f8be065dd7016f04058351cDianne Hackborn /** 750bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * Set the out-of-memory badness adjustment for a process. 751f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka * If {@code pid <= 0}, this method will be a no-op. 752bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * 753bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * @param pid The process identifier to set. 754d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross * @param uid The uid of the app 755bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * @param amt Adjustment value -- lmkd allows -16 to +15. 756bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * 757bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * {@hide} 758bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor */ 759d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross public static final void setOomAdj(int pid, int uid, int amt) { 760f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka // This indicates that the process is not started yet and so no need to proceed further. 761f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka if (pid <= 0) { 762f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka return; 763f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka } 764bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (amt == UNKNOWN_ADJ) 765bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return; 766bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 767ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn long start = SystemClock.elapsedRealtime(); 768d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross ByteBuffer buf = ByteBuffer.allocate(4 * 4); 769bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_PROCPRIO); 770bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(pid); 771d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross buf.putInt(uid); 772bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(amt); 773bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 774ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn long now = SystemClock.elapsedRealtime(); 775ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn if ((now-start) > 250) { 776ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn Slog.w("ActivityManager", "SLOW OOM ADJ: " + (now-start) + "ms for pid " + pid 777ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn + " = " + amt); 778ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn } 779bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 780bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 781bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor /* 782bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * {@hide} 783bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor */ 784bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor public static final void remove(int pid) { 785f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka // This indicates that the process is not started yet and so no need to proceed further. 786f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka if (pid <= 0) { 787f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka return; 788f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka } 789bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor ByteBuffer buf = ByteBuffer.allocate(4 * 2); 790bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_PROCREMOVE); 791bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(pid); 792bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 793bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 794bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 795bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static boolean openLmkdSocket() { 7967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 797bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = new LocalSocket(LocalSocket.SOCKET_SEQPACKET); 798bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket.connect( 799bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor new LocalSocketAddress("lmkd", 800bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor LocalSocketAddress.Namespace.RESERVED)); 801bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdOutputStream = sLmkdSocket.getOutputStream(); 802bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex) { 803e23149f1555303940d212b742707518b7f9f84abWale Ogunwale Slog.w(TAG, "lowmemorykiller daemon socket open failed"); 804bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = null; 805bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return false; 806bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 807bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 808bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return true; 809bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 810bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 811bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static void writeLmkd(ByteBuffer buf) { 812bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 813bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor for (int i = 0; i < 3; i++) { 814bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (sLmkdSocket == null) { 815bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (openLmkdSocket() == false) { 816bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor try { 817bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor Thread.sleep(1000); 818bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (InterruptedException ie) { 819bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 820bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor continue; 821bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 822bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 823bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 824bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor try { 825bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdOutputStream.write(buf.array(), 0, buf.position()); 826bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return; 827bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex) { 828e23149f1555303940d212b742707518b7f9f84abWale Ogunwale Slog.w(TAG, "Error writing to lowmemorykiller socket"); 829bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 8307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 831bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket.close(); 832bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex2) { 8337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 834bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 835bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = null; 8367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 8377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 8387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 8397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn} 840