ProcessList.java revision ecf1cda068c95c58d296d508d34706d659e4a1ae
17d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/* 27d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Copyright (C) 2011 The Android Open Source Project 37d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * 47d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 57d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * you may not use this file except in compliance with the License. 67d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * You may obtain a copy of the License at 77d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * 87d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 97d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * 107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Unless required by applicable law or agreed to in writing, software 117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * See the License for the specific language governing permissions and 147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * limitations under the License. 157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */ 167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornpackage com.android.server.am; 187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport java.io.IOException; 20bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.io.OutputStream; 21bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.nio.ByteBuffer; 227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackbornimport android.app.ActivityManager; 24ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackbornimport android.os.SystemClock; 257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.internal.util.MemInfoReader; 267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.server.wm.WindowManagerService; 277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 28fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Crossimport android.content.res.Resources; 297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.graphics.Point; 3059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Crossimport android.os.SystemProperties; 31bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocketAddress; 32bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocket; 337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.util.Slog; 3459c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display; 357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/** 377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Activity manager code dealing with processes. 387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */ 39be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackbornfinal class ProcessList { 407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The minimum time we allow between crashes, for us to consider this 417d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // application to be bad and stop and its services and reject broadcasts. 427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int MIN_CRASH_INTERVAL = 60*1000; 437d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 447d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // OOM adjustments for processes in various states: 457d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 46c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // Adjustment used in certain places where we don't know it yet. 47c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // (Generally this is something that is going to be cached, but we 48c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // don't know the exact value in the cached range to assign yet.) 49c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn static final int UNKNOWN_ADJ = 16; 50c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn 517d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are not visible, 52e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // so it can be killed without any disruption. 53be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn static final int CACHED_APP_MAX_ADJ = 15; 5420cdcee47d10986969e7e2a53a40a6ecabae3827Dianne Hackborn static final int CACHED_APP_MIN_ADJ = 9; 55e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn 56e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // The B list of SERVICE_ADJ -- these are the old and decrepit 57e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // services that aren't as shiny and interesting as the ones in the A list. 58f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn static final int SERVICE_B_ADJ = 8; 59f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn 60f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This is the process of the previous application that the user was in. 61f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This process is kept above other things, because it is very common to 62f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // switch back to the previous app. This is important both for recent 63f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // task switch (toggling between the two top recent apps) as well as normal 64f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // UI flow such as clicking on a URI in the e-mail app to view in the browser, 65f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // and then pressing back to return to e-mail. 66f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn static final int PREVIOUS_APP_ADJ = 7; 677d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process holding the home application -- we want to try 697d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // avoiding killing it, even if it would normally be in the background, 707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // because the user interacts with it so much. 717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int HOME_APP_ADJ = 6; 727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 73e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a process holding an application service -- killing it will not 74e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // have much of an impact as far as the user is concerned. 75e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn static final int SERVICE_ADJ = 5; 767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process with a heavy-weight application. It is in the 787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // background, but we want to try to avoid killing it. Value set in 797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // system/rootdir/init.rc on startup. 80c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn static final int HEAVY_WEIGHT_APP_ADJ = 4; 81c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn 82c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // This is a process currently hosting a backup operation. Killing it 83c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn // is not entirely fatal but is generally a bad idea. 84c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn static final int BACKUP_APP_ADJ = 3; 857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting components that are perceptible to the 877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // user, and we really want to avoid killing them, but they are not 88e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // immediately visible. An example is background music playback. 897d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int PERCEPTIBLE_APP_ADJ = 2; 907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are visible to the 92e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // user, so we'd prefer they don't disappear. 937d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int VISIBLE_APP_ADJ = 1; 947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is the process running the current foreground app. We'd really 96e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // rather not kill it! 977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int FOREGROUND_APP_ADJ = 0; 987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 99e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a system persistent process, such as telephony. Definitely 1007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // don't want to kill it, but doing so is not completely fatal. 101e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn static final int PERSISTENT_PROC_ADJ = -12; 1027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The system process runs at the default adjustment. 1047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int SYSTEM_ADJ = -16; 1057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1068e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn // Special code for native processes that are not being managed by the system (so 1078e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn // don't have an oom adj assigned by the system). 1088e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn static final int NATIVE_ADJ = -17; 1098e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 1107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Memory pages are 4K. 1117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int PAGE_SIZE = 4*1024; 1127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 113be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // The minimum number of cached apps we want to be able to keep around, 1147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // without empty apps being able to push them out of memory. 115be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn static final int MIN_CACHED_APPS = 2; 1167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1172286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // The maximum number of cached processes we will keep around before killing them. 1182286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // NOTE: this constant is *only* a control to not let us go too crazy with 1192286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // keeping around processes on devices with large amounts of RAM. For devices that 1202286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // are tighter on RAM, the out of memory killer is responsible for killing background 1212286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // processes as RAM is needed, and we should *never* be relying on this limit to 1222286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // kill them. Also note that this limit only applies to cached background processes; 1232286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // we have no limit on the number of service, visible, foreground, or other such 1242286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // processes and the number of those processes does not count against the cached 1252286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // process limit. 126be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn static final int MAX_CACHED_APPS = 24; 127b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 128b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // We allow empty processes to stick around for at most 30 minutes. 129b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final long MAX_EMPTY_TIME = 30*60*1000; 130b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 1312286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // The maximum number of empty app processes we will let sit around. 1322286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn private static final int MAX_EMPTY_APPS = computeEmptyProcessLimit(MAX_CACHED_APPS); 133b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 134b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // The number of empty apps at which we don't consider it necessary to do 135b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // memory trimming. 1362286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn static final int TRIM_EMPTY_APPS = MAX_EMPTY_APPS/2; 1372286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn 1382286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // The number of cached at which we don't consider it necessary to do 1392286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn // memory trimming. 1402610b7cb2a197a3f3f8f7c3409b6962353684159Dianne Hackborn static final int TRIM_CACHED_APPS = ((MAX_CACHED_APPS-MAX_EMPTY_APPS)*2)/3; 141b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 142be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // Threshold of number of cached+empty where we consider memory critical. 143b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_CRITICAL_THRESHOLD = 3; 144b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 145be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn // Threshold of number of cached+empty where we consider memory critical. 146b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_LOW_THRESHOLD = 5; 1477d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 148bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // Low Memory Killer Daemon command codes. 149bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // These must be kept in sync with the definitions in lmkd.c 150bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // 151bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_TARGET <minfree> <minkillprio> ... (up to 6 pairs) 152bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_PROCPRIO <pid> <prio> 153bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor // LMK_PROCREMOVE <pid> 154bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_TARGET = 0; 155bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_PROCPRIO = 1; 156bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor static final byte LMK_PROCREMOVE = 2; 157bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 1587d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the various interesting memory levels that we will give to 1597d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // the OOM killer. Note that the OOM killer only supports 6 slots, so we 1607d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // can't give it a different value for every possible kind of process. 1617d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final int[] mOomAdj = new int[] { 1627d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ, 163be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn BACKUP_APP_ADJ, CACHED_APP_MIN_ADJ, CACHED_APP_MAX_ADJ 1647d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1657d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the low-end OOM level limits. This is appropriate for an 1667d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HVGA or smaller phone with less than 512MB. Values are in KB. 167bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFreeLow = new int[] { 1687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 8192, 12288, 16384, 1697d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 24576, 28672, 32768 1707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the high-end OOM level limits. This is appropriate for a 1727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 1280x800 or larger screen with around 1GB RAM. Values are in KB. 173bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFreeHigh = new int[] { 174b5cda42c57bc1f965edd73f6bbe1b0d77a933256Ben Cheng 49152, 61440, 73728, 175b5cda42c57bc1f965edd73f6bbe1b0d77a933256Ben Cheng 86016, 98304, 122880 1767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The actual OOM killer memory levels we are using. 178bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private final int[] mOomMinFree = new int[mOomAdj.length]; 1797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1807d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final long mTotalMemMb; 1817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private long mCachedRestoreLevel; 1833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 1847d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private boolean mHaveDisplaySize; 1857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 186bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static LocalSocket sLmkdSocket; 187bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static OutputStream sLmkdOutputStream; 188bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 1897d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn ProcessList() { 1907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn MemInfoReader minfo = new MemInfoReader(); 1917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn minfo.readMemInfo(); 1927d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mTotalMemMb = minfo.getTotalSize()/(1024*1024); 1937d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(0, 0, false); 1947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 1957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn void applyDisplaySize(WindowManagerService wm) { 1977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (!mHaveDisplaySize) { 1987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn Point p = new Point(); 199637dbfcaf0a1f43f81d3d195461b50bfc0fd5f14Colin Cross wm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, p); 2007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (p.x != 0 && p.y != 0) { 2017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(p.x, p.y, true); 2027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mHaveDisplaySize = true; 2037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private void updateOomLevels(int displayWidth, int displayHeight, boolean write) { 2087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from avail memory: at 300MB we use the lowest values to 2097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 700MB or more for the top values. 2107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scaleMem = ((float)(mTotalMemMb-300))/(700-300); 2117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from screen size. 213635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minSize = 480*800; // 384000 2147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn int maxSize = 1280*800; // 1024000 230400 870400 .264 2157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scaleDisp = ((float)(displayWidth*displayHeight)-minSize)/(maxSize-minSize); 216635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn if (false) { 217635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "scaleMem=" + scaleMem); 218635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "scaleDisp=" + scaleDisp + " dw=" + displayWidth 219635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn + " dh=" + displayHeight); 220635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn } 2217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scale = scaleMem > scaleDisp ? scaleMem : scaleDisp; 2237d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (scale < 0) scale = 0; 2247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn else if (scale > 1) scale = 1; 225635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minfree_adj = Resources.getSystem().getInteger( 226635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAdjust); 227635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn int minfree_abs = Resources.getSystem().getInteger( 228635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAbsolute); 229635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn if (false) { 230635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn Slog.i("XXXXXX", "minfree_adj=" + minfree_adj + " minfree_abs=" + minfree_abs); 231635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn } 232fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 2337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 234bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor int low = mOomMinFreeLow[i]; 235bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor int high = mOomMinFreeHigh[i]; 236bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor mOomMinFree[i] = (int)(low + ((high-low)*scale)); 237fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 238fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 239fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (minfree_abs >= 0) { 240fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross for (int i=0; i<mOomAdj.length; i++) { 241bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor mOomMinFree[i] = (int)((float)minfree_abs * mOomMinFree[i] / mOomMinFree[mOomAdj.length - 1]); 242fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 243fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 2447d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 245fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (minfree_adj != 0) { 246fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross for (int i=0; i<mOomAdj.length; i++) { 247bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor mOomMinFree[i] += (int)((float)minfree_adj * mOomMinFree[i] / mOomMinFree[mOomAdj.length - 1]); 248fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross if (mOomMinFree[i] < 0) { 249fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross mOomMinFree[i] = 0; 250fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 251fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 252fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross } 253fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross 2543bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // The maximum size we will restore a process from cached to background, when under 2553bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // memory duress, is 1/3 the size we have reserved for kernel caches and other overhead 2563bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // before killing background processes. 2573bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn mCachedRestoreLevel = (getMemLevel(ProcessList.CACHED_APP_MAX_ADJ)/1024) / 3; 2583bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 25959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross // Ask the kernel to try to keep enough memory free to allocate 3 full 26059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross // screen 32bpp buffers without entering direct reclaim. 26159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve = displayWidth * displayHeight * 4 * 3 / 1024; 26259d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve_adj = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAdjust); 26359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross int reserve_abs = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAbsolute); 26459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 26559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve_abs >= 0) { 26659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve = reserve_abs; 26759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 26859d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 26959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve_adj != 0) { 27059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve += reserve_adj; 27159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross if (reserve < 0) { 27259d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross reserve = 0; 27359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 27459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross } 27559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross 2767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (write) { 277bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor ByteBuffer buf = ByteBuffer.allocate(4 * (2*mOomAdj.length + 1)); 278bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_TARGET); 279bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor for (int i=0; i<mOomAdj.length; i++) { 280bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt((mOomMinFree[i]*1024)/PAGE_SIZE); 281bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(mOomAdj[i]); 282bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 283bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 284bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 28559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross SystemProperties.set("sys.sysctl.extra_free_kbytes", Integer.toString(reserve)); 2867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // GB: 2048,3072,4096,6144,7168,8192 2887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HC: 8192,10240,12288,14336,16384,20480 2897d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2912286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn public static int computeEmptyProcessLimit(int totalProcessLimit) { 2922286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn return (totalProcessLimit*2)/3; 2932286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn } 2942286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn 2958e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn private static String buildOomTag(String prefix, String space, int val, int base) { 2968e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (val == base) { 2978e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (space == null) return prefix; 2988e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return prefix + " "; 2998e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3008e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return prefix + "+" + Integer.toString(val-base); 3018e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3028e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 3038e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn public static String makeOomAdjString(int setAdj) { 3048e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) { 3058e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("cch", " ", setAdj, ProcessList.CACHED_APP_MIN_ADJ); 3068e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SERVICE_B_ADJ) { 3078e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("svcb ", null, setAdj, ProcessList.SERVICE_B_ADJ); 3088e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PREVIOUS_APP_ADJ) { 3098e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("prev ", null, setAdj, ProcessList.PREVIOUS_APP_ADJ); 3108e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.HOME_APP_ADJ) { 3118e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("home ", null, setAdj, ProcessList.HOME_APP_ADJ); 3128e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SERVICE_ADJ) { 3138e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("svc ", null, setAdj, ProcessList.SERVICE_ADJ); 3148e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.HEAVY_WEIGHT_APP_ADJ) { 3158e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("hvy ", null, setAdj, ProcessList.HEAVY_WEIGHT_APP_ADJ); 3168e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.BACKUP_APP_ADJ) { 3178e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("bkup ", null, setAdj, ProcessList.BACKUP_APP_ADJ); 3188e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) { 3198e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("prcp ", null, setAdj, ProcessList.PERCEPTIBLE_APP_ADJ); 3208e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.VISIBLE_APP_ADJ) { 3218e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("vis ", null, setAdj, ProcessList.VISIBLE_APP_ADJ); 3228e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.FOREGROUND_APP_ADJ) { 3238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("fore ", null, setAdj, ProcessList.FOREGROUND_APP_ADJ); 3248e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.PERSISTENT_PROC_ADJ) { 3258e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("pers ", null, setAdj, ProcessList.PERSISTENT_PROC_ADJ); 3268e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.SYSTEM_ADJ) { 3278e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("sys ", null, setAdj, ProcessList.SYSTEM_ADJ); 3288e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else if (setAdj >= ProcessList.NATIVE_ADJ) { 3298e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return buildOomTag("ntv ", null, setAdj, ProcessList.NATIVE_ADJ); 3308e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } else { 3318e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn return Integer.toString(setAdj); 3328e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3338e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn } 3348e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn 3353bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn public static String makeProcStateString(int curProcState) { 3363bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn String procState; 3373bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn switch (curProcState) { 3383bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case -1: 3393bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "N "; 3403bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3413bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_PERSISTENT: 3423bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "P "; 3433bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3443bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_PERSISTENT_UI: 3453bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "PU"; 3463bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3473bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_TOP: 3483bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "T "; 3493bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3503bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND: 3513bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "IF"; 3523bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3533bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND: 3543bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "IB"; 3553bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3563bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_BACKUP: 3573bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "BU"; 3583bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3593bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT: 3603bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "HW"; 3613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3623bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_SERVICE: 3633bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "S "; 3643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3653bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_RECEIVER: 3663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "R "; 3673bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_HOME: 3693bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "HO"; 3703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_LAST_ACTIVITY: 3723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "LA"; 3733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY: 3753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "CA"; 3763bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3773bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT: 3783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "Ca"; 3793bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn case ActivityManager.PROCESS_STATE_CACHED_EMPTY: 3813bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "CE"; 3823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn default: 3843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn procState = "??"; 3853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn break; 3863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 3873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return procState; 3883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 3893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 3903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn public static void appendRamKb(StringBuilder sb, long ramKb) { 3913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn for (int j=0, fact=10; j<6; j++, fact*=10) { 3923bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn if (ramKb < fact) { 3933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn sb.append(' '); 3943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 3953bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 3963bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn sb.append(ramKb); 3973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 3983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 399f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The minimum amount of time after a state change it is safe ro collect PSS. 400f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_MIN_TIME_FROM_STATE_CHANGE = 15*1000; 401f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 402f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The maximum amount of time we want to go between PSS collections. 403f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_MAX_INTERVAL = 30*60*1000; 404f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 405f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The minimum amount of time between successive PSS requests for *all* processes. 406f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PSS_ALL_INTERVAL = 10*60*1000; 407f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 408f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The minimum amount of time between successive PSS requests for a process. 409f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SHORT_INTERVAL = 2*60*1000; 410f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 411f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a process first becomes top. 4123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_TOP_INTERVAL = 10*1000; 4133bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 4143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn // The amount of time until PSS when a process first goes into the background. 4153bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_BACKGROUND_INTERVAL = 20*1000; 416f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 417f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a process first becomes cached. 4183bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn private static final int PSS_FIRST_CACHED_INTERVAL = 30*1000; 419f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 420f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when an important process stays in the same state. 421f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SAME_IMPORTANT_INTERVAL = 15*60*1000; 422f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 423f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a service process stays in the same state. 424f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SAME_SERVICE_INTERVAL = 20*60*1000; 425f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 426f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn // The amount of time until PSS when a cached process stays in the same state. 427f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int PSS_SAME_CACHED_INTERVAL = 30*60*1000; 428f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 429f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_PERSISTENT = 0; 430f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_TOP = 1; 431f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_IMPORTANT = 2; 432f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_SERVICE = 3; 433f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static final int PROC_MEM_CACHED = 4; 434f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 435f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final int[] sProcStateToProcMem = new int[] { 436f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT 437f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_PERSISTENT, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 438f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_TOP, // ActivityManager.PROCESS_STATE_TOP 439f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 440f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 441f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_BACKUP 442f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_IMPORTANT, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 443f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_SERVICE, // ActivityManager.PROCESS_STATE_SERVICE 444f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_RECEIVER 445f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_HOME 446f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 447f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 448f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 449f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PROC_MEM_CACHED, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 450f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 451f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 452f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final long[] sFirstAwakePssTimes = new long[] { 453f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SHORT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 454f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SHORT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 455f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_TOP_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 4563bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 4573bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 4583bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 4593bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 4603bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 4613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 462f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 463f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 464f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 465f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 466f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_FIRST_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 467f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 468f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 469f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn private static final long[] sSameAwakePssTimes = new long[] { 470f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT 471f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_PERSISTENT_UI 472f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SHORT_INTERVAL, // ActivityManager.PROCESS_STATE_TOP 473f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND 474f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND 475f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP 476f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_IMPORTANT_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT 477f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_SERVICE_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE 478f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_SERVICE_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER 479f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_HOME 480f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY 481f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY 482f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT 483f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn PSS_SAME_CACHED_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY 484f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn }; 485f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 486f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static boolean procStatesDifferForMem(int procState1, int procState2) { 487f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn return sProcStateToProcMem[procState1] != sProcStateToProcMem[procState2]; 488f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 489f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 490f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn public static long computeNextPssTime(int procState, boolean first, boolean sleeping, 491f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn long now) { 492f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn final long[] table = sleeping 493f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn ? (first 494f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn ? sFirstAwakePssTimes 495f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn : sSameAwakePssTimes) 496f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn : (first 497f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn ? sFirstAwakePssTimes 498f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn : sSameAwakePssTimes); 499f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn return now + table[procState]; 500f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn } 501f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn 5027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn long getMemLevel(int adjustment) { 5037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 5047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (adjustment <= mOomAdj[i]) { 5057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[i] * 1024; 5067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 5077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 5087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[mOomAdj.length-1] * 1024; 5097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 5107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 511bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor /** 5123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn * Return the maximum pss size in kb that we consider a process acceptable to 5133bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn * restore from its cached state for running in the background when RAM is low. 5143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn */ 515cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn long getCachedRestoreThresholdKb() { 5163bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn return mCachedRestoreLevel; 5173bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn } 5183bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn 5199bef5b67dc48568e6f8be065dd7016f04058351cDianne Hackborn /** 520bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * Set the out-of-memory badness adjustment for a process. 521bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * 522bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * @param pid The process identifier to set. 523d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross * @param uid The uid of the app 524bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * @param amt Adjustment value -- lmkd allows -16 to +15. 525bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * 526bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * {@hide} 527bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor */ 528d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross public static final void setOomAdj(int pid, int uid, int amt) { 529bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (amt == UNKNOWN_ADJ) 530bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return; 531bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 532ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn long start = SystemClock.elapsedRealtime(); 533d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross ByteBuffer buf = ByteBuffer.allocate(4 * 4); 534bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_PROCPRIO); 535bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(pid); 536d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross buf.putInt(uid); 537bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(amt); 538bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 539ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn long now = SystemClock.elapsedRealtime(); 540ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn if ((now-start) > 250) { 541ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn Slog.w("ActivityManager", "SLOW OOM ADJ: " + (now-start) + "ms for pid " + pid 542ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn + " = " + amt); 543ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn } 544bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 545bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 546bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor /* 547bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor * {@hide} 548bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor */ 549bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor public static final void remove(int pid) { 550bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor ByteBuffer buf = ByteBuffer.allocate(4 * 2); 551bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(LMK_PROCREMOVE); 552bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor buf.putInt(pid); 553bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor writeLmkd(buf); 554bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 555bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 556bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static boolean openLmkdSocket() { 5577d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 558bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = new LocalSocket(LocalSocket.SOCKET_SEQPACKET); 559bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket.connect( 560bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor new LocalSocketAddress("lmkd", 561bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor LocalSocketAddress.Namespace.RESERVED)); 562bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdOutputStream = sLmkdSocket.getOutputStream(); 563bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex) { 564bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor Slog.w(ActivityManagerService.TAG, 565bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor "lowmemorykiller daemon socket open failed"); 566bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = null; 567bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return false; 568bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 569bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 570bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return true; 571bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 572bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 573bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor private static void writeLmkd(ByteBuffer buf) { 574bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 575bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor for (int i = 0; i < 3; i++) { 576bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (sLmkdSocket == null) { 577bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor if (openLmkdSocket() == false) { 578bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor try { 579bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor Thread.sleep(1000); 580bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (InterruptedException ie) { 581bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 582bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor continue; 583bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 584bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } 585bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 586bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor try { 587bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdOutputStream.write(buf.array(), 0, buf.position()); 588bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor return; 589bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex) { 590bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor Slog.w(ActivityManagerService.TAG, 591bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor "Error writing to lowmemorykiller socket"); 592bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 5937d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 594bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket.close(); 595bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor } catch (IOException ex2) { 5967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 597bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor 598bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor sLmkdSocket = null; 5997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 6027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn} 603