ProcessList.java revision 352dc57186ff796dbb7a095c609d1a0bae5d3fca
17d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/*
27d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Copyright (C) 2011 The Android Open Source Project
37d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn *
47d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License");
57d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * you may not use this file except in compliance with the License.
67d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * You may obtain a copy of the License at
77d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn *
87d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn *      http://www.apache.org/licenses/LICENSE-2.0
97d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn *
107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Unless required by applicable law or agreed to in writing, software
117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS,
127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * See the License for the specific language governing permissions and
147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * limitations under the License.
157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */
167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornpackage com.android.server.am;
187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
19e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
20e23149f1555303940d212b742707518b7f9f84abWale Ogunwaleimport static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
21e23149f1555303940d212b742707518b7f9f84abWale Ogunwale
227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport java.io.IOException;
23bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.io.OutputStream;
24bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.nio.ByteBuffer;
257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
268e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackbornimport android.app.ActivityManager;
279d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackbornimport android.os.Build;
28ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackbornimport android.os.SystemClock;
297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.internal.util.MemInfoReader;
307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.server.wm.WindowManagerService;
317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
32fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Crossimport android.content.res.Resources;
337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.graphics.Point;
3459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Crossimport android.os.SystemProperties;
35bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocketAddress;
36bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocket;
377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.util.Slog;
3859c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display;
397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/**
417d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Activity manager code dealing with processes.
427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */
43352dc57186ff796dbb7a095c609d1a0bae5d3fcaSudheer Shankapublic final class ProcessList {
44e23149f1555303940d212b742707518b7f9f84abWale Ogunwale    private static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessList" : TAG_AM;
45e23149f1555303940d212b742707518b7f9f84abWale Ogunwale
467d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // The minimum time we allow between crashes, for us to consider this
477d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // application to be bad and stop and its services and reject broadcasts.
487d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    static final int MIN_CRASH_INTERVAL = 60*1000;
497d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
507d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // OOM adjustments for processes in various states:
517d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
52fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    // Uninitialized value for any major or minor adj fields
53fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int INVALID_ADJ = -10000;
54fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang
55c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // Adjustment used in certain places where we don't know it yet.
56c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // (Generally this is something that is going to be cached, but we
57c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // don't know the exact value in the cached range to assign yet.)
58fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int UNKNOWN_ADJ = 1001;
59c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn
607d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process only hosting activities that are not visible,
61e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // so it can be killed without any disruption.
62fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int CACHED_APP_MAX_ADJ = 906;
63fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int CACHED_APP_MIN_ADJ = 900;
64e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn
65e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // The B list of SERVICE_ADJ -- these are the old and decrepit
66e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // services that aren't as shiny and interesting as the ones in the A list.
67fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int SERVICE_B_ADJ = 800;
68f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn
69f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // This is the process of the previous application that the user was in.
70f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // This process is kept above other things, because it is very common to
71f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // switch back to the previous app.  This is important both for recent
72f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // task switch (toggling between the two top recent apps) as well as normal
73f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // UI flow such as clicking on a URI in the e-mail app to view in the browser,
74f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // and then pressing back to return to e-mail.
75fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int PREVIOUS_APP_ADJ = 700;
767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process holding the home application -- we want to try
787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // avoiding killing it, even if it would normally be in the background,
797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // because the user interacts with it so much.
80fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int HOME_APP_ADJ = 600;
817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
82e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // This is a process holding an application service -- killing it will not
83e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // have much of an impact as far as the user is concerned.
84fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int SERVICE_ADJ = 500;
857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process with a heavy-weight application.  It is in the
877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // background, but we want to try to avoid killing it.  Value set in
887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // system/rootdir/init.rc on startup.
89fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int HEAVY_WEIGHT_APP_ADJ = 400;
90c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn
91c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // This is a process currently hosting a backup operation.  Killing it
92c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // is not entirely fatal but is generally a bad idea.
93fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int BACKUP_APP_ADJ = 300;
947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process only hosting components that are perceptible to the
967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // user, and we really want to avoid killing them, but they are not
97e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // immediately visible. An example is background music playback.
98fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int PERCEPTIBLE_APP_ADJ = 200;
997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process only hosting activities that are visible to the
101e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // user, so we'd prefer they don't disappear.
102fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int VISIBLE_APP_ADJ = 100;
103fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int VISIBLE_APP_LAYER_MAX = PERCEPTIBLE_APP_ADJ - VISIBLE_APP_ADJ - 1;
1047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is the process running the current foreground app.  We'd really
106e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // rather not kill it!
1077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    static final int FOREGROUND_APP_ADJ = 0;
1087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
109ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn    // This is a process that the system or a persistent process has bound to,
110ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn    // and indicated it is important.
111fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int PERSISTENT_SERVICE_ADJ = -700;
112ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn
113e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // This is a system persistent process, such as telephony.  Definitely
1147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // don't want to kill it, but doing so is not completely fatal.
115fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int PERSISTENT_PROC_ADJ = -800;
1167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // The system process runs at the default adjustment.
118fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int SYSTEM_ADJ = -900;
1197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1208e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    // Special code for native processes that are not being managed by the system (so
1218e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    // don't have an oom adj assigned by the system).
122fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int NATIVE_ADJ = -1000;
1238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn
1247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // Memory pages are 4K.
1257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    static final int PAGE_SIZE = 4*1024;
1267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
127a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    // Activity manager's version of Process.THREAD_GROUP_BG_NONINTERACTIVE
128a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    static final int SCHED_GROUP_BACKGROUND = 0;
129a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    // Activity manager's version of Process.THREAD_GROUP_DEFAULT
130a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    static final int SCHED_GROUP_DEFAULT = 1;
131a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    // Activity manager's version of Process.THREAD_GROUP_TOP_APP
132a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    static final int SCHED_GROUP_TOP_APP = 2;
13333eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray    // Activity manager's version of Process.THREAD_GROUP_TOP_APP
13433eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray    // Disambiguate between actual top app and processes bound to the top app
13533eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray    static final int SCHED_GROUP_TOP_APP_BOUND = 3;
136a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn
137be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn    // The minimum number of cached apps we want to be able to keep around,
1387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // without empty apps being able to push them out of memory.
139be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn    static final int MIN_CACHED_APPS = 2;
1407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
141b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    // We allow empty processes to stick around for at most 30 minutes.
142b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    static final long MAX_EMPTY_TIME = 30*60*1000;
143b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn
144be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn    // Threshold of number of cached+empty where we consider memory critical.
145b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    static final int TRIM_CRITICAL_THRESHOLD = 3;
146b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn
147be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn    // Threshold of number of cached+empty where we consider memory critical.
148b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    static final int TRIM_LOW_THRESHOLD = 5;
1497d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
150bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    // Low Memory Killer Daemon command codes.
151bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    // These must be kept in sync with the definitions in lmkd.c
152bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    //
153bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    // LMK_TARGET <minfree> <minkillprio> ... (up to 6 pairs)
154fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    // LMK_PROCPRIO <pid> <uid> <prio>
155bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    // LMK_PROCREMOVE <pid>
156bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    static final byte LMK_TARGET = 0;
157bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    static final byte LMK_PROCPRIO = 1;
158bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    static final byte LMK_PROCREMOVE = 2;
159bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
1607d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // These are the various interesting memory levels that we will give to
1617d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // the OOM killer.  Note that the OOM killer only supports 6 slots, so we
1627d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // can't give it a different value for every possible kind of process.
1637d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private final int[] mOomAdj = new int[] {
1647d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ,
165be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn            BACKUP_APP_ADJ, CACHED_APP_MIN_ADJ, CACHED_APP_MAX_ADJ
1667d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    };
1677d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // These are the low-end OOM level limits.  This is appropriate for an
1687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // HVGA or smaller phone with less than 512MB.  Values are in KB.
169bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private final int[] mOomMinFreeLow = new int[] {
1703f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn            12288, 18432, 24576,
1713f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn            36864, 43008, 49152
1727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    };
1737d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // These are the high-end OOM level limits.  This is appropriate for a
1747d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // 1280x800 or larger screen with around 1GB RAM.  Values are in KB.
175bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private final int[] mOomMinFreeHigh = new int[] {
1763f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn            73728, 92160, 110592,
177824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn            129024, 147456, 184320
1787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    };
1797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // The actual OOM killer memory levels we are using.
180bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private final int[] mOomMinFree = new int[mOomAdj.length];
1817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1827d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private final long mTotalMemMb;
1837d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    private long mCachedRestoreLevel;
1853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
1867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private boolean mHaveDisplaySize;
1877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
188bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private static LocalSocket sLmkdSocket;
189bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private static OutputStream sLmkdOutputStream;
190bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
1917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    ProcessList() {
1927d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        MemInfoReader minfo = new MemInfoReader();
1937d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        minfo.readMemInfo();
1947d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        mTotalMemMb = minfo.getTotalSize()/(1024*1024);
1957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        updateOomLevels(0, 0, false);
1967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
1977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    void applyDisplaySize(WindowManagerService wm) {
1997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        if (!mHaveDisplaySize) {
2007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            Point p = new Point();
2011e32e025ad5677ce4e3697ca026c2019fe0bd8e9Andrii Kulian            // TODO(multi-display): Compute based on sum of all connected displays' resolutions.
202637dbfcaf0a1f43f81d3d195461b50bfc0fd5f14Colin Cross            wm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, p);
2037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            if (p.x != 0 && p.y != 0) {
2047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                updateOomLevels(p.x, p.y, true);
2057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                mHaveDisplaySize = true;
2067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            }
2077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
2087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
2097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
2107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private void updateOomLevels(int displayWidth, int displayHeight, boolean write) {
2117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // Scale buckets from avail memory: at 300MB we use the lowest values to
2127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // 700MB or more for the top values.
213824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn        float scaleMem = ((float)(mTotalMemMb-350))/(700-350);
2147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
2157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // Scale buckets from screen size.
216635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        int minSize = 480*800;  //  384000
2177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        int maxSize = 1280*800; // 1024000  230400 870400  .264
2187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        float scaleDisp = ((float)(displayWidth*displayHeight)-minSize)/(maxSize-minSize);
219635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        if (false) {
220635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn            Slog.i("XXXXXX", "scaleMem=" + scaleMem);
221635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn            Slog.i("XXXXXX", "scaleDisp=" + scaleDisp + " dw=" + displayWidth
222635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn                    + " dh=" + displayHeight);
223635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        }
2247d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
2257d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        float scale = scaleMem > scaleDisp ? scaleMem : scaleDisp;
2267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        if (scale < 0) scale = 0;
2277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        else if (scale > 1) scale = 1;
228635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        int minfree_adj = Resources.getSystem().getInteger(
229635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn                com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAdjust);
230635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        int minfree_abs = Resources.getSystem().getInteger(
231635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn                com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAbsolute);
232635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        if (false) {
233635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn            Slog.i("XXXXXX", "minfree_adj=" + minfree_adj + " minfree_abs=" + minfree_abs);
234635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        }
235fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross
236c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn        final boolean is64bit = Build.SUPPORTED_64_BIT_ABIS.length > 0;
2379d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn
2387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        for (int i=0; i<mOomAdj.length; i++) {
239bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            int low = mOomMinFreeLow[i];
240bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            int high = mOomMinFreeHigh[i];
241c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn            if (is64bit) {
242c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn                // Increase the high min-free levels for cached processes for 64-bit
243c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn                if (i == 4) high = (high*3)/2;
244c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn                else if (i == 5) high = (high*7)/4;
245c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn            }
246bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            mOomMinFree[i] = (int)(low + ((high-low)*scale));
247fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        }
248fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross
249fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        if (minfree_abs >= 0) {
250fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross            for (int i=0; i<mOomAdj.length; i++) {
2519d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn                mOomMinFree[i] = (int)((float)minfree_abs * mOomMinFree[i]
2529d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn                        / mOomMinFree[mOomAdj.length - 1]);
253fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross            }
254fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        }
2557d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
256fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        if (minfree_adj != 0) {
257fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross            for (int i=0; i<mOomAdj.length; i++) {
2589d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn                mOomMinFree[i] += (int)((float)minfree_adj * mOomMinFree[i]
2599d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn                        / mOomMinFree[mOomAdj.length - 1]);
260fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross                if (mOomMinFree[i] < 0) {
261fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross                    mOomMinFree[i] = 0;
262fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross                }
263fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross            }
264fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        }
265fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross
2663bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        // The maximum size we will restore a process from cached to background, when under
2673bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        // memory duress, is 1/3 the size we have reserved for kernel caches and other overhead
2683bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        // before killing background processes.
2693bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        mCachedRestoreLevel = (getMemLevel(ProcessList.CACHED_APP_MAX_ADJ)/1024) / 3;
2703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
27159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        // Ask the kernel to try to keep enough memory free to allocate 3 full
27259d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        // screen 32bpp buffers without entering direct reclaim.
27359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        int reserve = displayWidth * displayHeight * 4 * 3 / 1024;
27459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        int reserve_adj = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAdjust);
27559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        int reserve_abs = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAbsolute);
27659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross
27759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        if (reserve_abs >= 0) {
27859d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            reserve = reserve_abs;
27959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        }
28059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross
28159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        if (reserve_adj != 0) {
28259d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            reserve += reserve_adj;
28359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            if (reserve < 0) {
28459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross                reserve = 0;
28559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            }
28659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        }
28759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross
2887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        if (write) {
289bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            ByteBuffer buf = ByteBuffer.allocate(4 * (2*mOomAdj.length + 1));
290bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            buf.putInt(LMK_TARGET);
291bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            for (int i=0; i<mOomAdj.length; i++) {
292bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                buf.putInt((mOomMinFree[i]*1024)/PAGE_SIZE);
293bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                buf.putInt(mOomAdj[i]);
294bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            }
295bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
296bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            writeLmkd(buf);
29759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            SystemProperties.set("sys.sysctl.extra_free_kbytes", Integer.toString(reserve));
2987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
2997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // GB: 2048,3072,4096,6144,7168,8192
3007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // HC: 8192,10240,12288,14336,16384,20480
3017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
3027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
3032286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn    public static int computeEmptyProcessLimit(int totalProcessLimit) {
304465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn        return totalProcessLimit/2;
3052286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn    }
3062286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn
3078e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    private static String buildOomTag(String prefix, String space, int val, int base) {
3088e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        if (val == base) {
3098e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            if (space == null) return prefix;
3108e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return prefix + "  ";
3118e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        }
3128e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        return prefix + "+" + Integer.toString(val-base);
3138e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    }
3148e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn
3158e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    public static String makeOomAdjString(int setAdj) {
3168e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
3178e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("cch", "  ", setAdj, ProcessList.CACHED_APP_MIN_ADJ);
3188e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.SERVICE_B_ADJ) {
3198e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("svcb ", null, setAdj, ProcessList.SERVICE_B_ADJ);
3208e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.PREVIOUS_APP_ADJ) {
3218e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("prev ", null, setAdj, ProcessList.PREVIOUS_APP_ADJ);
3228e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.HOME_APP_ADJ) {
3238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("home ", null, setAdj, ProcessList.HOME_APP_ADJ);
3248e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.SERVICE_ADJ) {
3258e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("svc  ", null, setAdj, ProcessList.SERVICE_ADJ);
3268e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.HEAVY_WEIGHT_APP_ADJ) {
3278e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("hvy  ", null, setAdj, ProcessList.HEAVY_WEIGHT_APP_ADJ);
3288e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.BACKUP_APP_ADJ) {
3298e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("bkup ", null, setAdj, ProcessList.BACKUP_APP_ADJ);
3308e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
3318e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("prcp ", null, setAdj, ProcessList.PERCEPTIBLE_APP_ADJ);
3328e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.VISIBLE_APP_ADJ) {
3338e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("vis  ", null, setAdj, ProcessList.VISIBLE_APP_ADJ);
3348e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.FOREGROUND_APP_ADJ) {
3358e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("fore ", null, setAdj, ProcessList.FOREGROUND_APP_ADJ);
336ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn        } else if (setAdj >= ProcessList.PERSISTENT_SERVICE_ADJ) {
337ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn            return buildOomTag("psvc ", null, setAdj, ProcessList.PERSISTENT_SERVICE_ADJ);
3388e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.PERSISTENT_PROC_ADJ) {
3398e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("pers ", null, setAdj, ProcessList.PERSISTENT_PROC_ADJ);
3408e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.SYSTEM_ADJ) {
3418e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("sys  ", null, setAdj, ProcessList.SYSTEM_ADJ);
3428e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.NATIVE_ADJ) {
3438e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("ntv  ", null, setAdj, ProcessList.NATIVE_ADJ);
3448e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else {
3458e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return Integer.toString(setAdj);
3468e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        }
3478e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    }
3488e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn
3493bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    public static String makeProcStateString(int curProcState) {
3503bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        String procState;
3513bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        switch (curProcState) {
3523bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_PERSISTENT:
3539484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "PER ";
3543bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3553bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_PERSISTENT_UI:
3569484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "PERU";
3573bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3583bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_TOP:
359f4dd3711d1164ce6a442306615cac99119022215Dianne Hackborn                procState = "TOP ";
3603bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
361ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn            case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
3629484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "BFGS";
363ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn                break;
3644870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
3659484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "FGS ";
3664870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn                break;
3674870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            case ActivityManager.PROCESS_STATE_TOP_SLEEPING:
3689484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "TPSL";
3694870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn                break;
3703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
3719484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "IMPF";
3723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
3749484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "IMPB";
3753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
37683b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn            case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND:
37783b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn                procState = "TRNB";
37883b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn                break;
3793bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_BACKUP:
3809484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "BKUP";
3813bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT:
3839484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "HVY ";
3843bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_SERVICE:
3869484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "SVC ";
3873bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_RECEIVER:
3899484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "RCVR";
3903bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3913bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_HOME:
3929484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "HOME";
3933bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3943bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_LAST_ACTIVITY:
3959484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "LAST";
3963bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY:
3989484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "CAC ";
3993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
4003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
4019484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "CACC";
4023bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
40368a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn            case ActivityManager.PROCESS_STATE_CACHED_RECENT:
40468a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn                procState = "CRE ";
40568a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn                break;
4063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_CACHED_EMPTY:
4079484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "CEM ";
4083bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
4095614bf5a1ae4522dfc1a041f003cebc9b25c8b93Dianne Hackborn            case ActivityManager.PROCESS_STATE_NONEXISTENT:
4109484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "NONE";
4115614bf5a1ae4522dfc1a041f003cebc9b25c8b93Dianne Hackborn                break;
4123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            default:
4133bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                procState = "??";
4143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
4153bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
4163bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        return procState;
4173bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    }
4183bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
4193bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    public static void appendRamKb(StringBuilder sb, long ramKb) {
4203bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        for (int j=0, fact=10; j<6; j++, fact*=10) {
4213bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (ramKb < fact) {
4223bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                sb.append(' ');
4233bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
4243bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
4253bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        sb.append(ramKb);
4263bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    }
4273bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
428ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    // How long after a state change that it is safe to collect PSS without it being dirty.
429ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    public static final int PSS_SAFE_TIME_FROM_STATE_CHANGE = 1000;
430ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn
431ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    // The minimum time interval after a state change it is safe to collect PSS.
432f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PSS_MIN_TIME_FROM_STATE_CHANGE = 15*1000;
433f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
434f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The maximum amount of time we want to go between PSS collections.
435f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PSS_MAX_INTERVAL = 30*60*1000;
436f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
437f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The minimum amount of time between successive PSS requests for *all* processes.
438f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PSS_ALL_INTERVAL = 10*60*1000;
439f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
440f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The minimum amount of time between successive PSS requests for a process.
441f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final int PSS_SHORT_INTERVAL = 2*60*1000;
442f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
443f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when a process first becomes top.
4443bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    private static final int PSS_FIRST_TOP_INTERVAL = 10*1000;
4453bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
4463bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    // The amount of time until PSS when a process first goes into the background.
4473bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    private static final int PSS_FIRST_BACKGROUND_INTERVAL = 20*1000;
448f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
449f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when a process first becomes cached.
4503bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    private static final int PSS_FIRST_CACHED_INTERVAL = 30*1000;
451f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
452f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when an important process stays in the same state.
453f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final int PSS_SAME_IMPORTANT_INTERVAL = 15*60*1000;
454f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
455f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when a service process stays in the same state.
456f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final int PSS_SAME_SERVICE_INTERVAL = 20*60*1000;
457f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
458f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when a cached process stays in the same state.
459f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final int PSS_SAME_CACHED_INTERVAL = 30*60*1000;
460f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
461ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    // The minimum time interval after a state change it is safe to collect PSS.
462ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    public static final int PSS_TEST_MIN_TIME_FROM_STATE_CHANGE = 10*1000;
463ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn
4641a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    // The amount of time during testing until PSS when a process first becomes top.
4651a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final int PSS_TEST_FIRST_TOP_INTERVAL = 3*1000;
4661a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
4671a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    // The amount of time during testing until PSS when a process first goes into the background.
4681a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final int PSS_TEST_FIRST_BACKGROUND_INTERVAL = 5*1000;
4691a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
4701a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    // The amount of time during testing until PSS when an important process stays in same state.
4711a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final int PSS_TEST_SAME_IMPORTANT_INTERVAL = 10*1000;
4721a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
4731a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    // The amount of time during testing until PSS when a background process stays in same state.
4741a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final int PSS_TEST_SAME_BACKGROUND_INTERVAL = 15*1000;
4751a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
476f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_PERSISTENT = 0;
477f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_TOP = 1;
478f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_IMPORTANT = 2;
479f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_SERVICE = 3;
480f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_CACHED = 4;
481f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
482f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final int[] sProcStateToProcMem = new int[] {
483f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_PERSISTENT,            // ActivityManager.PROCESS_STATE_PERSISTENT
484f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_PERSISTENT,            // ActivityManager.PROCESS_STATE_PERSISTENT_UI
485f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_TOP,                   // ActivityManager.PROCESS_STATE_TOP
486ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
4874870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
4884870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PROC_MEM_TOP,                   // ActivityManager.PROCESS_STATE_TOP_SLEEPING
489f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
490f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
49183b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
492f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_BACKUP
493f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
494f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_SERVICE,               // ActivityManager.PROCESS_STATE_SERVICE
495f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_RECEIVER
496f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_HOME
497f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
498f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
499f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
50068a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_CACHED_RECENT
501f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_CACHED_EMPTY
502f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    };
503f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
504f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final long[] sFirstAwakePssTimes = new long[] {
505f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SHORT_INTERVAL,             // ActivityManager.PROCESS_STATE_PERSISTENT
506f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SHORT_INTERVAL,             // ActivityManager.PROCESS_STATE_PERSISTENT_UI
507f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_FIRST_TOP_INTERVAL,         // ActivityManager.PROCESS_STATE_TOP
508ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
5094870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
5104870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_TOP_SLEEPING
5113bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
5123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
51383b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
5143bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_BACKUP
5153bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
5163bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_SERVICE
5173bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        PSS_FIRST_CACHED_INTERVAL,      // ActivityManager.PROCESS_STATE_RECEIVER
518f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_FIRST_CACHED_INTERVAL,      // ActivityManager.PROCESS_STATE_HOME
519f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_FIRST_CACHED_INTERVAL,      // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
520f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_FIRST_CACHED_INTERVAL,      // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
521f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_FIRST_CACHED_INTERVAL,      // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
52268a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn        PSS_FIRST_CACHED_INTERVAL,      // ActivityManager.PROCESS_STATE_CACHED_RECENT
523f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_FIRST_CACHED_INTERVAL,      // ActivityManager.PROCESS_STATE_CACHED_EMPTY
524f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    };
525f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
526f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final long[] sSameAwakePssTimes = new long[] {
527f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_PERSISTENT
528f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_PERSISTENT_UI
529f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SHORT_INTERVAL,             // ActivityManager.PROCESS_STATE_TOP
530ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
5314870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
5324870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_TOP_SLEEPING
533f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
534f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
53583b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
536f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_BACKUP
537f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
538f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_SERVICE_INTERVAL,      // ActivityManager.PROCESS_STATE_SERVICE
539f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_SERVICE_INTERVAL,      // ActivityManager.PROCESS_STATE_RECEIVER
540f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_CACHED_INTERVAL,       // ActivityManager.PROCESS_STATE_HOME
541f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_CACHED_INTERVAL,       // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
542f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_CACHED_INTERVAL,       // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
543f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_CACHED_INTERVAL,       // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
54468a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn        PSS_SAME_CACHED_INTERVAL,       // ActivityManager.PROCESS_STATE_CACHED_RECENT
545f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PSS_SAME_CACHED_INTERVAL,       // ActivityManager.PROCESS_STATE_CACHED_EMPTY
546f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    };
547f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
5481a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final long[] sTestFirstAwakePssTimes = new long[] {
5491a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_TOP_INTERVAL,        // ActivityManager.PROCESS_STATE_PERSISTENT
5501a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_TOP_INTERVAL,        // ActivityManager.PROCESS_STATE_PERSISTENT_UI
5511a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_TOP_INTERVAL,        // ActivityManager.PROCESS_STATE_TOP
552ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,      // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
5534870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,      // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
5544870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,      // ActivityManager.PROCESS_STATE_TOP_SLEEPING
5551a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
5561a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
55783b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
5581a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_BACKUP
5591a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
5601a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_SERVICE
5611a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_RECEIVER
5621a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_HOME
5631a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
5641a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
5651a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
56668a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_RECENT
5671a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // ActivityManager.PROCESS_STATE_CACHED_EMPTY
5681a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    };
5691a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
5701a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final long[] sTestSameAwakePssTimes = new long[] {
5711a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_PERSISTENT
5721a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_PERSISTENT_UI
5731a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // ActivityManager.PROCESS_STATE_TOP
574ab4bb9d1fec685dab0fce9232c9a3477fab356b3Dianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
5754870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
5764870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // ActivityManager.PROCESS_STATE_TOP_SLEEPING
5771a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
5781a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
57983b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
5801a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // ActivityManager.PROCESS_STATE_BACKUP
5811a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
5821a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_SERVICE
5831a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_RECEIVER
5841a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_HOME
5851a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
5861a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
5871a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
58868a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_CACHED_RECENT
5891a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // ActivityManager.PROCESS_STATE_CACHED_EMPTY
5901a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    };
5911a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
592f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static boolean procStatesDifferForMem(int procState1, int procState2) {
593f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        return sProcStateToProcMem[procState1] != sProcStateToProcMem[procState2];
594f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    }
595f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
596ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    public static long minTimeFromStateChange(boolean test) {
597ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn        return test ? PSS_TEST_MIN_TIME_FROM_STATE_CHANGE : PSS_MIN_TIME_FROM_STATE_CHANGE;
598ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    }
599ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn
6001a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    public static long computeNextPssTime(int procState, boolean first, boolean test,
6011a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn            boolean sleeping, long now) {
6021a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        final long[] table = test
603f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn                ? (first
6041a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn                        ? sTestFirstAwakePssTimes
6051a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn                        : sTestSameAwakePssTimes)
606f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn                : (first
607f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn                        ? sFirstAwakePssTimes
608f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn                        : sSameAwakePssTimes);
609f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        return now + table[procState];
610f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    }
611f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
6127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    long getMemLevel(int adjustment) {
6137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        for (int i=0; i<mOomAdj.length; i++) {
6147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            if (adjustment <= mOomAdj[i]) {
6157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                return mOomMinFree[i] * 1024;
6167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            }
6177d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
6187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        return mOomMinFree[mOomAdj.length-1] * 1024;
6197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
6207d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
621bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    /**
6223bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn     * Return the maximum pss size in kb that we consider a process acceptable to
6233bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn     * restore from its cached state for running in the background when RAM is low.
6243bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn     */
625cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn    long getCachedRestoreThresholdKb() {
6263bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        return mCachedRestoreLevel;
6273bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    }
6283bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
6299bef5b67dc48568e6f8be065dd7016f04058351cDianne Hackborn    /**
630bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * Set the out-of-memory badness adjustment for a process.
631bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     *
632bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * @param pid The process identifier to set.
633d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross     * @param uid The uid of the app
634bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * @param amt Adjustment value -- lmkd allows -16 to +15.
635bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     *
636bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * {@hide}
637bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     */
638d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross    public static final void setOomAdj(int pid, int uid, int amt) {
639bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        if (amt == UNKNOWN_ADJ)
640bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            return;
641bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
642ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn        long start = SystemClock.elapsedRealtime();
643d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross        ByteBuffer buf = ByteBuffer.allocate(4 * 4);
644bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(LMK_PROCPRIO);
645bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(pid);
646d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross        buf.putInt(uid);
647bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(amt);
648bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        writeLmkd(buf);
649ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn        long now = SystemClock.elapsedRealtime();
650ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn        if ((now-start) > 250) {
651ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn            Slog.w("ActivityManager", "SLOW OOM ADJ: " + (now-start) + "ms for pid " + pid
652ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn                    + " = " + amt);
653ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn        }
654bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    }
655bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
656bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    /*
657bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * {@hide}
658bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     */
659bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    public static final void remove(int pid) {
660bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        ByteBuffer buf = ByteBuffer.allocate(4 * 2);
661bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(LMK_PROCREMOVE);
662bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(pid);
663bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        writeLmkd(buf);
664bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    }
665bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
666bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private static boolean openLmkdSocket() {
6677d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        try {
668bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            sLmkdSocket = new LocalSocket(LocalSocket.SOCKET_SEQPACKET);
669bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            sLmkdSocket.connect(
670bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                new LocalSocketAddress("lmkd",
671bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        LocalSocketAddress.Namespace.RESERVED));
672bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            sLmkdOutputStream = sLmkdSocket.getOutputStream();
673bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        } catch (IOException ex) {
674e23149f1555303940d212b742707518b7f9f84abWale Ogunwale            Slog.w(TAG, "lowmemorykiller daemon socket open failed");
675bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            sLmkdSocket = null;
676bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            return false;
677bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        }
678bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
679bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        return true;
680bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    }
681bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
682bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private static void writeLmkd(ByteBuffer buf) {
683bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
684bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        for (int i = 0; i < 3; i++) {
685bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            if (sLmkdSocket == null) {
686bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                    if (openLmkdSocket() == false) {
687bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        try {
688bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                            Thread.sleep(1000);
689bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        } catch (InterruptedException ie) {
690bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        }
691bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        continue;
692bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                    }
693bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            }
694bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
695bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            try {
696bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                sLmkdOutputStream.write(buf.array(), 0, buf.position());
697bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                return;
698bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            } catch (IOException ex) {
699e23149f1555303940d212b742707518b7f9f84abWale Ogunwale                Slog.w(TAG, "Error writing to lowmemorykiller socket");
700bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
7017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                try {
702bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                    sLmkdSocket.close();
703bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                } catch (IOException ex2) {
7047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                }
705bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
706bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                sLmkdSocket = null;
7077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            }
7087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
7097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
7107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn}
711