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