1 /*
2  * Copyright (C) 2006 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.am;
18 
19 import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
20 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
21 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
22 
23 import android.util.ArraySet;
24 import android.util.DebugUtils;
25 import android.util.EventLog;
26 import android.util.Slog;
27 import com.android.internal.app.ProcessStats;
28 import com.android.internal.os.BatteryStatsImpl;
29 
30 import android.app.ActivityManager;
31 import android.app.Dialog;
32 import android.app.IApplicationThread;
33 import android.app.IInstrumentationWatcher;
34 import android.app.IUiAutomationConnection;
35 import android.content.ComponentName;
36 import android.content.Context;
37 import android.content.pm.ApplicationInfo;
38 import android.content.res.CompatibilityInfo;
39 import android.os.Bundle;
40 import android.os.IBinder;
41 import android.os.Process;
42 import android.os.SystemClock;
43 import android.os.Trace;
44 import android.os.UserHandle;
45 import android.util.ArrayMap;
46 import android.util.PrintWriterPrinter;
47 import android.util.TimeUtils;
48 
49 import java.io.PrintWriter;
50 import java.util.ArrayList;
51 
52 /**
53  * Full information about a particular process that
54  * is currently running.
55  */
56 final class ProcessRecord {
57     private static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessRecord" : TAG_AM;
58 
59     private final BatteryStatsImpl mBatteryStats; // where to collect runtime statistics
60     final ApplicationInfo info; // all about the first app in the process
61     final boolean isolated;     // true if this is a special isolated process
62     final int uid;              // uid of process; may be different from 'info' if isolated
63     final int userId;           // user of process.
64     final String processName;   // name of the process
65     // List of packages running in the process
66     final ArrayMap<String, ProcessStats.ProcessStateHolder> pkgList = new ArrayMap<>();
67     UidRecord uidRecord;        // overall state of process's uid.
68     ArraySet<String> pkgDeps;   // additional packages we have a dependency on
69     IApplicationThread thread;  // the actual proc...  may be null only if
70                                 // 'persistent' is true (in which case we
71                                 // are in the process of launching the app)
72     ProcessStats.ProcessState baseProcessTracker;
73     BatteryStatsImpl.Uid.Proc curProcBatteryStats;
74     int pid;                    // The process of this application; 0 if none
75     int[] gids;                 // The gids this process was launched with
76     String requiredAbi;         // The ABI this process was launched with
77     String instructionSet;      // The instruction set this process was launched with
78     boolean starting;           // True if the process is being started
79     long lastActivityTime;      // For managing the LRU list
80     long lastPssTime;           // Last time we retrieved PSS data
81     long nextPssTime;           // Next time we want to request PSS data
82     long lastStateTime;         // Last time setProcState changed
83     long initialIdlePss;        // Initial memory pss of process for idle maintenance.
84     long lastPss;               // Last computed memory pss.
85     long lastCachedPss;         // Last computed pss when in cached state.
86     int maxAdj;                 // Maximum OOM adjustment for this process
87     int curRawAdj;              // Current OOM unlimited adjustment for this process
88     int setRawAdj;              // Last set OOM unlimited adjustment for this process
89     int curAdj;                 // Current OOM adjustment for this process
90     int setAdj;                 // Last set OOM adjustment for this process
91     int curSchedGroup;          // Currently desired scheduling class
92     int setSchedGroup;          // Last set to background scheduling class
93     int trimMemoryLevel;        // Last selected memory trimming level
94     int curProcState = PROCESS_STATE_NONEXISTENT; // Currently computed process state
95     int repProcState = PROCESS_STATE_NONEXISTENT; // Last reported process state
96     int setProcState = PROCESS_STATE_NONEXISTENT; // Last set process state in process tracker
97     int pssProcState = PROCESS_STATE_NONEXISTENT; // Currently requesting pss for
98     boolean serviceb;           // Process currently is on the service B list
99     boolean serviceHighRam;     // We are forcing to service B list due to its RAM use
100     boolean setIsForeground;    // Running foreground UI when last set?
101     boolean notCachedSinceIdle; // Has this process not been in a cached state since last idle?
102     boolean hasClientActivities;  // Are there any client services with activities?
103     boolean hasStartedServices; // Are there any started services running in this process?
104     boolean foregroundServices; // Running any services that are foreground?
105     boolean foregroundActivities; // Running any activities that are foreground?
106     boolean repForegroundActivities; // Last reported foreground activities.
107     boolean systemNoUi;         // This is a system process, but not currently showing UI.
108     boolean hasShownUi;         // Has UI been shown in this process since it was started?
109     boolean pendingUiClean;     // Want to clean up resources from showing UI?
110     boolean hasAboveClient;     // Bound using BIND_ABOVE_CLIENT, so want to be lower
111     boolean treatLikeActivity;  // Bound using BIND_TREAT_LIKE_ACTIVITY
112     boolean bad;                // True if disabled in the bad process list
113     boolean killedByAm;         // True when proc has been killed by activity manager, not for RAM
114     boolean killed;             // True once we know the process has been killed
115     boolean procStateChanged;   // Keep track of whether we changed 'setAdj'.
116     boolean reportedInteraction;// Whether we have told usage stats about it being an interaction
117     long fgInteractionTime;     // When we became foreground for interaction purposes
118     String waitingToKill;       // Process is waiting to be killed when in the bg, and reason
119     IBinder forcingToForeground;// Token that is forcing this process to be foreground
120     int adjSeq;                 // Sequence id for identifying oom_adj assignment cycles
121     int lruSeq;                 // Sequence id for identifying LRU update cycles
122     CompatibilityInfo compat;   // last used compatibility mode
123     IBinder.DeathRecipient deathRecipient; // Who is watching for the death.
124     ComponentName instrumentationClass;// class installed to instrument app
125     ApplicationInfo instrumentationInfo; // the application being instrumented
126     String instrumentationProfileFile; // where to save profiling
127     IInstrumentationWatcher instrumentationWatcher; // who is waiting
128     IUiAutomationConnection instrumentationUiAutomationConnection; // Connection to use the UI introspection APIs.
129     Bundle instrumentationArguments;// as given to us
130     ComponentName instrumentationResultClass;// copy of instrumentationClass
131     boolean usingWrapper;       // Set to true when process was launched with a wrapper attached
132     BroadcastRecord curReceiver;// receiver currently running in the app
133     long lastWakeTime;          // How long proc held wake lock at last check
134     long lastCpuTime;           // How long proc has run CPU at last check
135     long curCpuTime;            // How long proc has run CPU most recently
136     long lastRequestedGc;       // When we last asked the app to do a gc
137     long lastLowMemory;         // When we last told the app that memory is low
138     boolean reportLowMemory;    // Set to true when waiting to report low mem
139     boolean empty;              // Is this an empty background process?
140     boolean cached;             // Is this a cached process?
141     String adjType;             // Debugging: primary thing impacting oom_adj.
142     int adjTypeCode;            // Debugging: adj code to report to app.
143     Object adjSource;           // Debugging: option dependent object.
144     int adjSourceProcState;     // Debugging: proc state of adjSource's process.
145     Object adjTarget;           // Debugging: target component impacting oom_adj.
146     Runnable crashHandler;      // Optional local handler to be invoked in the process crash.
147 
148     // all activities running in the process
149     final ArrayList<ActivityRecord> activities = new ArrayList<>();
150     // all ServiceRecord running in this process
151     final ArraySet<ServiceRecord> services = new ArraySet<>();
152     // services that are currently executing code (need to remain foreground).
153     final ArraySet<ServiceRecord> executingServices = new ArraySet<>();
154     // All ConnectionRecord this process holds
155     final ArraySet<ConnectionRecord> connections = new ArraySet<>();
156     // all IIntentReceivers that are registered from this process.
157     final ArraySet<ReceiverList> receivers = new ArraySet<>();
158     // class (String) -> ContentProviderRecord
159     final ArrayMap<String, ContentProviderRecord> pubProviders = new ArrayMap<>();
160     // All ContentProviderRecord process is using
161     final ArrayList<ContentProviderConnection> conProviders = new ArrayList<>();
162 
163     boolean execServicesFg;     // do we need to be executing services in the foreground?
164     boolean persistent;         // always keep this application running?
165     boolean crashing;           // are we in the process of crashing?
166     Dialog crashDialog;         // dialog being displayed due to crash.
167     boolean forceCrashReport;   // suppress normal auto-dismiss of crash dialog & report UI?
168     boolean notResponding;      // does the app have a not responding dialog?
169     Dialog anrDialog;           // dialog being displayed due to app not resp.
170     boolean removed;            // has app package been removed from device?
171     boolean debugging;          // was app launched for debugging?
172     boolean waitedForDebugger;  // has process show wait for debugger dialog?
173     Dialog waitDialog;          // current wait for debugger dialog
174 
175     String shortStringName;     // caching of toShortString() result.
176     String stringName;          // caching of toString() result.
177 
178     // These reports are generated & stored when an app gets into an error condition.
179     // They will be "null" when all is OK.
180     ActivityManager.ProcessErrorStateInfo crashingReport;
181     ActivityManager.ProcessErrorStateInfo notRespondingReport;
182 
183     // Who will be notified of the error. This is usually an activity in the
184     // app that installed the package.
185     ComponentName errorReportReceiver;
186 
dump(PrintWriter pw, String prefix)187     void dump(PrintWriter pw, String prefix) {
188         final long now = SystemClock.uptimeMillis();
189 
190         pw.print(prefix); pw.print("user #"); pw.print(userId);
191                 pw.print(" uid="); pw.print(info.uid);
192         if (uid != info.uid) {
193             pw.print(" ISOLATED uid="); pw.print(uid);
194         }
195         pw.print(" gids={");
196         if (gids != null) {
197             for (int gi=0; gi<gids.length; gi++) {
198                 if (gi != 0) pw.print(", ");
199                 pw.print(gids[gi]);
200 
201             }
202         }
203         pw.println("}");
204         pw.print(prefix); pw.print("requiredAbi="); pw.print(requiredAbi);
205                 pw.print(" instructionSet="); pw.println(instructionSet);
206         if (info.className != null) {
207             pw.print(prefix); pw.print("class="); pw.println(info.className);
208         }
209         if (info.manageSpaceActivityName != null) {
210             pw.print(prefix); pw.print("manageSpaceActivityName=");
211             pw.println(info.manageSpaceActivityName);
212         }
213         pw.print(prefix); pw.print("dir="); pw.print(info.sourceDir);
214                 pw.print(" publicDir="); pw.print(info.publicSourceDir);
215                 pw.print(" data="); pw.println(info.dataDir);
216         pw.print(prefix); pw.print("packageList={");
217         for (int i=0; i<pkgList.size(); i++) {
218             if (i > 0) pw.print(", ");
219             pw.print(pkgList.keyAt(i));
220         }
221         pw.println("}");
222         if (pkgDeps != null) {
223             pw.print(prefix); pw.print("packageDependencies={");
224             for (int i=0; i<pkgDeps.size(); i++) {
225                 if (i > 0) pw.print(", ");
226                 pw.print(pkgDeps.valueAt(i));
227             }
228             pw.println("}");
229         }
230         pw.print(prefix); pw.print("compat="); pw.println(compat);
231         if (instrumentationClass != null || instrumentationProfileFile != null
232                 || instrumentationArguments != null) {
233             pw.print(prefix); pw.print("instrumentationClass=");
234                     pw.print(instrumentationClass);
235                     pw.print(" instrumentationProfileFile=");
236                     pw.println(instrumentationProfileFile);
237             pw.print(prefix); pw.print("instrumentationArguments=");
238                     pw.println(instrumentationArguments);
239             pw.print(prefix); pw.print("instrumentationInfo=");
240                     pw.println(instrumentationInfo);
241             if (instrumentationInfo != null) {
242                 instrumentationInfo.dump(new PrintWriterPrinter(pw), prefix + "  ");
243             }
244         }
245         pw.print(prefix); pw.print("thread="); pw.println(thread);
246         pw.print(prefix); pw.print("pid="); pw.print(pid); pw.print(" starting=");
247                 pw.println(starting);
248         pw.print(prefix); pw.print("lastActivityTime=");
249                 TimeUtils.formatDuration(lastActivityTime, now, pw);
250                 pw.print(" lastPssTime=");
251                 TimeUtils.formatDuration(lastPssTime, now, pw);
252                 pw.print(" nextPssTime=");
253                 TimeUtils.formatDuration(nextPssTime, now, pw);
254                 pw.println();
255         pw.print(prefix); pw.print("adjSeq="); pw.print(adjSeq);
256                 pw.print(" lruSeq="); pw.print(lruSeq);
257                 pw.print(" lastPss="); DebugUtils.printSizeValue(pw, lastPss*1024);
258                 pw.print(" lastCachedPss="); DebugUtils.printSizeValue(pw, lastCachedPss*1024);
259                 pw.println();
260         pw.print(prefix); pw.print("cached="); pw.print(cached);
261                 pw.print(" empty="); pw.println(empty);
262         if (serviceb) {
263             pw.print(prefix); pw.print("serviceb="); pw.print(serviceb);
264                     pw.print(" serviceHighRam="); pw.println(serviceHighRam);
265         }
266         if (notCachedSinceIdle) {
267             pw.print(prefix); pw.print("notCachedSinceIdle="); pw.print(notCachedSinceIdle);
268                     pw.print(" initialIdlePss="); pw.println(initialIdlePss);
269         }
270         pw.print(prefix); pw.print("oom: max="); pw.print(maxAdj);
271                 pw.print(" curRaw="); pw.print(curRawAdj);
272                 pw.print(" setRaw="); pw.print(setRawAdj);
273                 pw.print(" cur="); pw.print(curAdj);
274                 pw.print(" set="); pw.println(setAdj);
275         pw.print(prefix); pw.print("curSchedGroup="); pw.print(curSchedGroup);
276                 pw.print(" setSchedGroup="); pw.print(setSchedGroup);
277                 pw.print(" systemNoUi="); pw.print(systemNoUi);
278                 pw.print(" trimMemoryLevel="); pw.println(trimMemoryLevel);
279         pw.print(prefix); pw.print("curProcState="); pw.print(curProcState);
280                 pw.print(" repProcState="); pw.print(repProcState);
281                 pw.print(" pssProcState="); pw.print(pssProcState);
282                 pw.print(" setProcState="); pw.print(setProcState);
283                 pw.print(" lastStateTime=");
284                 TimeUtils.formatDuration(lastStateTime, now, pw);
285                 pw.println();
286         if (hasShownUi || pendingUiClean || hasAboveClient || treatLikeActivity) {
287             pw.print(prefix); pw.print("hasShownUi="); pw.print(hasShownUi);
288                     pw.print(" pendingUiClean="); pw.print(pendingUiClean);
289                     pw.print(" hasAboveClient="); pw.print(hasAboveClient);
290                     pw.print(" treatLikeActivity="); pw.println(treatLikeActivity);
291         }
292         if (setIsForeground || foregroundServices || forcingToForeground != null) {
293             pw.print(prefix); pw.print("setIsForeground="); pw.print(setIsForeground);
294                     pw.print(" foregroundServices="); pw.print(foregroundServices);
295                     pw.print(" forcingToForeground="); pw.println(forcingToForeground);
296         }
297         if (reportedInteraction || fgInteractionTime != 0) {
298             pw.print(prefix); pw.print("reportedInteraction=");
299             pw.print(reportedInteraction);
300             if (fgInteractionTime != 0) {
301                 pw.print(" fgInteractionTime=");
302                 TimeUtils.formatDuration(fgInteractionTime, SystemClock.elapsedRealtime(), pw);
303             }
304             pw.println();
305         }
306         if (persistent || removed) {
307             pw.print(prefix); pw.print("persistent="); pw.print(persistent);
308                     pw.print(" removed="); pw.println(removed);
309         }
310         if (hasClientActivities || foregroundActivities || repForegroundActivities) {
311             pw.print(prefix); pw.print("hasClientActivities="); pw.print(hasClientActivities);
312                     pw.print(" foregroundActivities="); pw.print(foregroundActivities);
313                     pw.print(" (rep="); pw.print(repForegroundActivities); pw.println(")");
314         }
315         if (hasStartedServices) {
316             pw.print(prefix); pw.print("hasStartedServices="); pw.println(hasStartedServices);
317         }
318         if (setProcState >= ActivityManager.PROCESS_STATE_SERVICE) {
319             long wtime;
320             synchronized (mBatteryStats) {
321                 wtime = mBatteryStats.getProcessWakeTime(info.uid,
322                         pid, SystemClock.elapsedRealtime());
323             }
324             pw.print(prefix); pw.print("lastWakeTime="); pw.print(lastWakeTime);
325                     pw.print(" timeUsed=");
326                     TimeUtils.formatDuration(wtime-lastWakeTime, pw); pw.println("");
327             pw.print(prefix); pw.print("lastCpuTime="); pw.print(lastCpuTime);
328                     pw.print(" timeUsed=");
329                     TimeUtils.formatDuration(curCpuTime-lastCpuTime, pw); pw.println("");
330         }
331         pw.print(prefix); pw.print("lastRequestedGc=");
332                 TimeUtils.formatDuration(lastRequestedGc, now, pw);
333                 pw.print(" lastLowMemory=");
334                 TimeUtils.formatDuration(lastLowMemory, now, pw);
335                 pw.print(" reportLowMemory="); pw.println(reportLowMemory);
336         if (killed || killedByAm || waitingToKill != null) {
337             pw.print(prefix); pw.print("killed="); pw.print(killed);
338                     pw.print(" killedByAm="); pw.print(killedByAm);
339                     pw.print(" waitingToKill="); pw.println(waitingToKill);
340         }
341         if (debugging || crashing || crashDialog != null || notResponding
342                 || anrDialog != null || bad) {
343             pw.print(prefix); pw.print("debugging="); pw.print(debugging);
344                     pw.print(" crashing="); pw.print(crashing);
345                     pw.print(" "); pw.print(crashDialog);
346                     pw.print(" notResponding="); pw.print(notResponding);
347                     pw.print(" " ); pw.print(anrDialog);
348                     pw.print(" bad="); pw.print(bad);
349 
350                     // crashing or notResponding is always set before errorReportReceiver
351                     if (errorReportReceiver != null) {
352                         pw.print(" errorReportReceiver=");
353                         pw.print(errorReportReceiver.flattenToShortString());
354                     }
355                     pw.println();
356         }
357         if (activities.size() > 0) {
358             pw.print(prefix); pw.println("Activities:");
359             for (int i=0; i<activities.size(); i++) {
360                 pw.print(prefix); pw.print("  - "); pw.println(activities.get(i));
361             }
362         }
363         if (services.size() > 0) {
364             pw.print(prefix); pw.println("Services:");
365             for (int i=0; i<services.size(); i++) {
366                 pw.print(prefix); pw.print("  - "); pw.println(services.valueAt(i));
367             }
368         }
369         if (executingServices.size() > 0) {
370             pw.print(prefix); pw.print("Executing Services (fg=");
371             pw.print(execServicesFg); pw.println(")");
372             for (int i=0; i<executingServices.size(); i++) {
373                 pw.print(prefix); pw.print("  - "); pw.println(executingServices.valueAt(i));
374             }
375         }
376         if (connections.size() > 0) {
377             pw.print(prefix); pw.println("Connections:");
378             for (int i=0; i<connections.size(); i++) {
379                 pw.print(prefix); pw.print("  - "); pw.println(connections.valueAt(i));
380             }
381         }
382         if (pubProviders.size() > 0) {
383             pw.print(prefix); pw.println("Published Providers:");
384             for (int i=0; i<pubProviders.size(); i++) {
385                 pw.print(prefix); pw.print("  - "); pw.println(pubProviders.keyAt(i));
386                 pw.print(prefix); pw.print("    -> "); pw.println(pubProviders.valueAt(i));
387             }
388         }
389         if (conProviders.size() > 0) {
390             pw.print(prefix); pw.println("Connected Providers:");
391             for (int i=0; i<conProviders.size(); i++) {
392                 pw.print(prefix); pw.print("  - "); pw.println(conProviders.get(i).toShortString());
393             }
394         }
395         if (curReceiver != null) {
396             pw.print(prefix); pw.print("curReceiver="); pw.println(curReceiver);
397         }
398         if (receivers.size() > 0) {
399             pw.print(prefix); pw.println("Receivers:");
400             for (int i=0; i<receivers.size(); i++) {
401                 pw.print(prefix); pw.print("  - "); pw.println(receivers.valueAt(i));
402             }
403         }
404     }
405 
ProcessRecord(BatteryStatsImpl _batteryStats, ApplicationInfo _info, String _processName, int _uid)406     ProcessRecord(BatteryStatsImpl _batteryStats, ApplicationInfo _info,
407             String _processName, int _uid) {
408         mBatteryStats = _batteryStats;
409         info = _info;
410         isolated = _info.uid != _uid;
411         uid = _uid;
412         userId = UserHandle.getUserId(_uid);
413         processName = _processName;
414         pkgList.put(_info.packageName, new ProcessStats.ProcessStateHolder(_info.versionCode));
415         maxAdj = ProcessList.UNKNOWN_ADJ;
416         curRawAdj = setRawAdj = -100;
417         curAdj = setAdj = -100;
418         persistent = false;
419         removed = false;
420         lastStateTime = lastPssTime = nextPssTime = SystemClock.uptimeMillis();
421     }
422 
setPid(int _pid)423     public void setPid(int _pid) {
424         pid = _pid;
425         shortStringName = null;
426         stringName = null;
427     }
428 
makeActive(IApplicationThread _thread, ProcessStatsService tracker)429     public void makeActive(IApplicationThread _thread, ProcessStatsService tracker) {
430         if (thread == null) {
431             final ProcessStats.ProcessState origBase = baseProcessTracker;
432             if (origBase != null) {
433                 origBase.setState(ProcessStats.STATE_NOTHING,
434                         tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList);
435                 origBase.makeInactive();
436             }
437             baseProcessTracker = tracker.getProcessStateLocked(info.packageName, uid,
438                     info.versionCode, processName);
439             baseProcessTracker.makeActive();
440             for (int i=0; i<pkgList.size(); i++) {
441                 ProcessStats.ProcessStateHolder holder = pkgList.valueAt(i);
442                 if (holder.state != null && holder.state != origBase) {
443                     holder.state.makeInactive();
444                 }
445                 holder.state = tracker.getProcessStateLocked(pkgList.keyAt(i), uid,
446                         info.versionCode, processName);
447                 if (holder.state != baseProcessTracker) {
448                     holder.state.makeActive();
449                 }
450             }
451         }
452         thread = _thread;
453     }
454 
makeInactive(ProcessStatsService tracker)455     public void makeInactive(ProcessStatsService tracker) {
456         thread = null;
457         final ProcessStats.ProcessState origBase = baseProcessTracker;
458         if (origBase != null) {
459             if (origBase != null) {
460                 origBase.setState(ProcessStats.STATE_NOTHING,
461                         tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList);
462                 origBase.makeInactive();
463             }
464             baseProcessTracker = null;
465             for (int i=0; i<pkgList.size(); i++) {
466                 ProcessStats.ProcessStateHolder holder = pkgList.valueAt(i);
467                 if (holder.state != null && holder.state != origBase) {
468                     holder.state.makeInactive();
469                 }
470                 holder.state = null;
471             }
472         }
473     }
474 
475     /**
476      * This method returns true if any of the activities within the process record are interesting
477      * to the user. See HistoryRecord.isInterestingToUserLocked()
478      */
isInterestingToUserLocked()479     public boolean isInterestingToUserLocked() {
480         final int size = activities.size();
481         for (int i = 0 ; i < size ; i++) {
482             ActivityRecord r = activities.get(i);
483             if (r.isInterestingToUserLocked()) {
484                 return true;
485             }
486         }
487         return false;
488     }
489 
stopFreezingAllLocked()490     public void stopFreezingAllLocked() {
491         int i = activities.size();
492         while (i > 0) {
493             i--;
494             activities.get(i).stopFreezingScreenLocked(true);
495         }
496     }
497 
unlinkDeathRecipient()498     public void unlinkDeathRecipient() {
499         if (deathRecipient != null && thread != null) {
500             thread.asBinder().unlinkToDeath(deathRecipient, 0);
501         }
502         deathRecipient = null;
503     }
504 
updateHasAboveClientLocked()505     void updateHasAboveClientLocked() {
506         hasAboveClient = false;
507         for (int i=connections.size()-1; i>=0; i--) {
508             ConnectionRecord cr = connections.valueAt(i);
509             if ((cr.flags&Context.BIND_ABOVE_CLIENT) != 0) {
510                 hasAboveClient = true;
511                 break;
512             }
513         }
514     }
515 
modifyRawOomAdj(int adj)516     int modifyRawOomAdj(int adj) {
517         if (hasAboveClient) {
518             // If this process has bound to any services with BIND_ABOVE_CLIENT,
519             // then we need to drop its adjustment to be lower than the service's
520             // in order to honor the request.  We want to drop it by one adjustment
521             // level...  but there is special meaning applied to various levels so
522             // we will skip some of them.
523             if (adj < ProcessList.FOREGROUND_APP_ADJ) {
524                 // System process will not get dropped, ever
525             } else if (adj < ProcessList.VISIBLE_APP_ADJ) {
526                 adj = ProcessList.VISIBLE_APP_ADJ;
527             } else if (adj < ProcessList.PERCEPTIBLE_APP_ADJ) {
528                 adj = ProcessList.PERCEPTIBLE_APP_ADJ;
529             } else if (adj < ProcessList.CACHED_APP_MIN_ADJ) {
530                 adj = ProcessList.CACHED_APP_MIN_ADJ;
531             } else if (adj < ProcessList.CACHED_APP_MAX_ADJ) {
532                 adj++;
533             }
534         }
535         return adj;
536     }
537 
kill(String reason, boolean noisy)538     void kill(String reason, boolean noisy) {
539         if (!killedByAm) {
540             Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "kill");
541             if (noisy) {
542                 Slog.i(TAG, "Killing " + toShortString() + " (adj " + setAdj + "): " + reason);
543             }
544             EventLog.writeEvent(EventLogTags.AM_KILL, userId, pid, processName, setAdj, reason);
545             Process.killProcessQuiet(pid);
546             Process.killProcessGroup(info.uid, pid);
547             if (!persistent) {
548                 killed = true;
549                 killedByAm = true;
550             }
551             Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
552         }
553     }
554 
toShortString()555     public String toShortString() {
556         if (shortStringName != null) {
557             return shortStringName;
558         }
559         StringBuilder sb = new StringBuilder(128);
560         toShortString(sb);
561         return shortStringName = sb.toString();
562     }
563 
toShortString(StringBuilder sb)564     void toShortString(StringBuilder sb) {
565         sb.append(pid);
566         sb.append(':');
567         sb.append(processName);
568         sb.append('/');
569         if (info.uid < Process.FIRST_APPLICATION_UID) {
570             sb.append(uid);
571         } else {
572             sb.append('u');
573             sb.append(userId);
574             int appId = UserHandle.getAppId(info.uid);
575             if (appId >= Process.FIRST_APPLICATION_UID) {
576                 sb.append('a');
577                 sb.append(appId - Process.FIRST_APPLICATION_UID);
578             } else {
579                 sb.append('s');
580                 sb.append(appId);
581             }
582             if (uid != info.uid) {
583                 sb.append('i');
584                 sb.append(UserHandle.getAppId(uid) - Process.FIRST_ISOLATED_UID);
585             }
586         }
587     }
588 
toString()589     public String toString() {
590         if (stringName != null) {
591             return stringName;
592         }
593         StringBuilder sb = new StringBuilder(128);
594         sb.append("ProcessRecord{");
595         sb.append(Integer.toHexString(System.identityHashCode(this)));
596         sb.append(' ');
597         toShortString(sb);
598         sb.append('}');
599         return stringName = sb.toString();
600     }
601 
makeAdjReason()602     public String makeAdjReason() {
603         if (adjSource != null || adjTarget != null) {
604             StringBuilder sb = new StringBuilder(128);
605             sb.append(' ');
606             if (adjTarget instanceof ComponentName) {
607                 sb.append(((ComponentName)adjTarget).flattenToShortString());
608             } else if (adjTarget != null) {
609                 sb.append(adjTarget.toString());
610             } else {
611                 sb.append("{null}");
612             }
613             sb.append("<=");
614             if (adjSource instanceof ProcessRecord) {
615                 sb.append("Proc{");
616                 sb.append(((ProcessRecord)adjSource).toShortString());
617                 sb.append("}");
618             } else if (adjSource != null) {
619                 sb.append(adjSource.toString());
620             } else {
621                 sb.append("{null}");
622             }
623             return sb.toString();
624         }
625         return null;
626     }
627 
628     /*
629      *  Return true if package has been added false if not
630      */
addPackage(String pkg, int versionCode, ProcessStatsService tracker)631     public boolean addPackage(String pkg, int versionCode, ProcessStatsService tracker) {
632         if (!pkgList.containsKey(pkg)) {
633             ProcessStats.ProcessStateHolder holder = new ProcessStats.ProcessStateHolder(
634                     versionCode);
635             if (baseProcessTracker != null) {
636                 holder.state = tracker.getProcessStateLocked(
637                         pkg, uid, versionCode, processName);
638                 pkgList.put(pkg, holder);
639                 if (holder.state != baseProcessTracker) {
640                     holder.state.makeActive();
641                 }
642             } else {
643                 pkgList.put(pkg, holder);
644             }
645             return true;
646         }
647         return false;
648     }
649 
getSetAdjWithServices()650     public int getSetAdjWithServices() {
651         if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
652             if (hasStartedServices) {
653                 return ProcessList.SERVICE_B_ADJ;
654             }
655         }
656         return setAdj;
657     }
658 
forceProcessStateUpTo(int newState)659     public void forceProcessStateUpTo(int newState) {
660         if (repProcState > newState) {
661             curProcState = repProcState = newState;
662         }
663     }
664 
665     /*
666      *  Delete all packages from list except the package indicated in info
667      */
resetPackageList(ProcessStatsService tracker)668     public void resetPackageList(ProcessStatsService tracker) {
669         final int N = pkgList.size();
670         if (baseProcessTracker != null) {
671             long now = SystemClock.uptimeMillis();
672             baseProcessTracker.setState(ProcessStats.STATE_NOTHING,
673                     tracker.getMemFactorLocked(), now, pkgList);
674             if (N != 1) {
675                 for (int i=0; i<N; i++) {
676                     ProcessStats.ProcessStateHolder holder = pkgList.valueAt(i);
677                     if (holder.state != null && holder.state != baseProcessTracker) {
678                         holder.state.makeInactive();
679                     }
680 
681                 }
682                 pkgList.clear();
683                 ProcessStats.ProcessState ps = tracker.getProcessStateLocked(
684                         info.packageName, uid, info.versionCode, processName);
685                 ProcessStats.ProcessStateHolder holder = new ProcessStats.ProcessStateHolder(
686                         info.versionCode);
687                 holder.state = ps;
688                 pkgList.put(info.packageName, holder);
689                 if (ps != baseProcessTracker) {
690                     ps.makeActive();
691                 }
692             }
693         } else if (N != 1) {
694             pkgList.clear();
695             pkgList.put(info.packageName, new ProcessStats.ProcessStateHolder(info.versionCode));
696         }
697     }
698 
getPackageList()699     public String[] getPackageList() {
700         int size = pkgList.size();
701         if (size == 0) {
702             return null;
703         }
704         String list[] = new String[size];
705         for (int i=0; i<pkgList.size(); i++) {
706             list[i] = pkgList.keyAt(i);
707         }
708         return list;
709     }
710 }
711