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