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.FileOutputStream; 207d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport java.io.IOException; 217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.internal.util.MemInfoReader; 237d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.server.wm.WindowManagerService; 247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.graphics.Point; 267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.util.Slog; 2759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display; 287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/** 307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Activity manager code dealing with processes. 317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */ 327d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornclass ProcessList { 337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The minimum time we allow between crashes, for us to consider this 347d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // application to be bad and stop and its services and reject broadcasts. 357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int MIN_CRASH_INTERVAL = 60*1000; 367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // OOM adjustments for processes in various states: 387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are not visible, 40e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // so it can be killed without any disruption. 417d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int HIDDEN_APP_MAX_ADJ = 15; 42f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn static int HIDDEN_APP_MIN_ADJ = 9; 43e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn 44e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // The B list of SERVICE_ADJ -- these are the old and decrepit 45e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // services that aren't as shiny and interesting as the ones in the A list. 46f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn static final int SERVICE_B_ADJ = 8; 47f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn 48f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This is the process of the previous application that the user was in. 49f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // This process is kept above other things, because it is very common to 50f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // switch back to the previous app. This is important both for recent 51f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // task switch (toggling between the two top recent apps) as well as normal 52f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // UI flow such as clicking on a URI in the e-mail app to view in the browser, 53f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn // and then pressing back to return to e-mail. 54f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn static final int PREVIOUS_APP_ADJ = 7; 557d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 567d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process holding the home application -- we want to try 577d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // avoiding killing it, even if it would normally be in the background, 587d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // because the user interacts with it so much. 597d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int HOME_APP_ADJ = 6; 607d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 61e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a process holding an application service -- killing it will not 62e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // have much of an impact as far as the user is concerned. 63e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn static final int SERVICE_ADJ = 5; 647d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 657d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process currently hosting a backup operation. Killing it 667d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // is not entirely fatal but is generally a bad idea. 677d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int BACKUP_APP_ADJ = 4; 687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 697d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process with a heavy-weight application. It is in the 707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // background, but we want to try to avoid killing it. Value set in 717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // system/rootdir/init.rc on startup. 727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int HEAVY_WEIGHT_APP_ADJ = 3; 737d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 747d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting components that are perceptible to the 757d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // user, and we really want to avoid killing them, but they are not 76e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // immediately visible. An example is background music playback. 777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int PERCEPTIBLE_APP_ADJ = 2; 787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is a process only hosting activities that are visible to the 80e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // user, so we'd prefer they don't disappear. 817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int VISIBLE_APP_ADJ = 1; 827d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 837d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // This is the process running the current foreground app. We'd really 84e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // rather not kill it! 857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int FOREGROUND_APP_ADJ = 0; 867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 87e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn // This is a system persistent process, such as telephony. Definitely 887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // don't want to kill it, but doing so is not completely fatal. 89e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn static final int PERSISTENT_PROC_ADJ = -12; 907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The system process runs at the default adjustment. 927d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int SYSTEM_ADJ = -16; 937d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Memory pages are 4K. 957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int PAGE_SIZE = 4*1024; 967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The minimum number of hidden apps we want to be able to keep around, 987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // without empty apps being able to push them out of memory. 997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final int MIN_HIDDEN_APPS = 2; 1007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The maximum number of hidden processes we will keep around before 1027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // killing them; this is just a control to not let us go too crazy with 1037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // keeping around processes on devices with large amounts of RAM. 104b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int MAX_HIDDEN_APPS = 24; 105b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 106b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // We allow empty processes to stick around for at most 30 minutes. 107b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final long MAX_EMPTY_TIME = 30*60*1000; 108b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 109b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // The number of hidden at which we don't consider it necessary to do 110b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // memory trimming. 111b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_HIDDEN_APPS = 3; 112b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 113b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // The number of empty apps at which we don't consider it necessary to do 114b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // memory trimming. 115b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_EMPTY_APPS = 3; 116b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 117b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // Threshold of number of hidden+empty where we consider memory critical. 118b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_CRITICAL_THRESHOLD = 3; 119b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn 120b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn // Threshold of number of hidden+empty where we consider memory critical. 121b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn static final int TRIM_LOW_THRESHOLD = 5; 1227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1237d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // We put empty content processes after any hidden processes that have 1247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // been idle for less than 15 seconds. 1257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final long CONTENT_APP_IDLE_OFFSET = 15*1000; 1267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // We put empty content processes after any hidden processes that have 1287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // been idle for less than 120 seconds. 1297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn static final long EMPTY_APP_IDLE_OFFSET = 120*1000; 1307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the various interesting memory levels that we will give to 1327d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // the OOM killer. Note that the OOM killer only supports 6 slots, so we 1337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // can't give it a different value for every possible kind of process. 1347d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final int[] mOomAdj = new int[] { 1357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ, 136e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn BACKUP_APP_ADJ, HIDDEN_APP_MIN_ADJ, HIDDEN_APP_MAX_ADJ 1377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the low-end OOM level limits. This is appropriate for an 1397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HVGA or smaller phone with less than 512MB. Values are in KB. 1407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final long[] mOomMinFreeLow = new long[] { 1417d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 8192, 12288, 16384, 1427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 24576, 28672, 32768 1437d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1447d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // These are the high-end OOM level limits. This is appropriate for a 1457d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 1280x800 or larger screen with around 1GB RAM. Values are in KB. 1467d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final long[] mOomMinFreeHigh = new long[] { 1477d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 32768, 40960, 49152, 1487d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 57344, 65536, 81920 1497d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn }; 1507d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // The actual OOM killer memory levels we are using. 1517d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final long[] mOomMinFree = new long[mOomAdj.length]; 1527d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1537d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private final long mTotalMemMb; 1547d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1557d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private boolean mHaveDisplaySize; 1567d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1577d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn ProcessList() { 1587d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn MemInfoReader minfo = new MemInfoReader(); 1597d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn minfo.readMemInfo(); 1607d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mTotalMemMb = minfo.getTotalSize()/(1024*1024); 1617d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(0, 0, false); 1627d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 1637d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1647d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn void applyDisplaySize(WindowManagerService wm) { 1657d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (!mHaveDisplaySize) { 1667d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn Point p = new Point(); 16759c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautner wm.getInitialDisplaySize(Display.DEFAULT_DISPLAY, p); 1687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (p.x != 0 && p.y != 0) { 1697d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn updateOomLevels(p.x, p.y, true); 1707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mHaveDisplaySize = true; 1717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 1727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 1737d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 1747d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1757d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private void updateOomLevels(int displayWidth, int displayHeight, boolean write) { 1767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from avail memory: at 300MB we use the lowest values to 1777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // 700MB or more for the top values. 1787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scaleMem = ((float)(mTotalMemMb-300))/(700-300); 1797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1807d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // Scale buckets from screen size. 1817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn int minSize = 320*480; // 153600 1827d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn int maxSize = 1280*800; // 1024000 230400 870400 .264 1837d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scaleDisp = ((float)(displayWidth*displayHeight)-minSize)/(maxSize-minSize); 184295e3c27e4e3762a002382fc1657f5f0070a3410Dianne Hackborn //Slog.i("XXXXXX", "scaleDisp=" + scaleDisp + " dw=" + displayWidth + " dh=" + displayHeight); 1857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn StringBuilder adjString = new StringBuilder(); 1877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn StringBuilder memString = new StringBuilder(); 1887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1897d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn float scale = scaleMem > scaleDisp ? scaleMem : scaleDisp; 1907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (scale < 0) scale = 0; 1917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn else if (scale > 1) scale = 1; 1927d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 1937d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn long low = mOomMinFreeLow[i]; 1947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn long high = mOomMinFreeHigh[i]; 1957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn mOomMinFree[i] = (long)(low + ((high-low)*scale)); 1967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 1977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (i > 0) { 1987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn adjString.append(','); 1997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn memString.append(','); 2007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn adjString.append(mOomAdj[i]); 2027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn memString.append((mOomMinFree[i]*1024)/PAGE_SIZE); 2037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn //Slog.i("XXXXXXX", "******************************* MINFREE: " + memString); 2067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (write) { 2077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn writeFile("/sys/module/lowmemorykiller/parameters/adj", adjString.toString()); 2087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn writeFile("/sys/module/lowmemorykiller/parameters/minfree", memString.toString()); 2097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // GB: 2048,3072,4096,6144,7168,8192 2117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn // HC: 8192,10240,12288,14336,16384,20480 2127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn long getMemLevel(int adjustment) { 2157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn for (int i=0; i<mOomAdj.length; i++) { 2167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (adjustment <= mOomAdj[i]) { 2177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[i] * 1024; 2187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2207d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn return mOomMinFree[mOomAdj.length-1] * 1024; 2217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn 2237d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn private void writeFile(String path, String data) { 2247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn FileOutputStream fos = null; 2257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 2267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn fos = new FileOutputStream(path); 2277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn fos.write(data.getBytes()); 2287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } catch (IOException e) { 2297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn Slog.w(ActivityManagerService.TAG, "Unable to write " + path); 2307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } finally { 2317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn if (fos != null) { 2327d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn try { 2337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn fos.close(); 2347d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } catch (IOException e) { 2357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn } 2397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn} 240