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;
24e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackbornimport java.io.PrintWriter;
25bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport java.nio.ByteBuffer;
267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
278e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackbornimport android.app.ActivityManager;
28db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatzimport android.app.AppProtoEnums;
299d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackbornimport android.os.Build;
30ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackbornimport android.os.SystemClock;
317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.internal.util.MemInfoReader;
327d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport com.android.server.wm.WindowManagerService;
337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
34fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Crossimport android.content.res.Resources;
357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.graphics.Point;
3659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Crossimport android.os.SystemProperties;
37bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocketAddress;
38bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynorimport android.net.LocalSocket;
397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackbornimport android.util.Slog;
4059c009776dae5ccbdfb93d7151ff2065ca049dc3Craig Mautnerimport android.view.Display;
417d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn/**
437d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn * Activity manager code dealing with processes.
447d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn */
45352dc57186ff796dbb7a095c609d1a0bae5d3fcaSudheer Shankapublic final class ProcessList {
46e23149f1555303940d212b742707518b7f9f84abWale Ogunwale    private static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessList" : TAG_AM;
47e23149f1555303940d212b742707518b7f9f84abWale Ogunwale
487d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // The minimum time we allow between crashes, for us to consider this
497d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // application to be bad and stop and its services and reject broadcasts.
507d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    static final int MIN_CRASH_INTERVAL = 60*1000;
517d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
527d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // OOM adjustments for processes in various states:
537d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
54fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    // Uninitialized value for any major or minor adj fields
55fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int INVALID_ADJ = -10000;
56fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang
57c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // Adjustment used in certain places where we don't know it yet.
58c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // (Generally this is something that is going to be cached, but we
59c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // don't know the exact value in the cached range to assign yet.)
60fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int UNKNOWN_ADJ = 1001;
61c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn
627d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process only hosting activities that are not visible,
63e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // so it can be killed without any disruption.
64fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int CACHED_APP_MAX_ADJ = 906;
65fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int CACHED_APP_MIN_ADJ = 900;
66e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn
67e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // The B list of SERVICE_ADJ -- these are the old and decrepit
68e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // services that aren't as shiny and interesting as the ones in the A list.
69fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int SERVICE_B_ADJ = 800;
70f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn
71f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // This is the process of the previous application that the user was in.
72f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // This process is kept above other things, because it is very common to
73f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // switch back to the previous app.  This is important both for recent
74f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // task switch (toggling between the two top recent apps) as well as normal
75f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // UI flow such as clicking on a URI in the e-mail app to view in the browser,
76f35fe23669aeeebd2db2acb6baacae503dba03a8Dianne Hackborn    // and then pressing back to return to e-mail.
77fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int PREVIOUS_APP_ADJ = 700;
787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
797d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process holding the home application -- we want to try
807d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // avoiding killing it, even if it would normally be in the background,
817d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // because the user interacts with it so much.
82fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int HOME_APP_ADJ = 600;
837d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
84e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // This is a process holding an application service -- killing it will not
85e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // have much of an impact as far as the user is concerned.
86fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int SERVICE_ADJ = 500;
877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
887d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process with a heavy-weight application.  It is in the
897d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // background, but we want to try to avoid killing it.  Value set in
907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // system/rootdir/init.rc on startup.
91fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int HEAVY_WEIGHT_APP_ADJ = 400;
92c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn
93c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // This is a process currently hosting a backup operation.  Killing it
94c8230519728b14065effd3b7d4eca273ff86160cDianne Hackborn    // is not entirely fatal but is generally a bad idea.
95fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int BACKUP_APP_ADJ = 300;
967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process only hosting components that are perceptible to the
987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // user, and we really want to avoid killing them, but they are not
99e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // immediately visible. An example is background music playback.
100fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int PERCEPTIBLE_APP_ADJ = 200;
1017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is a process only hosting activities that are visible to the
103e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // user, so we'd prefer they don't disappear.
104fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int VISIBLE_APP_ADJ = 100;
105fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int VISIBLE_APP_LAYER_MAX = PERCEPTIBLE_APP_ADJ - VISIBLE_APP_ADJ - 1;
1067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // This is the process running the current foreground app.  We'd really
108e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // rather not kill it!
1097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    static final int FOREGROUND_APP_ADJ = 0;
1107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
111ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn    // This is a process that the system or a persistent process has bound to,
112ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn    // and indicated it is important.
113fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int PERSISTENT_SERVICE_ADJ = -700;
114ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn
115e02c88af7935c72fb90a478375e61e4a94465587Dianne Hackborn    // This is a system persistent process, such as telephony.  Definitely
1167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // don't want to kill it, but doing so is not completely fatal.
117fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int PERSISTENT_PROC_ADJ = -800;
1187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // The system process runs at the default adjustment.
120fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int SYSTEM_ADJ = -900;
1217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1228e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    // Special code for native processes that are not being managed by the system (so
1238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    // don't have an oom adj assigned by the system).
124fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    static final int NATIVE_ADJ = -1000;
1258e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn
1267d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // Memory pages are 4K.
1277d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    static final int PAGE_SIZE = 4*1024;
1287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
129a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    // Activity manager's version of Process.THREAD_GROUP_BG_NONINTERACTIVE
130a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    static final int SCHED_GROUP_BACKGROUND = 0;
131fef10a47a810f375f762e77240718774a5f518aaTim Murray      // Activity manager's version of Process.THREAD_GROUP_RESTRICTED
132fef10a47a810f375f762e77240718774a5f518aaTim Murray    static final int SCHED_GROUP_RESTRICTED = 1;
133a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    // Activity manager's version of Process.THREAD_GROUP_DEFAULT
134fef10a47a810f375f762e77240718774a5f518aaTim Murray    static final int SCHED_GROUP_DEFAULT = 2;
135a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn    // Activity manager's version of Process.THREAD_GROUP_TOP_APP
136fef10a47a810f375f762e77240718774a5f518aaTim Murray    static final int SCHED_GROUP_TOP_APP = 3;
13733eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray    // Activity manager's version of Process.THREAD_GROUP_TOP_APP
13833eb07f5759b85a5617f8057d8a335019c7d24ddTim Murray    // Disambiguate between actual top app and processes bound to the top app
139fef10a47a810f375f762e77240718774a5f518aaTim Murray    static final int SCHED_GROUP_TOP_APP_BOUND = 4;
140a49ad09c6f772fdbf829f85a6977fcde243c2b98Dianne Hackborn
141be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn    // The minimum number of cached apps we want to be able to keep around,
1427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // without empty apps being able to push them out of memory.
143be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn    static final int MIN_CACHED_APPS = 2;
1447d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
145b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    // We allow empty processes to stick around for at most 30 minutes.
146b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    static final long MAX_EMPTY_TIME = 30*60*1000;
147b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn
148be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn    // Threshold of number of cached+empty where we consider memory critical.
149b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    static final int TRIM_CRITICAL_THRESHOLD = 3;
150b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn
151be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn    // Threshold of number of cached+empty where we consider memory critical.
152b12e1354f25f04e9c9a71da76c6fca858b7d39d0Dianne Hackborn    static final int TRIM_LOW_THRESHOLD = 5;
1537d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
154bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    // Low Memory Killer Daemon command codes.
155bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    // These must be kept in sync with the definitions in lmkd.c
156bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    //
157bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    // LMK_TARGET <minfree> <minkillprio> ... (up to 6 pairs)
158fdcc4d4235c829a41b4d23043431bb8fa915a440Chong Zhang    // LMK_PROCPRIO <pid> <uid> <prio>
159bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    // LMK_PROCREMOVE <pid>
160bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    static final byte LMK_TARGET = 0;
161bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    static final byte LMK_PROCPRIO = 1;
162bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    static final byte LMK_PROCREMOVE = 2;
163bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
1647d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // These are the various interesting memory levels that we will give to
1657d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // the OOM killer.  Note that the OOM killer only supports 6 slots, so we
1667d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // can't give it a different value for every possible kind of process.
1677d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private final int[] mOomAdj = new int[] {
1687d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            FOREGROUND_APP_ADJ, VISIBLE_APP_ADJ, PERCEPTIBLE_APP_ADJ,
169be4e6aaa0252dd7da28b7aa85beba982538efa46Dianne Hackborn            BACKUP_APP_ADJ, CACHED_APP_MIN_ADJ, CACHED_APP_MAX_ADJ
1707d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    };
1717d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // These are the low-end OOM level limits.  This is appropriate for an
1727d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // HVGA or smaller phone with less than 512MB.  Values are in KB.
173bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private final int[] mOomMinFreeLow = new int[] {
1743f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn            12288, 18432, 24576,
1753f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn            36864, 43008, 49152
1767d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    };
1777d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // These are the high-end OOM level limits.  This is appropriate for a
1787d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // 1280x800 or larger screen with around 1GB RAM.  Values are in KB.
179bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private final int[] mOomMinFreeHigh = new int[] {
1803f16dd49e8fe33f64d290a41ad1cb32c8a333ce6Dianne Hackborn            73728, 92160, 110592,
181824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn            129024, 147456, 184320
1827d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    };
1837d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    // The actual OOM killer memory levels we are using.
184bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private final int[] mOomMinFree = new int[mOomAdj.length];
1857d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1867d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private final long mTotalMemMb;
1877d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
1883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    private long mCachedRestoreLevel;
1893bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
1907d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private boolean mHaveDisplaySize;
1917d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
192bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private static LocalSocket sLmkdSocket;
193bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private static OutputStream sLmkdOutputStream;
194bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
1957d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    ProcessList() {
1967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        MemInfoReader minfo = new MemInfoReader();
1977d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        minfo.readMemInfo();
1987d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        mTotalMemMb = minfo.getTotalSize()/(1024*1024);
1997d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        updateOomLevels(0, 0, false);
2007d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
2017d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
2027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    void applyDisplaySize(WindowManagerService wm) {
2037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        if (!mHaveDisplaySize) {
2047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            Point p = new Point();
2051e32e025ad5677ce4e3697ca026c2019fe0bd8e9Andrii Kulian            // TODO(multi-display): Compute based on sum of all connected displays' resolutions.
206637dbfcaf0a1f43f81d3d195461b50bfc0fd5f14Colin Cross            wm.getBaseDisplaySize(Display.DEFAULT_DISPLAY, p);
2077d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            if (p.x != 0 && p.y != 0) {
2087d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                updateOomLevels(p.x, p.y, true);
2097d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                mHaveDisplaySize = true;
2107d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            }
2117d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
2127d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
2137d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
2147d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    private void updateOomLevels(int displayWidth, int displayHeight, boolean write) {
2157d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // Scale buckets from avail memory: at 300MB we use the lowest values to
2167d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // 700MB or more for the top values.
217824aeab2db793e4d7af9a30f5a38d6ca4d1606bcDianne Hackborn        float scaleMem = ((float)(mTotalMemMb-350))/(700-350);
2187d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
2197d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // Scale buckets from screen size.
220635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        int minSize = 480*800;  //  384000
2217d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        int maxSize = 1280*800; // 1024000  230400 870400  .264
2227d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        float scaleDisp = ((float)(displayWidth*displayHeight)-minSize)/(maxSize-minSize);
223635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        if (false) {
224635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn            Slog.i("XXXXXX", "scaleMem=" + scaleMem);
225635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn            Slog.i("XXXXXX", "scaleDisp=" + scaleDisp + " dw=" + displayWidth
226635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn                    + " dh=" + displayHeight);
227635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        }
2287d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
2297d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        float scale = scaleMem > scaleDisp ? scaleMem : scaleDisp;
2307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        if (scale < 0) scale = 0;
2317d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        else if (scale > 1) scale = 1;
232635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        int minfree_adj = Resources.getSystem().getInteger(
233635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn                com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAdjust);
234635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        int minfree_abs = Resources.getSystem().getInteger(
235635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn                com.android.internal.R.integer.config_lowMemoryKillerMinFreeKbytesAbsolute);
236635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        if (false) {
237635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn            Slog.i("XXXXXX", "minfree_adj=" + minfree_adj + " minfree_abs=" + minfree_abs);
238635a6d5a0b922b5d845b6e2c7ec8453b14fe4b01Dianne Hackborn        }
239fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross
240c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn        final boolean is64bit = Build.SUPPORTED_64_BIT_ABIS.length > 0;
2419d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn
2427d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        for (int i=0; i<mOomAdj.length; i++) {
243bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            int low = mOomMinFreeLow[i];
244bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            int high = mOomMinFreeHigh[i];
245c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn            if (is64bit) {
246c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn                // Increase the high min-free levels for cached processes for 64-bit
247c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn                if (i == 4) high = (high*3)/2;
248c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn                else if (i == 5) high = (high*7)/4;
249c478cf5185337dcc2c54a074cf194d2d83689021Dianne Hackborn            }
250bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            mOomMinFree[i] = (int)(low + ((high-low)*scale));
251fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        }
252fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross
253fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        if (minfree_abs >= 0) {
254fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross            for (int i=0; i<mOomAdj.length; i++) {
2559d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn                mOomMinFree[i] = (int)((float)minfree_abs * mOomMinFree[i]
2569d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn                        / mOomMinFree[mOomAdj.length - 1]);
257fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross            }
258fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        }
2597d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
260fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        if (minfree_adj != 0) {
261fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross            for (int i=0; i<mOomAdj.length; i++) {
2629d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn                mOomMinFree[i] += (int)((float)minfree_adj * mOomMinFree[i]
2639d52f791b94bbf03739bdee4ccdd3ecb514c8eebDianne Hackborn                        / mOomMinFree[mOomAdj.length - 1]);
264fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross                if (mOomMinFree[i] < 0) {
265fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross                    mOomMinFree[i] = 0;
266fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross                }
267fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross            }
268fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross        }
269fcdad6f292a1f83da3bbadc45779ae85307a6f3eColin Cross
2703bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        // The maximum size we will restore a process from cached to background, when under
2713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        // memory duress, is 1/3 the size we have reserved for kernel caches and other overhead
2723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        // before killing background processes.
2733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        mCachedRestoreLevel = (getMemLevel(ProcessList.CACHED_APP_MAX_ADJ)/1024) / 3;
2743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
27559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        // Ask the kernel to try to keep enough memory free to allocate 3 full
27659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        // screen 32bpp buffers without entering direct reclaim.
27759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        int reserve = displayWidth * displayHeight * 4 * 3 / 1024;
27859d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        int reserve_adj = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAdjust);
27959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        int reserve_abs = Resources.getSystem().getInteger(com.android.internal.R.integer.config_extraFreeKbytesAbsolute);
28059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross
28159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        if (reserve_abs >= 0) {
28259d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            reserve = reserve_abs;
28359d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        }
28459d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross
28559d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        if (reserve_adj != 0) {
28659d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            reserve += reserve_adj;
28759d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            if (reserve < 0) {
28859d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross                reserve = 0;
28959d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            }
29059d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross        }
29159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross
2927d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        if (write) {
293bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            ByteBuffer buf = ByteBuffer.allocate(4 * (2*mOomAdj.length + 1));
294bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            buf.putInt(LMK_TARGET);
295bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            for (int i=0; i<mOomAdj.length; i++) {
296bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                buf.putInt((mOomMinFree[i]*1024)/PAGE_SIZE);
297bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                buf.putInt(mOomAdj[i]);
298bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            }
299bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
300bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            writeLmkd(buf);
30159d80a5270249b8b0b32b7ce8e081f4fbd41129aColin Cross            SystemProperties.set("sys.sysctl.extra_free_kbytes", Integer.toString(reserve));
3027d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
3037d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // GB: 2048,3072,4096,6144,7168,8192
3047d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        // HC: 8192,10240,12288,14336,16384,20480
3057d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
3067d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
3072286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn    public static int computeEmptyProcessLimit(int totalProcessLimit) {
308465fa3963534e41ead0dce1273b71fd50c58c973Dianne Hackborn        return totalProcessLimit/2;
3092286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn    }
3102286cdc0cab77e61b75e6fe9a45b91f6e57cd46dDianne Hackborn
3118e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    private static String buildOomTag(String prefix, String space, int val, int base) {
3128e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        if (val == base) {
3138e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            if (space == null) return prefix;
3148e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return prefix + "  ";
3158e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        }
3168e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        return prefix + "+" + Integer.toString(val-base);
3178e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    }
3188e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn
3198e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    public static String makeOomAdjString(int setAdj) {
3208e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
3218e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("cch", "  ", setAdj, ProcessList.CACHED_APP_MIN_ADJ);
3228e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.SERVICE_B_ADJ) {
3238e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("svcb ", null, setAdj, ProcessList.SERVICE_B_ADJ);
3248e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.PREVIOUS_APP_ADJ) {
3258e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("prev ", null, setAdj, ProcessList.PREVIOUS_APP_ADJ);
3268e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.HOME_APP_ADJ) {
3278e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("home ", null, setAdj, ProcessList.HOME_APP_ADJ);
3288e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.SERVICE_ADJ) {
3298e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("svc  ", null, setAdj, ProcessList.SERVICE_ADJ);
3308e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.HEAVY_WEIGHT_APP_ADJ) {
3318e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("hvy  ", null, setAdj, ProcessList.HEAVY_WEIGHT_APP_ADJ);
3328e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.BACKUP_APP_ADJ) {
3338e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("bkup ", null, setAdj, ProcessList.BACKUP_APP_ADJ);
3348e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.PERCEPTIBLE_APP_ADJ) {
3358e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("prcp ", null, setAdj, ProcessList.PERCEPTIBLE_APP_ADJ);
3368e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.VISIBLE_APP_ADJ) {
3378e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("vis  ", null, setAdj, ProcessList.VISIBLE_APP_ADJ);
3388e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.FOREGROUND_APP_ADJ) {
3398e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("fore ", null, setAdj, ProcessList.FOREGROUND_APP_ADJ);
340ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn        } else if (setAdj >= ProcessList.PERSISTENT_SERVICE_ADJ) {
341ce09f5a53c8408d995c116a4430c000574d9875aDianne Hackborn            return buildOomTag("psvc ", null, setAdj, ProcessList.PERSISTENT_SERVICE_ADJ);
3428e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.PERSISTENT_PROC_ADJ) {
3438e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("pers ", null, setAdj, ProcessList.PERSISTENT_PROC_ADJ);
3448e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.SYSTEM_ADJ) {
3458e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("sys  ", null, setAdj, ProcessList.SYSTEM_ADJ);
3468e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else if (setAdj >= ProcessList.NATIVE_ADJ) {
3478e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return buildOomTag("ntv  ", null, setAdj, ProcessList.NATIVE_ADJ);
3488e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        } else {
3498e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn            return Integer.toString(setAdj);
3508e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn        }
3518e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn    }
3528e69257a9c7e9c1781e1f53d8856358ada38921dDianne Hackborn
3533bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    public static String makeProcStateString(int curProcState) {
3543bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        String procState;
3553bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        switch (curProcState) {
3563bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_PERSISTENT:
3579484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "PER ";
3583bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3593bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_PERSISTENT_UI:
3609484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "PERU";
3613bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3623bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_TOP:
363f4dd3711d1164ce6a442306615cac99119022215Dianne Hackborn                procState = "TOP ";
3643bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3654870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn            case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
3669484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "FGS ";
3674870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn                break;
36810fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn            case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
36910fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn                procState = "BFGS";
37010fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn                break;
3713bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
3729484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "IMPF";
3733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
3759484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "IMPB";
3763bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
37783b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn            case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND:
37883b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn                procState = "TRNB";
37983b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn                break;
3803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_BACKUP:
3819484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "BKUP";
3823bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3833bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_SERVICE:
3849484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "SVC ";
3853bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3863bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_RECEIVER:
3879484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "RCVR";
3883bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
389bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn            case ActivityManager.PROCESS_STATE_TOP_SLEEPING:
390bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn                procState = "TPSL";
391bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn                break;
392f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn            case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT:
393f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn                procState = "HVY ";
394f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn                break;
3953bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_HOME:
3969484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "HOME";
3973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
3983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_LAST_ACTIVITY:
3999484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "LAST";
4003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
4013bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY:
4029484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "CAC ";
4033bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
4043bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
4059484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "CACC";
4063bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
40768a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn            case ActivityManager.PROCESS_STATE_CACHED_RECENT:
40868a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn                procState = "CRE ";
40968a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn                break;
4103bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            case ActivityManager.PROCESS_STATE_CACHED_EMPTY:
4119484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "CEM ";
4123bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
4135614bf5a1ae4522dfc1a041f003cebc9b25c8b93Dianne Hackborn            case ActivityManager.PROCESS_STATE_NONEXISTENT:
4149484603c0fa738b67980c18b4abfd3505778ae74Dianne Hackborn                procState = "NONE";
4155614bf5a1ae4522dfc1a041f003cebc9b25c8b93Dianne Hackborn                break;
4163bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            default:
4173bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                procState = "??";
4183bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                break;
4193bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
4203bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        return procState;
4213bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    }
4223bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
423148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin    public static int makeProcStateProtoEnum(int curProcState) {
424148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin        switch (curProcState) {
425148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_PERSISTENT:
426db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_PERSISTENT;
427148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_PERSISTENT_UI:
428db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_PERSISTENT_UI;
429148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_TOP:
430db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_TOP;
431148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE:
432db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_BOUND_FOREGROUND_SERVICE;
433148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE:
434db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_FOREGROUND_SERVICE;
435148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_TOP_SLEEPING:
436db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_TOP_SLEEPING;
437148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND:
438db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_IMPORTANT_FOREGROUND;
439148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND:
440db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_IMPORTANT_BACKGROUND;
441148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND:
442db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_TRANSIENT_BACKGROUND;
443148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_BACKUP:
444db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_BACKUP;
445148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_HEAVY_WEIGHT:
446db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_HEAVY_WEIGHT;
447148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_SERVICE:
448db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_SERVICE;
449148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_RECEIVER:
450db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_RECEIVER;
451148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_HOME:
452db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_HOME;
453148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_LAST_ACTIVITY:
454db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_LAST_ACTIVITY;
455148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY:
456db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_CACHED_ACTIVITY;
457148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT:
458db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_CACHED_ACTIVITY_CLIENT;
459148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_CACHED_RECENT:
460db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_CACHED_RECENT;
461148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_CACHED_EMPTY:
462db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_CACHED_EMPTY;
463148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            case ActivityManager.PROCESS_STATE_NONEXISTENT:
464db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_NONEXISTENT;
465db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz            case ActivityManager.PROCESS_STATE_UNKNOWN:
466db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_UNKNOWN;
467148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin            default:
468db026a28aa56d725ef40e9f785d7582f6cd774b8Bookatz                return AppProtoEnums.PROCESS_STATE_UNKNOWN_TO_PROTO;
469148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin        }
470148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin    }
471148d7f4291d675fc17852d530be32b7dba06fc93Yi Jin
4723bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    public static void appendRamKb(StringBuilder sb, long ramKb) {
4733bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        for (int j=0, fact=10; j<6; j++, fact*=10) {
4743bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            if (ramKb < fact) {
4753bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn                sb.append(' ');
4763bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn            }
4773bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        }
4783bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        sb.append(ramKb);
4793bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    }
4803bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
481ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    // How long after a state change that it is safe to collect PSS without it being dirty.
482ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    public static final int PSS_SAFE_TIME_FROM_STATE_CHANGE = 1000;
483ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn
484ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    // The minimum time interval after a state change it is safe to collect PSS.
485f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PSS_MIN_TIME_FROM_STATE_CHANGE = 15*1000;
486f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
487f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The maximum amount of time we want to go between PSS collections.
488e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public static final int PSS_MAX_INTERVAL = 60*60*1000;
489f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
490f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The minimum amount of time between successive PSS requests for *all* processes.
491052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    public static final int PSS_ALL_INTERVAL = 20*60*1000;
492f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
493052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    // The amount of time until PSS when a persistent process first appears.
494052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    private static final int PSS_FIRST_PERSISTENT_INTERVAL = 30*1000;
495f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
496f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when a process first becomes top.
4973bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    private static final int PSS_FIRST_TOP_INTERVAL = 10*1000;
4983bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
4993bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    // The amount of time until PSS when a process first goes into the background.
5003bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    private static final int PSS_FIRST_BACKGROUND_INTERVAL = 20*1000;
501f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
502f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when a process first becomes cached.
503e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    private static final int PSS_FIRST_CACHED_INTERVAL = 20*1000;
504e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
505e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    // The amount of time until PSS when an important process stays in the same state.
506ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn    private static final int PSS_SAME_PERSISTENT_INTERVAL = 10*60*1000;
507f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
508052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    // The amount of time until PSS when the top process stays in the same state.
509ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn    private static final int PSS_SAME_TOP_INTERVAL = 1*60*1000;
510052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn
511f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when an important process stays in the same state.
512ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn    private static final int PSS_SAME_IMPORTANT_INTERVAL = 10*60*1000;
513f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
514f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when a service process stays in the same state.
515ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn    private static final int PSS_SAME_SERVICE_INTERVAL = 5*60*1000;
516f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
517f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    // The amount of time until PSS when a cached process stays in the same state.
518ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn    private static final int PSS_SAME_CACHED_INTERVAL = 10*60*1000;
519f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
520052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    // The amount of time until PSS when a persistent process first appears.
521052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    private static final int PSS_FIRST_ASLEEP_PERSISTENT_INTERVAL = 1*60*1000;
522052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn
523052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    // The amount of time until PSS when a process first becomes top.
524052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    private static final int PSS_FIRST_ASLEEP_TOP_INTERVAL = 20*1000;
525052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn
526052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    // The amount of time until PSS when a process first goes into the background.
527052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    private static final int PSS_FIRST_ASLEEP_BACKGROUND_INTERVAL = 30*1000;
528052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn
529052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    // The amount of time until PSS when a process first becomes cached.
530052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    private static final int PSS_FIRST_ASLEEP_CACHED_INTERVAL = 1*60*1000;
531052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn
532ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    // The minimum time interval after a state change it is safe to collect PSS.
533ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    public static final int PSS_TEST_MIN_TIME_FROM_STATE_CHANGE = 10*1000;
534ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn
5351a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    // The amount of time during testing until PSS when a process first becomes top.
5361a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final int PSS_TEST_FIRST_TOP_INTERVAL = 3*1000;
5371a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
5381a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    // The amount of time during testing until PSS when a process first goes into the background.
5391a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final int PSS_TEST_FIRST_BACKGROUND_INTERVAL = 5*1000;
5401a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
5411a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    // The amount of time during testing until PSS when an important process stays in same state.
5421a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final int PSS_TEST_SAME_IMPORTANT_INTERVAL = 10*1000;
5431a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
5441a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    // The amount of time during testing until PSS when a background process stays in same state.
5451a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    private static final int PSS_TEST_SAME_BACKGROUND_INTERVAL = 15*1000;
5461a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
547f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_PERSISTENT = 0;
548f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_TOP = 1;
549f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_IMPORTANT = 2;
550f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_SERVICE = 3;
551f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static final int PROC_MEM_CACHED = 4;
552e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public static final int PROC_MEM_NUM = 5;
553f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
554e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    // Map large set of system process states to
555f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final int[] sProcStateToProcMem = new int[] {
556f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_PERSISTENT,            // ActivityManager.PROCESS_STATE_PERSISTENT
557f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_PERSISTENT,            // ActivityManager.PROCESS_STATE_PERSISTENT_UI
558f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_TOP,                   // ActivityManager.PROCESS_STATE_TOP
5594870e9d5eba59fb257a87f97f1adf0b734cf48d3Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE
56010fc4fdd133c89347c38155475a3863bd12b94c4Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE
561f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND
562f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND
56383b40f69bef4ba17bb63ac30d52f661a12d5b4f4Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND
564f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_BACKUP
565f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_SERVICE,               // ActivityManager.PROCESS_STATE_SERVICE
566f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_RECEIVER
567bad8d91056e59b77fde1b2d3cc0745137766a31aDianne Hackborn        PROC_MEM_TOP,                   // ActivityManager.PROCESS_STATE_TOP_SLEEPING
568f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn        PROC_MEM_IMPORTANT,             // ActivityManager.PROCESS_STATE_HEAVY_WEIGHT
569f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_HOME
570f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_LAST_ACTIVITY
571f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY
572f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_CACHED_ACTIVITY_CLIENT
57368a0633ea9108e781cf74df89e48e6a727139bd8Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_CACHED_RECENT
574f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        PROC_MEM_CACHED,                // ActivityManager.PROCESS_STATE_CACHED_EMPTY
575f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    };
576f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
577f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final long[] sFirstAwakePssTimes = new long[] {
578e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_PERSISTENT_INTERVAL,  // PROC_MEM_PERSISTENT
579e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_TOP_INTERVAL,         // PROC_MEM_TOP
580e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // PROC_MEM_IMPORTANT
581e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_BACKGROUND_INTERVAL,  // PROC_MEM_SERVICE
582e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_CACHED_INTERVAL,      // PROC_MEM_CACHED
583f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    };
584f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
585f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    private static final long[] sSameAwakePssTimes = new long[] {
586e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_PERSISTENT_INTERVAL,   // PROC_MEM_PERSISTENT
587e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_TOP_INTERVAL,          // PROC_MEM_TOP
588e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // PROC_MEM_IMPORTANT
589e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_SERVICE_INTERVAL,      // PROC_MEM_SERVICE
590e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_CACHED_INTERVAL,       // PROC_MEM_CACHED
591052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    };
592052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn
593052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    private static final long[] sFirstAsleepPssTimes = new long[] {
594e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_ASLEEP_PERSISTENT_INTERVAL,   // PROC_MEM_PERSISTENT
595e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_ASLEEP_TOP_INTERVAL,          // PROC_MEM_TOP
596e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_ASLEEP_BACKGROUND_INTERVAL,   // PROC_MEM_IMPORTANT
597e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_ASLEEP_BACKGROUND_INTERVAL,   // PROC_MEM_SERVICE
598e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_FIRST_ASLEEP_CACHED_INTERVAL,       // PROC_MEM_CACHED
599052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    };
600052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn
601052e3149da48a8a841f5a974d60eb9d2109837deDianne Hackborn    private static final long[] sSameAsleepPssTimes = new long[] {
602e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_PERSISTENT_INTERVAL,   // PROC_MEM_PERSISTENT
603e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_TOP_INTERVAL,          // PROC_MEM_TOP
604e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_IMPORTANT_INTERVAL,    // PROC_MEM_IMPORTANT
605e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_SERVICE_INTERVAL,      // PROC_MEM_SERVICE
606e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_SAME_CACHED_INTERVAL,       // PROC_MEM_CACHED
607f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    };
608f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
609f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn    private static final long[] sTestFirstPssTimes = new long[] {
610e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_FIRST_TOP_INTERVAL,        // PROC_MEM_PERSISTENT
611e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_FIRST_TOP_INTERVAL,        // PROC_MEM_TOP
612e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // PROC_MEM_IMPORTANT
613e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // PROC_MEM_SERVICE
614e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_FIRST_BACKGROUND_INTERVAL, // PROC_MEM_CACHED
6151a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    };
6161a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
617f097d42f0c0a80a1c2d48f148346e6b0bf7a0f68Dianne Hackborn    private static final long[] sTestSamePssTimes = new long[] {
618e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // PROC_MEM_PERSISTENT
619e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // PROC_MEM_TOP
620e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_SAME_IMPORTANT_INTERVAL,   // PROC_MEM_IMPORTANT
621e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // PROC_MEM_SERVICE
622e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        PSS_TEST_SAME_BACKGROUND_INTERVAL,  // PROC_MEM_CACHED
6231a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn    };
6241a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn
625e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public static final class ProcStateMemTracker {
626e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        final int[] mHighestMem = new int[PROC_MEM_NUM];
627ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn        final float[] mScalingFactor = new float[PROC_MEM_NUM];
628e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        int mTotalHighestMem = PROC_MEM_CACHED;
629e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
630e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        int mPendingMemState;
631e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        int mPendingHighestMemState;
632ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn        float mPendingScalingFactor;
633e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
634e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        public ProcStateMemTracker() {
635e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            for (int i = PROC_MEM_PERSISTENT; i < PROC_MEM_NUM; i++) {
636e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                mHighestMem[i] = PROC_MEM_NUM;
637ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                mScalingFactor[i] = 1.0f;
638e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            }
639e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            mPendingMemState = -1;
640e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        }
641e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
642e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        public void dumpLine(PrintWriter pw) {
643e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.print("best=");
644e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.print(mTotalHighestMem);
645ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn            pw.print(" (");
646ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn            boolean needSep = false;
647e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            for (int i = 0; i < PROC_MEM_NUM; i++) {
648ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                if (mHighestMem[i] < PROC_MEM_NUM) {
649ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                    if (needSep) {
650ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                        pw.print(", ");
651ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                        needSep = false;
652ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                    }
653ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                    pw.print(i);
654ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                    pw.print("=");
655ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                    pw.print(mHighestMem[i]);
656ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                    pw.print(" ");
657ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                    pw.print(mScalingFactor[i]);
658ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                    pw.print("x");
659ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                    needSep = true;
660e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                }
661e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            }
662e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.print(")");
663e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            if (mPendingMemState >= 0) {
664e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                pw.print(" / pending state=");
665e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                pw.print(mPendingMemState);
666e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                pw.print(" highest=");
667e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                pw.print(mPendingHighestMemState);
668ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                pw.print(" ");
669ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                pw.print(mPendingScalingFactor);
670ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                pw.print("x");
671e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            }
672e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            pw.println();
673e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        }
674e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    }
675e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
676f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    public static boolean procStatesDifferForMem(int procState1, int procState2) {
677f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn        return sProcStateToProcMem[procState1] != sProcStateToProcMem[procState2];
678f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    }
679f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
680ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    public static long minTimeFromStateChange(boolean test) {
681ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn        return test ? PSS_TEST_MIN_TIME_FROM_STATE_CHANGE : PSS_MIN_TIME_FROM_STATE_CHANGE;
682ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn    }
683ae6cc8af2674909924fb18cb73763a110bee63ddDianne Hackborn
684e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public static void commitNextPssTime(ProcStateMemTracker tracker) {
685e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        if (tracker.mPendingMemState >= 0) {
686e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            tracker.mHighestMem[tracker.mPendingMemState] = tracker.mPendingHighestMemState;
687ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn            tracker.mScalingFactor[tracker.mPendingMemState] = tracker.mPendingScalingFactor;
688e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            tracker.mTotalHighestMem = tracker.mPendingHighestMemState;
689e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            tracker.mPendingMemState = -1;
690e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        }
691e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    }
692e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
693e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public static void abortNextPssTime(ProcStateMemTracker tracker) {
694e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        tracker.mPendingMemState = -1;
695e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    }
696e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn
697e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn    public static long computeNextPssTime(int procState, ProcStateMemTracker tracker, boolean test,
6981a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn            boolean sleeping, long now) {
699e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        boolean first;
700ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn        float scalingFactor;
701e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        final int memState = sProcStateToProcMem[procState];
702e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        if (tracker != null) {
703e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            final int highestMemState = memState < tracker.mTotalHighestMem
704e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                    ? memState : tracker.mTotalHighestMem;
705e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            first = highestMemState < tracker.mHighestMem[memState];
706e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            tracker.mPendingMemState = memState;
707e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            tracker.mPendingHighestMemState = highestMemState;
708ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn            if (first) {
709ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                tracker.mPendingScalingFactor = scalingFactor = 1.0f;
710ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn            } else {
711ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                scalingFactor = tracker.mScalingFactor[memState];
712ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn                tracker.mPendingScalingFactor = scalingFactor * 1.5f;
713ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn            }
714e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        } else {
715e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            first = true;
716ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn            scalingFactor = 1.0f;
717e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        }
7181a4b5a4f02e7d8ff8ff645377d97e6062d36aeaaDianne Hackborn        final long[] table = test
719f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn                ? (first
720e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                ? sTestFirstPssTimes
721e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                : sTestSamePssTimes)
722f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn                : (first
723e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                ? (sleeping ? sFirstAsleepPssTimes : sFirstAwakePssTimes)
724e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn                : (sleeping ? sSameAsleepPssTimes : sSameAwakePssTimes));
725ed0a3220ceaf344531a6ac948a7aff9021fc8657Dianne Hackborn        long delay = (long)(table[memState] * scalingFactor);
726e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        if (delay > PSS_MAX_INTERVAL) {
727e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn            delay = PSS_MAX_INTERVAL;
728e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        }
729e17b445b6c813f6f9bc93a5e3811128a197ef50bDianne Hackborn        return now + delay;
730f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn    }
731f1cca18ae460b66242988a8a6204c4a42b6fa1c1Dianne Hackborn
7327d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    long getMemLevel(int adjustment) {
7337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        for (int i=0; i<mOomAdj.length; i++) {
7347d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            if (adjustment <= mOomAdj[i]) {
7357d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                return mOomMinFree[i] * 1024;
7367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            }
7377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
7387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        return mOomMinFree[mOomAdj.length-1] * 1024;
7397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
7407d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn
741bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    /**
7423bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn     * Return the maximum pss size in kb that we consider a process acceptable to
7433bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn     * restore from its cached state for running in the background when RAM is low.
7443bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn     */
745cbd9a52f256087426feb19ac6e51eff772e81375Dianne Hackborn    long getCachedRestoreThresholdKb() {
7463bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn        return mCachedRestoreLevel;
7473bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn    }
7483bc8f78d7a3d23a67c06221cc41292d04a2fd439Dianne Hackborn
7499bef5b67dc48568e6f8be065dd7016f04058351cDianne Hackborn    /**
750bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * Set the out-of-memory badness adjustment for a process.
751f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka     * If {@code pid <= 0}, this method will be a no-op.
752bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     *
753bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * @param pid The process identifier to set.
754d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross     * @param uid The uid of the app
755bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * @param amt Adjustment value -- lmkd allows -16 to +15.
756bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     *
757bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * {@hide}
758bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     */
759d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross    public static final void setOomAdj(int pid, int uid, int amt) {
760f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka        // This indicates that the process is not started yet and so no need to proceed further.
761f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka        if (pid <= 0) {
762f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka            return;
763f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka        }
764bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        if (amt == UNKNOWN_ADJ)
765bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            return;
766bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
767ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn        long start = SystemClock.elapsedRealtime();
768d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross        ByteBuffer buf = ByteBuffer.allocate(4 * 4);
769bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(LMK_PROCPRIO);
770bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(pid);
771d908edd810dd22d8ec512a19c32637df464e9d0aColin Cross        buf.putInt(uid);
772bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(amt);
773bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        writeLmkd(buf);
774ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn        long now = SystemClock.elapsedRealtime();
775ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn        if ((now-start) > 250) {
776ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn            Slog.w("ActivityManager", "SLOW OOM ADJ: " + (now-start) + "ms for pid " + pid
777ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn                    + " = " + amt);
778ecf1cda068c95c58d296d508d34706d659e4a1aeDianne Hackborn        }
779bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    }
780bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
781bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    /*
782bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     * {@hide}
783bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor     */
784bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    public static final void remove(int pid) {
785f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka        // This indicates that the process is not started yet and so no need to proceed further.
786f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka        if (pid <= 0) {
787f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka            return;
788f6690100be5c5cd75c64d9a6a0345acff7b754d1Sudheer Shanka        }
789bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        ByteBuffer buf = ByteBuffer.allocate(4 * 2);
790bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(LMK_PROCREMOVE);
791bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        buf.putInt(pid);
792bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        writeLmkd(buf);
793bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    }
794bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
795bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private static boolean openLmkdSocket() {
7967d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        try {
797bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            sLmkdSocket = new LocalSocket(LocalSocket.SOCKET_SEQPACKET);
798bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            sLmkdSocket.connect(
799bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                new LocalSocketAddress("lmkd",
800bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        LocalSocketAddress.Namespace.RESERVED));
801bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            sLmkdOutputStream = sLmkdSocket.getOutputStream();
802bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        } catch (IOException ex) {
803e23149f1555303940d212b742707518b7f9f84abWale Ogunwale            Slog.w(TAG, "lowmemorykiller daemon socket open failed");
804bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            sLmkdSocket = null;
805bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            return false;
806bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        }
807bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
808bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        return true;
809bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    }
810bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
811bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor    private static void writeLmkd(ByteBuffer buf) {
812bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
813bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor        for (int i = 0; i < 3; i++) {
814bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            if (sLmkdSocket == null) {
815bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                    if (openLmkdSocket() == false) {
816bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        try {
817bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                            Thread.sleep(1000);
818bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        } catch (InterruptedException ie) {
819bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        }
820bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                        continue;
821bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                    }
822bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            }
823bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
824bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            try {
825bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                sLmkdOutputStream.write(buf.array(), 0, buf.position());
826bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                return;
827bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor            } catch (IOException ex) {
828e23149f1555303940d212b742707518b7f9f84abWale Ogunwale                Slog.w(TAG, "Error writing to lowmemorykiller socket");
829bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
8307d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                try {
831bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                    sLmkdSocket.close();
832bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                } catch (IOException ex2) {
8337d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn                }
834bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor
835bfdd62323e7b3bb724c98730e4143afa3e4d9cb5Todd Poynor                sLmkdSocket = null;
8367d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn            }
8377d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn        }
8387d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn    }
8397d608423b721e0153f37bfd5eba78fcd2489562dDianne Hackborn}
840