blob: 43693e1983b7ff160c42bf858ee824104b6e7435 [file] [log] [blame]
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001/*
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
17package android.app;
18
Andrii Kulianb047b8b2017-02-08 18:38:26 -080019import static android.view.Display.INVALID_DISPLAY;
20
Adam Lesinskic1b0ebf2016-06-09 11:17:10 -070021import android.annotation.NonNull;
22import android.annotation.Nullable;
Dianne Hackborn69c6adc2015-06-02 10:52:59 -070023import android.app.assist.AssistContent;
24import android.app.assist.AssistStructure;
Christopher Tate45281862010-03-05 15:46:30 -080025import android.app.backup.BackupAgent;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080026import android.content.BroadcastReceiver;
Dianne Hackbornc68c9132011-07-29 01:25:18 -070027import android.content.ComponentCallbacks2;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080028import android.content.ComponentName;
29import android.content.ContentProvider;
30import android.content.Context;
31import android.content.IContentProvider;
Suchi Amalapurapu1ccac752009-06-12 10:09:58 -070032import android.content.IIntentReceiver;
Jesse Hall317fa5a2017-05-23 15:46:55 -070033import android.content.Intent;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080034import android.content.pm.ActivityInfo;
35import android.content.pm.ApplicationInfo;
36import android.content.pm.IPackageManager;
37import android.content.pm.InstrumentationInfo;
Christopher Tate346acb12012-10-15 19:20:25 -070038import android.content.pm.PackageInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080039import android.content.pm.PackageManager;
Sen Hubde75702010-05-28 01:54:03 -070040import android.content.pm.PackageManager.NameNotFoundException;
Dianne Hackborn3f7c9f22017-04-04 15:36:33 -070041import android.content.pm.ParceledListSlice;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080042import android.content.pm.ProviderInfo;
43import android.content.pm.ServiceInfo;
44import android.content.res.AssetManager;
Mitsuru Oshimaba3ba572009-07-08 18:49:26 -070045import android.content.res.CompatibilityInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080046import android.content.res.Configuration;
47import android.content.res.Resources;
Alan Viverettee54d2452015-05-06 10:41:43 -070048import android.content.res.Resources.Theme;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080049import android.database.sqlite.SQLiteDatabase;
50import android.database.sqlite.SQLiteDebug;
Vasu Noric3849202010-03-09 10:47:25 -080051import android.database.sqlite.SQLiteDebug.DbStats;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080052import android.graphics.Bitmap;
53import android.graphics.Canvas;
Jeff Brownbd6e1502012-08-28 03:27:37 -070054import android.hardware.display.DisplayManagerGlobal;
Paul Jensene0bef712014-12-10 15:12:18 -050055import android.net.ConnectivityManager;
Robert Greenwalt434203a2010-10-11 16:00:27 -070056import android.net.IConnectivityManager;
Paul Jensene0bef712014-12-10 15:12:18 -050057import android.net.Network;
Robert Greenwalt434203a2010-10-11 16:00:27 -070058import android.net.Proxy;
Jason Monk207900c2014-04-25 15:00:09 -040059import android.net.ProxyInfo;
Jason Monk83520b92014-05-09 15:16:06 -040060import android.net.Uri;
Joe Onoratod630f102011-03-17 18:42:26 -070061import android.os.AsyncTask;
Amith Yamasani742a6712011-05-04 14:49:28 -070062import android.os.Binder;
Jeff Sharkey344744b2016-01-28 19:03:30 -070063import android.os.Build;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080064import android.os.Bundle;
65import android.os.Debug;
Geremy Condrab7faaf42012-09-19 18:07:42 -070066import android.os.DropBoxManager;
Jeff Sharkeyb049e212012-09-07 23:16:01 -070067import android.os.Environment;
Jesse Hallb12249b2016-12-12 12:53:02 -080068import android.os.GraphicsEnvironment;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080069import android.os.Handler;
70import android.os.IBinder;
Adam Lesinskib61e4052016-05-19 18:23:05 -070071import android.os.LocaleList;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080072import android.os.Looper;
73import android.os.Message;
74import android.os.MessageQueue;
Dianne Hackbornfabb70b2014-11-11 12:22:36 -080075import android.os.Parcel;
Dianne Hackborn9c8dd552009-06-23 19:22:52 -070076import android.os.ParcelFileDescriptor;
Craig Mautnera0026042014-04-23 11:45:37 -070077import android.os.PersistableBundle;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080078import android.os.Process;
79import android.os.RemoteException;
80import android.os.ServiceManager;
Brad Fitzpatrick438d0592010-06-10 12:19:19 -070081import android.os.StrictMode;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080082import android.os.SystemClock;
Jeff Brownefd43bd2012-09-21 17:02:35 -070083import android.os.SystemProperties;
Dianne Hackborn1ded0b12012-04-26 14:14:50 -070084import android.os.Trace;
Jeff Sharkey369f5092016-02-29 11:16:21 -070085import android.os.TransactionTooLargeException;
Dianne Hackbornf02b60a2012-08-16 10:48:27 -070086import android.os.UserHandle;
Jeff Sharkey0a17db12016-11-04 11:23:46 -060087import android.provider.BlockedNumberContract;
88import android.provider.CalendarContract;
89import android.provider.CallLog;
90import android.provider.ContactsContract;
91import android.provider.Downloads;
Seigo Nonaka54084b62017-04-24 14:46:23 -070092import android.provider.FontsContract;
Narayan Kamathccb2a0862013-12-19 14:49:36 +000093import android.provider.Settings;
Jesse Hall317fa5a2017-05-23 15:46:55 -070094import android.renderscript.RenderScriptCacheDir;
Chad Brubakerc72875b2016-04-27 16:35:11 -070095import android.security.NetworkSecurityPolicy;
Chad Brubaker78d47122015-11-17 22:26:58 -080096import android.security.net.config.NetworkSecurityConfigProvider;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080097import android.util.AndroidRuntimeException;
Dianne Hackbornadd005c2013-07-17 18:43:12 -070098import android.util.ArrayMap;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -080099import android.util.DisplayMetrics;
100import android.util.EventLog;
101import android.util.Log;
Dianne Hackborn287952c2010-09-22 22:34:31 -0700102import android.util.LogPrinter;
Jeff Sharkeya6bfeae2017-07-05 16:50:24 -0600103import android.util.LogWriter;
Craig Mautnereb8abf72014-07-02 15:04:09 -0700104import android.util.Pair;
Jeff Brown6754ba22011-12-14 20:20:01 -0800105import android.util.PrintWriterPrinter;
Dianne Hackbornc9421ba2010-03-11 22:23:46 -0800106import android.util.Slog;
Filip Gruszczynski20aa0ae2015-10-30 10:08:27 -0700107import android.util.SparseIntArray;
Adam Powell14874662013-07-18 19:42:41 -0700108import android.util.SuperNotCalledException;
Adam Lesinski3ad1b482016-04-01 16:41:41 -0700109import android.view.ContextThemeWrapper;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800110import android.view.Display;
John Reck51aaf902015-12-02 15:08:07 -0800111import android.view.ThreadedRenderer;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800112import android.view.View;
113import android.view.ViewDebug;
114import android.view.ViewManager;
Dianne Hackborn6dd005b2011-07-18 13:22:50 -0700115import android.view.ViewRootImpl;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800116import android.view.Window;
117import android.view.WindowManager;
Jeff Brown98365d72012-08-19 20:30:52 -0700118import android.view.WindowManagerGlobal;
Richard Uhler2c036192016-09-14 09:48:31 +0100119import android.webkit.WebView;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800120
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700121import com.android.internal.annotations.GuardedBy;
Dianne Hackborn91097de2014-04-04 18:02:06 -0700122import com.android.internal.app.IVoiceInteractor;
Dianne Hackborn85d558c2014-11-04 10:31:54 -0800123import com.android.internal.content.ReferrerIntent;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800124import com.android.internal.os.BinderInternal;
125import com.android.internal.os.RuntimeInit;
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700126import com.android.internal.os.SomeArgs;
Jeff Sharkey3e195892016-03-05 19:48:59 -0700127import com.android.internal.util.ArrayUtils;
Dianne Hackborn8c841092013-06-24 13:46:13 -0700128import com.android.internal.util.FastPrintWriter;
Jeff Sharkeya6bfeae2017-07-05 16:50:24 -0600129import com.android.internal.util.IndentingPrintWriter;
Kenny Root12e75222013-04-23 22:34:24 -0700130import com.android.org.conscrypt.OpenSSLSocketImpl;
Robin Lee3d076af2014-04-25 14:57:49 +0100131import com.android.org.conscrypt.TrustedCertificateStore;
Jesse Hall317fa5a2017-05-23 15:46:55 -0700132
133import dalvik.system.BaseDexClassLoader;
134import dalvik.system.CloseGuard;
135import dalvik.system.VMDebug;
136import dalvik.system.VMRuntime;
137
Jesse Hall317fa5a2017-05-23 15:46:55 -0700138import libcore.io.DropBox;
139import libcore.io.EventLogger;
140import libcore.io.IoUtils;
141import libcore.net.event.NetworkEventDispatcher;
142
143import org.apache.harmony.dalvik.ddmc.DdmVmInternal;
144
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800145import java.io.File;
146import java.io.FileDescriptor;
147import java.io.FileOutputStream;
Dianne Hackborn9c8dd552009-06-23 19:22:52 -0700148import java.io.IOException;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800149import java.io.PrintWriter;
150import java.lang.ref.WeakReference;
Svet Ganov37e43272016-09-09 16:01:32 -0700151import java.lang.reflect.Field;
Robert Greenwalt03595d02010-11-02 14:08:23 -0700152import java.net.InetAddress;
Narayan Kamathccb2a0862013-12-19 14:49:36 +0000153import java.text.DateFormat;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800154import java.util.ArrayList;
Jeff Sharkeya6bfeae2017-07-05 16:50:24 -0600155import java.util.Arrays;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800156import java.util.List;
Adam Lesinskib61e4052016-05-19 18:23:05 -0700157import java.util.Locale;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800158import java.util.Map;
Kenny Roote6585b32013-12-13 12:00:26 -0800159import java.util.Objects;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800160import java.util.TimeZone;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800161
Dianne Hackborn9d39d0c2010-06-24 15:57:42 -0700162final class RemoteServiceException extends AndroidRuntimeException {
163 public RemoteServiceException(String msg) {
164 super(msg);
165 }
166}
167
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800168/**
169 * This manages the execution of the main thread in an
170 * application process, scheduling and executing activities,
171 * broadcasts, and other operations on it as the activity
172 * manager requests.
173 *
174 * {@hide}
175 */
176public final class ActivityThread {
Dianne Hackborne829fef2010-10-26 17:44:01 -0700177 /** @hide */
178 public static final String TAG = "ActivityThread";
Jim Miller0b2a6d02010-07-13 18:01:29 -0700179 private static final android.graphics.Bitmap.Config THUMBNAIL_FORMAT = Bitmap.Config.RGB_565;
Joe Onorato43a17652011-04-06 19:22:23 -0700180 static final boolean localLOGV = false;
Dianne Hackborn287952c2010-09-22 22:34:31 -0700181 static final boolean DEBUG_MESSAGES = false;
Dianne Hackborne829fef2010-10-26 17:44:01 -0700182 /** @hide */
183 public static final boolean DEBUG_BROADCAST = false;
Chris Tate8a7dc172009-03-24 20:11:42 -0700184 private static final boolean DEBUG_RESULTS = false;
Dianne Hackborn755c8bf2012-05-07 15:06:09 -0700185 private static final boolean DEBUG_BACKUP = false;
Craig Mautner88c05892013-06-28 09:47:45 -0700186 public static final boolean DEBUG_CONFIGURATION = false;
Dianne Hackborna0c283e2012-02-09 10:47:01 -0800187 private static final boolean DEBUG_SERVICE = false;
Dianne Hackborn162bc0e2012-04-09 14:06:16 -0700188 private static final boolean DEBUG_MEMORY_TRIM = false;
Dianne Hackborn6ae8d182012-05-23 13:12:42 -0700189 private static final boolean DEBUG_PROVIDER = false;
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700190 private static final boolean DEBUG_ORDER = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800191 private static final long MIN_TIME_BETWEEN_GCS = 5*1000;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800192 private static final int SQLITE_MEM_RELEASED_EVENT_LOG_TAG = 75003;
Craig Mautnere3119b72015-01-20 15:02:36 -0800193 private static final int LOG_AM_ON_PAUSE_CALLED = 30021;
194 private static final int LOG_AM_ON_RESUME_CALLED = 30022;
Wale Ogunwalecd7043e2016-02-27 17:37:46 -0800195 private static final int LOG_AM_ON_STOP_CALLED = 30049;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800196
Dianne Hackborn455625e2015-01-21 09:55:13 -0800197 /** Type for IActivityManager.serviceDoneExecuting: anonymous operation */
198 public static final int SERVICE_DONE_EXECUTING_ANON = 0;
199 /** Type for IActivityManager.serviceDoneExecuting: done with an onStart call */
200 public static final int SERVICE_DONE_EXECUTING_START = 1;
201 /** Type for IActivityManager.serviceDoneExecuting: done stopping (destroying) service */
202 public static final int SERVICE_DONE_EXECUTING_STOP = 2;
203
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700204 // Details for pausing activity.
205 private static final int USER_LEAVING = 1;
206 private static final int DONT_REPORT = 2;
207
Filip Gruszczynskica664812015-12-04 12:43:36 -0800208 // Whether to invoke an activity callback after delivering new configuration.
209 private static final boolean REPORT_TO_ACTIVITY = true;
210
Sudheer Shanka84a48952017-03-08 18:19:01 -0800211 /**
212 * Denotes an invalid sequence number corresponding to a process state change.
213 */
214 public static final long INVALID_PROC_STATE_SEQ = -1;
215
216 private final Object mNetworkPolicyLock = new Object();
217
218 /**
219 * Denotes the sequence number of the process state change for which the main thread needs
220 * to block until the network rules are updated for it.
221 *
222 * Value of {@link #INVALID_PROC_STATE_SEQ} indicates there is no need for blocking.
223 */
224 @GuardedBy("mNetworkPolicyLock")
225 private long mNetworkBlockSeq = INVALID_PROC_STATE_SEQ;
226
Jeff Browndefd4a62014-03-10 21:24:37 -0700227 private ContextImpl mSystemContext;
Adam Lesinskia82b6262017-03-21 16:56:17 -0700228 private ContextImpl mSystemUiContext;
Bob Leee5408332009-09-04 18:31:17 -0700229
Jeff Sharkeyd5896632016-03-04 16:16:00 -0700230 static volatile IPackageManager sPackageManager;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800231
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700232 final ApplicationThread mAppThread = new ApplicationThread();
233 final Looper mLooper = Looper.myLooper();
234 final H mH = new H();
Dianne Hackborn782d4982015-07-08 17:36:37 -0700235 final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700236 // List of new activities (via ActivityRecord.nextIdle) that should
237 // be reported when next we idle.
238 ActivityClientRecord mNewActivities = null;
239 // Number of activities that are currently visible on-screen.
240 int mNumVisibleActivities = 0;
Amith Yamasani4f128e42016-05-10 11:44:12 -0700241 ArrayList<WeakReference<AssistStructure>> mLastAssistStructures = new ArrayList<>();
242 private int mLastSessionId;
Dianne Hackborn782d4982015-07-08 17:36:37 -0700243 final ArrayMap<IBinder, Service> mServices = new ArrayMap<>();
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700244 AppBindData mBoundApplication;
Jeff Sharkey3ad9d002011-09-15 15:51:54 -0700245 Profiler mProfiler;
Dianne Hackborn908aecc2012-07-31 16:37:34 -0700246 int mCurDefaultDisplayDpi;
Dianne Hackborndde331c2012-08-03 14:01:57 -0700247 boolean mDensityCompatMode;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700248 Configuration mConfiguration;
Dianne Hackborn5fd21692011-06-07 14:09:47 -0700249 Configuration mCompatConfiguration;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700250 Application mInitialApplication;
251 final ArrayList<Application> mAllApplications
252 = new ArrayList<Application>();
253 // set of instantiated backup agents, keyed by package name
Dianne Hackbornadd005c2013-07-17 18:43:12 -0700254 final ArrayMap<String, BackupAgent> mBackupAgents = new ArrayMap<String, BackupAgent>();
Jeff Sharkey66a017b2013-01-17 18:18:22 -0800255 /** Reference to singleton {@link ActivityThread} */
Jeff Sharkeyd5896632016-03-04 16:16:00 -0700256 private static volatile ActivityThread sCurrentActivityThread;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700257 Instrumentation mInstrumentation;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700258 String mInstrumentationPackageName = null;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700259 String mInstrumentationAppDir = null;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700260 String[] mInstrumentationSplitAppDirs = null;
261 String mInstrumentationLibDir = null;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700262 String mInstrumentedAppDir = null;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -0700263 String[] mInstrumentedSplitAppDirs = null;
264 String mInstrumentedLibDir = null;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700265 boolean mSystemThread = false;
266 boolean mJitEnabled = false;
Dianne Hackborn89ad4562014-08-24 16:45:38 -0700267 boolean mSomeActivitiesChanged = false;
Chong Zhang4951f9d2016-06-23 13:15:08 -0700268 boolean mUpdatingSystemConfig = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800269
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +0100270 // These can be accessed by multiple threads; mResourcesManager is the lock.
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700271 // XXX For now we keep around information about all packages we have
272 // seen, not removing entries from this map.
Dianne Hackborn1fbee792011-11-30 11:29:58 -0800273 // NOTE: The activity and window managers need to call in to
Dianne Hackborn2f0b1752011-05-31 17:59:49 -0700274 // ActivityThread to do things like update resource configurations,
Dianne Hackborn1fbee792011-11-30 11:29:58 -0800275 // which means this lock gets held while the activity and window managers
276 // holds their own lock. Thus you MUST NEVER call back into the activity manager
277 // or window manager or anything that depends on them while holding this lock.
Jeff Sharkeyb9f36742015-04-08 21:02:14 -0700278 // These LoadedApk are only valid for the userId that we're running as.
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +0100279 @GuardedBy("mResourcesManager")
280 final ArrayMap<String, WeakReference<LoadedApk>> mPackages = new ArrayMap<>();
281 @GuardedBy("mResourcesManager")
282 final ArrayMap<String, WeakReference<LoadedApk>> mResourcePackages = new ArrayMap<>();
283 @GuardedBy("mResourcesManager")
284 final ArrayList<ActivityClientRecord> mRelaunchingActivities = new ArrayList<>();
285 @GuardedBy("mResourcesManager")
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700286 Configuration mPendingConfiguration = null;
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700287 // Because we merge activity relaunch operations we can't depend on the ordering provided by
288 // the handler messages. We need to introduce secondary ordering mechanism, which will allow
289 // us to drop certain events, if we know that they happened before relaunch we already executed.
290 // This represents the order of receiving the request from AM.
291 @GuardedBy("mResourcesManager")
292 int mLifecycleSeq = 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800293
Craig Mautner88c05892013-06-28 09:47:45 -0700294 private final ResourcesManager mResourcesManager;
295
Jeff Sharkey6d515712012-09-20 16:06:08 -0700296 private static final class ProviderKey {
297 final String authority;
298 final int userId;
299
300 public ProviderKey(String authority, int userId) {
301 this.authority = authority;
302 this.userId = userId;
303 }
304
305 @Override
306 public boolean equals(Object o) {
307 if (o instanceof ProviderKey) {
308 final ProviderKey other = (ProviderKey) o;
Kenny Roote6585b32013-12-13 12:00:26 -0800309 return Objects.equals(authority, other.authority) && userId == other.userId;
Jeff Sharkey6d515712012-09-20 16:06:08 -0700310 }
311 return false;
312 }
313
314 @Override
315 public int hashCode() {
316 return ((authority != null) ? authority.hashCode() : 0) ^ userId;
317 }
318 }
319
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700320 // The lock of mProviderMap protects the following variables.
Wale Ogunwale1d646122015-04-24 14:45:14 -0700321 final ArrayMap<ProviderKey, ProviderClientRecord> mProviderMap
322 = new ArrayMap<ProviderKey, ProviderClientRecord>();
323 final ArrayMap<IBinder, ProviderRefCount> mProviderRefCountMap
324 = new ArrayMap<IBinder, ProviderRefCount>();
325 final ArrayMap<IBinder, ProviderClientRecord> mLocalProviders
326 = new ArrayMap<IBinder, ProviderClientRecord>();
327 final ArrayMap<ComponentName, ProviderClientRecord> mLocalProvidersByName
328 = new ArrayMap<ComponentName, ProviderClientRecord>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800329
Dianne Hackbornadd005c2013-07-17 18:43:12 -0700330 final ArrayMap<Activity, ArrayList<OnActivityPausedListener>> mOnPauseListeners
Wale Ogunwale1d646122015-04-24 14:45:14 -0700331 = new ArrayMap<Activity, ArrayList<OnActivityPausedListener>>();
Jeff Hamilton52d32032011-01-08 15:31:26 -0600332
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700333 final GcIdler mGcIdler = new GcIdler();
334 boolean mGcIdlerScheduled = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800335
Jeff Sharkeyd5896632016-03-04 16:16:00 -0700336 static volatile Handler sMainThreadHandler; // set once in main()
Brad Fitzpatrick333b8cb2010-08-26 12:04:57 -0700337
Svetoslav Ganov9aa597e2011-03-03 18:17:41 -0800338 Bundle mCoreSettings = null;
339
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400340 static final class ActivityClientRecord {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800341 IBinder token;
Dianne Hackbornb06ea702009-07-13 13:07:51 -0700342 int ident;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800343 Intent intent;
Dianne Hackborn85d558c2014-11-04 10:31:54 -0800344 String referrer;
Dianne Hackborn91097de2014-04-04 18:02:06 -0700345 IVoiceInteractor voiceInteractor;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800346 Bundle state;
Craig Mautnera0026042014-04-23 11:45:37 -0700347 PersistableBundle persistentState;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800348 Activity activity;
349 Window window;
350 Activity parent;
351 String embeddedID;
Dianne Hackbornb4bc78b2010-05-12 18:59:50 -0700352 Activity.NonConfigurationInstances lastNonConfigurationInstances;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800353 boolean paused;
354 boolean stopped;
355 boolean hideForNow;
356 Configuration newConfig;
Dianne Hackborne88846e2009-09-30 21:34:25 -0700357 Configuration createdConfig;
Wale Ogunwale60454db2015-01-23 16:05:07 -0800358 Configuration overrideConfig;
Wale Ogunwalec2607b42015-02-07 16:16:59 -0800359 // Used for consolidating configs before sending on to Activity.
360 private Configuration tmpConfig = new Configuration();
Andrii Kulian44607962017-03-16 11:06:24 -0700361 // Callback used for updating activity override config.
362 ViewRootImpl.ActivityConfigCallback configCallback;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700363 ActivityClientRecord nextIdle;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800364
Jeff Hao1b012d32014-08-20 10:35:34 -0700365 ProfilerInfo profilerInfo;
Dianne Hackborn62f20ec2011-08-15 17:40:28 -0700366
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800367 ActivityInfo activityInfo;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400368 CompatibilityInfo compatInfo;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700369 LoadedApk packageInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800370
371 List<ResultInfo> pendingResults;
Dianne Hackborn85d558c2014-11-04 10:31:54 -0800372 List<ReferrerIntent> pendingIntents;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800373
374 boolean startsNotResumed;
375 boolean isForward;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -0800376 int pendingConfigChanges;
377 boolean onlyLocalRequest;
378
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -0700379 Window mPendingRemoveWindow;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -0800380 WindowManager mPendingRemoveWindowManager;
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -0700381 boolean mPreserveWindow;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800382
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700383 // Set for relaunch requests, indicates the order number of the relaunch operation, so it
384 // can be compared with other lifecycle operations.
385 int relaunchSeq = 0;
386
387 // Can only be accessed from the UI thread. This represents the latest processed message
388 // that is related to lifecycle events/
389 int lastProcessedSeq = 0;
390
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700391 ActivityClientRecord() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800392 parent = null;
393 embeddedID = null;
394 paused = false;
395 stopped = false;
396 hideForNow = false;
397 nextIdle = null;
Andrii Kulian44607962017-03-16 11:06:24 -0700398 configCallback = (Configuration overrideConfig, int newDisplayId) -> {
399 if (activity == null) {
400 throw new IllegalStateException(
401 "Received config update for non-existing activity");
402 }
403 activity.mMainThread.handleActivityConfigurationChanged(
404 new ActivityConfigChangeData(token, overrideConfig), newDisplayId);
405 };
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800406 }
407
Dianne Hackborn0aae2d42010-12-07 23:51:29 -0800408 public boolean isPreHoneycomb() {
409 if (activity != null) {
410 return activity.getApplicationInfo().targetSdkVersion
411 < android.os.Build.VERSION_CODES.HONEYCOMB;
412 }
413 return false;
414 }
415
Craig Mautnera0026042014-04-23 11:45:37 -0700416 public boolean isPersistable() {
Craig Mautner43e52ed2014-06-16 17:18:52 -0700417 return activityInfo.persistableMode == ActivityInfo.PERSIST_ACROSS_REBOOTS;
Craig Mautnera0026042014-04-23 11:45:37 -0700418 }
419
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800420 public String toString() {
Dianne Hackbornb61a0262012-05-14 17:19:18 -0700421 ComponentName componentName = intent != null ? intent.getComponent() : null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800422 return "ActivityRecord{"
423 + Integer.toHexString(System.identityHashCode(this))
424 + " token=" + token + " " + (componentName == null
425 ? "no component name" : componentName.toShortString())
426 + "}";
427 }
Andrii Kulian58178f22016-03-16 13:44:56 -0700428
429 public String getStateString() {
430 StringBuilder sb = new StringBuilder();
431 sb.append("ActivityClientRecord{");
432 sb.append("paused=").append(paused);
433 sb.append(", stopped=").append(stopped);
434 sb.append(", hideForNow=").append(hideForNow);
435 sb.append(", startsNotResumed=").append(startsNotResumed);
436 sb.append(", isForward=").append(isForward);
437 sb.append(", pendingConfigChanges=").append(pendingConfigChanges);
438 sb.append(", onlyLocalRequest=").append(onlyLocalRequest);
439 sb.append(", preserveWindow=").append(mPreserveWindow);
440 if (activity != null) {
441 sb.append(", Activity{");
442 sb.append("resumed=").append(activity.mResumed);
443 sb.append(", stopped=").append(activity.mStopped);
444 sb.append(", finished=").append(activity.isFinishing());
445 sb.append(", destroyed=").append(activity.isDestroyed());
446 sb.append(", startedActivity=").append(activity.mStartedActivity);
447 sb.append(", temporaryPause=").append(activity.mTemporaryPause);
448 sb.append(", changingConfigurations=").append(activity.mChangingConfigurations);
Andrii Kulian58178f22016-03-16 13:44:56 -0700449 sb.append("}");
450 }
451 sb.append("}");
452 return sb.toString();
453 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800454 }
455
Wale Ogunwale1d646122015-04-24 14:45:14 -0700456 final class ProviderClientRecord {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -0700457 final String[] mNames;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800458 final IContentProvider mProvider;
459 final ContentProvider mLocalProvider;
Sudheer Shankafc46e9b2016-10-21 17:55:27 -0700460 final ContentProviderHolder mHolder;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800461
Dianne Hackborn6ae8d182012-05-23 13:12:42 -0700462 ProviderClientRecord(String[] names, IContentProvider provider,
Sudheer Shankafc46e9b2016-10-21 17:55:27 -0700463 ContentProvider localProvider, ContentProviderHolder holder) {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -0700464 mNames = names;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800465 mProvider = provider;
466 mLocalProvider = localProvider;
Dianne Hackborn6ae8d182012-05-23 13:12:42 -0700467 mHolder = holder;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800468 }
469 }
470
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400471 static final class NewIntentData {
Dianne Hackborn85d558c2014-11-04 10:31:54 -0800472 List<ReferrerIntent> intents;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800473 IBinder token;
Wale Ogunwale826c7062016-09-13 08:25:54 -0700474 boolean andPause;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800475 public String toString() {
Wale Ogunwale826c7062016-09-13 08:25:54 -0700476 return "NewIntentData{intents=" + intents + " token=" + token
477 + " andPause=" + andPause +"}";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800478 }
479 }
480
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400481 static final class ReceiverData extends BroadcastReceiver.PendingResult {
Dianne Hackborne829fef2010-10-26 17:44:01 -0700482 public ReceiverData(Intent intent, int resultCode, String resultData, Bundle resultExtras,
Dianne Hackborn20e80982012-08-31 19:00:44 -0700483 boolean ordered, boolean sticky, IBinder token, int sendingUser) {
484 super(resultCode, resultData, resultExtras, TYPE_COMPONENT, ordered, sticky,
riddle_hsu1f5ac4d2015-01-03 15:38:21 +0800485 token, sendingUser, intent.getFlags());
Dianne Hackborne829fef2010-10-26 17:44:01 -0700486 this.intent = intent;
487 }
Robert Greenwalt434203a2010-10-11 16:00:27 -0700488
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800489 Intent intent;
490 ActivityInfo info;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400491 CompatibilityInfo compatInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800492 public String toString() {
493 return "ReceiverData{intent=" + intent + " packageName=" +
Dianne Hackborne829fef2010-10-26 17:44:01 -0700494 info.packageName + " resultCode=" + getResultCode()
495 + " resultData=" + getResultData() + " resultExtras="
496 + getResultExtras(false) + "}";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800497 }
498 }
499
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400500 static final class CreateBackupAgentData {
Christopher Tate181fafa2009-05-14 11:12:14 -0700501 ApplicationInfo appInfo;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400502 CompatibilityInfo compatInfo;
Christopher Tate181fafa2009-05-14 11:12:14 -0700503 int backupMode;
504 public String toString() {
505 return "CreateBackupAgentData{appInfo=" + appInfo
506 + " backupAgent=" + appInfo.backupAgentName
507 + " mode=" + backupMode + "}";
508 }
509 }
Bob Leee5408332009-09-04 18:31:17 -0700510
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400511 static final class CreateServiceData {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800512 IBinder token;
513 ServiceInfo info;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400514 CompatibilityInfo compatInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800515 Intent intent;
516 public String toString() {
517 return "CreateServiceData{token=" + token + " className="
518 + info.name + " packageName=" + info.packageName
519 + " intent=" + intent + "}";
520 }
521 }
522
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400523 static final class BindServiceData {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800524 IBinder token;
525 Intent intent;
526 boolean rebind;
527 public String toString() {
528 return "BindServiceData{token=" + token + " intent=" + intent + "}";
529 }
530 }
531
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400532 static final class ServiceArgsData {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800533 IBinder token;
Dianne Hackborn0c5001d2011-04-12 18:16:08 -0700534 boolean taskRemoved;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800535 int startId;
Dianne Hackbornf6f9f2d2009-08-21 16:26:03 -0700536 int flags;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800537 Intent args;
538 public String toString() {
539 return "ServiceArgsData{token=" + token + " startId=" + startId
540 + " args=" + args + "}";
541 }
542 }
543
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400544 static final class AppBindData {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700545 LoadedApk info;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800546 String processName;
547 ApplicationInfo appInfo;
548 List<ProviderInfo> providers;
549 ComponentName instrumentationName;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800550 Bundle instrumentationArgs;
551 IInstrumentationWatcher instrumentationWatcher;
Svetoslav Ganov80943d82013-01-02 10:25:37 -0800552 IUiAutomationConnection instrumentationUiAutomationConnection;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800553 int debugMode;
Rahul Chaturvedi52613f92015-06-17 23:54:08 -0400554 boolean enableBinderTracking;
Man Caocfa78b22015-06-11 20:14:34 -0700555 boolean trackAllocation;
Christopher Tate181fafa2009-05-14 11:12:14 -0700556 boolean restrictedBackupMode;
Dianne Hackborn5d927c22011-09-02 12:22:18 -0700557 boolean persistent;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800558 Configuration config;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400559 CompatibilityInfo compatInfo;
Svet Ganov37e43272016-09-09 16:01:32 -0700560 String buildSerial;
Jeff Sharkey3ad9d002011-09-15 15:51:54 -0700561
562 /** Initial values for {@link Profiler}. */
Jeff Hao1b012d32014-08-20 10:35:34 -0700563 ProfilerInfo initProfilerInfo;
Jeff Sharkey3ad9d002011-09-15 15:51:54 -0700564
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800565 public String toString() {
566 return "AppBindData{appInfo=" + appInfo + "}";
567 }
Jeff Sharkey3ad9d002011-09-15 15:51:54 -0700568 }
569
570 static final class Profiler {
571 String profileFile;
572 ParcelFileDescriptor profileFd;
Jeff Hao1b012d32014-08-20 10:35:34 -0700573 int samplingInterval;
Jeff Sharkey3ad9d002011-09-15 15:51:54 -0700574 boolean autoStopProfiler;
Shukang Zhou6ffd4f92017-01-25 16:07:57 -0800575 boolean streamingOutput;
Jeff Sharkey3ad9d002011-09-15 15:51:54 -0700576 boolean profiling;
577 boolean handlingProfiling;
Jeff Hao1b012d32014-08-20 10:35:34 -0700578 public void setProfiler(ProfilerInfo profilerInfo) {
579 ParcelFileDescriptor fd = profilerInfo.profileFd;
Dianne Hackborn62f20ec2011-08-15 17:40:28 -0700580 if (profiling) {
581 if (fd != null) {
582 try {
583 fd.close();
584 } catch (IOException e) {
Romain Guya998dff2012-03-23 18:58:36 -0700585 // Ignore
Dianne Hackborn62f20ec2011-08-15 17:40:28 -0700586 }
587 }
588 return;
589 }
590 if (profileFd != null) {
591 try {
592 profileFd.close();
593 } catch (IOException e) {
Romain Guya998dff2012-03-23 18:58:36 -0700594 // Ignore
Dianne Hackborn62f20ec2011-08-15 17:40:28 -0700595 }
596 }
Jeff Hao1b012d32014-08-20 10:35:34 -0700597 profileFile = profilerInfo.profileFile;
Dianne Hackborn62f20ec2011-08-15 17:40:28 -0700598 profileFd = fd;
Jeff Hao1b012d32014-08-20 10:35:34 -0700599 samplingInterval = profilerInfo.samplingInterval;
600 autoStopProfiler = profilerInfo.autoStopProfiler;
Shukang Zhou6ffd4f92017-01-25 16:07:57 -0800601 streamingOutput = profilerInfo.streamingOutput;
Dianne Hackborn62f20ec2011-08-15 17:40:28 -0700602 }
603 public void startProfiling() {
604 if (profileFd == null || profiling) {
605 return;
606 }
607 try {
Andreas Gampeeff06392016-05-10 12:51:45 -0700608 int bufferSize = SystemProperties.getInt("debug.traceview-buffer-size-mb", 8);
Jeff Hao1b012d32014-08-20 10:35:34 -0700609 VMDebug.startMethodTracing(profileFile, profileFd.getFileDescriptor(),
Shukang Zhou6ffd4f92017-01-25 16:07:57 -0800610 bufferSize * 1024 * 1024, 0, samplingInterval != 0, samplingInterval,
611 streamingOutput);
Dianne Hackborn62f20ec2011-08-15 17:40:28 -0700612 profiling = true;
613 } catch (RuntimeException e) {
614 Slog.w(TAG, "Profiling failed on path " + profileFile);
615 try {
616 profileFd.close();
617 profileFd = null;
618 } catch (IOException e2) {
619 Slog.w(TAG, "Failure closing profile fd", e2);
620 }
621 }
622 }
623 public void stopProfiling() {
624 if (profiling) {
625 profiling = false;
626 Debug.stopMethodTracing();
627 if (profileFd != null) {
628 try {
629 profileFd.close();
630 } catch (IOException e) {
631 }
632 }
633 profileFd = null;
634 profileFile = null;
635 }
636 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800637 }
638
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400639 static final class DumpComponentInfo {
Dianne Hackborne17aeb32011-04-07 15:11:57 -0700640 ParcelFileDescriptor fd;
Dianne Hackborn625ac272010-09-17 18:29:22 -0700641 IBinder token;
Dianne Hackborn30d71892010-12-11 10:37:55 -0800642 String prefix;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800643 String[] args;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800644 }
645
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400646 static final class ResultData {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800647 IBinder token;
648 List<ResultInfo> results;
649 public String toString() {
650 return "ResultData{token=" + token + " results" + results + "}";
651 }
652 }
653
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400654 static final class ContextCleanupInfo {
Dianne Hackborn21556372010-02-04 16:34:40 -0800655 ContextImpl context;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800656 String what;
657 String who;
658 }
659
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400660 static final class DumpHeapData {
Christopher Ferris8d652f82017-04-11 16:29:18 -0700661 public boolean managed;
662 public boolean mallocInfo;
Makoto Onuki4556b7b2017-07-07 14:58:58 -0700663 public boolean runGc;
Andy McFadden824c5102010-07-09 16:26:57 -0700664 String path;
665 ParcelFileDescriptor fd;
666 }
667
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400668 static final class UpdateCompatibilityData {
669 String pkg;
670 CompatibilityInfo info;
671 }
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800672
Adam Skorydfc7fd72013-08-05 19:23:41 -0700673 static final class RequestAssistContextExtras {
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800674 IBinder activityToken;
675 IBinder requestToken;
676 int requestType;
Amith Yamasani4f128e42016-05-10 11:44:12 -0700677 int sessionId;
Svet Ganovfd31f852017-04-26 15:54:27 -0700678 int flags;
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -0800679 }
Anwar Ghuloum3a8ce1b2013-04-26 16:18:28 -0700680
Wale Ogunwalec2607b42015-02-07 16:16:59 -0800681 static final class ActivityConfigChangeData {
682 final IBinder activityToken;
683 final Configuration overrideConfig;
684 public ActivityConfigChangeData(IBinder token, Configuration config) {
685 activityToken = token;
686 overrideConfig = config;
687 }
688 }
689
Sudheer Shankacc6418f2016-10-13 12:03:44 -0700690 private class ApplicationThread extends IApplicationThread.Stub {
Vasu Nori3c7131f2010-09-21 14:36:57 -0700691 private static final String DB_INFO_FORMAT = " %8s %8s %14s %14s %s";
Bob Leee5408332009-09-04 18:31:17 -0700692
Dianne Hackborna413dc02013-07-12 12:02:55 -0700693 private int mLastProcessState = -1;
694
Dianne Hackborn58f42a52011-10-10 13:46:34 -0700695 private void updatePendingConfiguration(Configuration config) {
Craig Mautner88c05892013-06-28 09:47:45 -0700696 synchronized (mResourcesManager) {
Dianne Hackborn58f42a52011-10-10 13:46:34 -0700697 if (mPendingConfiguration == null ||
698 mPendingConfiguration.isOtherSeqNewer(config)) {
699 mPendingConfiguration = config;
700 }
701 }
702 }
703
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800704 public final void schedulePauseActivity(IBinder token, boolean finished,
Dianne Hackborna4e102e2014-09-04 22:52:27 -0700705 boolean userLeaving, int configChanges, boolean dontReport) {
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700706 int seq = getLifecycleSeq();
707 if (DEBUG_ORDER) Slog.d(TAG, "pauseActivity " + ActivityThread.this
708 + " operation received seq: " + seq);
Jeff Brown9ef09972013-10-15 20:49:59 -0700709 sendMessage(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800710 finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,
711 token,
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700712 (userLeaving ? USER_LEAVING : 0) | (dontReport ? DONT_REPORT : 0),
713 configChanges,
714 seq);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800715 }
716
717 public final void scheduleStopActivity(IBinder token, boolean showWindow,
718 int configChanges) {
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700719 int seq = getLifecycleSeq();
720 if (DEBUG_ORDER) Slog.d(TAG, "stopActivity " + ActivityThread.this
721 + " operation received seq: " + seq);
722 sendMessage(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800723 showWindow ? H.STOP_ACTIVITY_SHOW : H.STOP_ACTIVITY_HIDE,
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700724 token, 0, configChanges, seq);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800725 }
726
727 public final void scheduleWindowVisibility(IBinder token, boolean showWindow) {
Jeff Brown9ef09972013-10-15 20:49:59 -0700728 sendMessage(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800729 showWindow ? H.SHOW_WINDOW : H.HIDE_WINDOW,
730 token);
731 }
732
Dianne Hackborn4eba96b2011-01-21 13:34:36 -0800733 public final void scheduleSleeping(IBinder token, boolean sleeping) {
Jeff Brown9ef09972013-10-15 20:49:59 -0700734 sendMessage(H.SLEEPING, token, sleeping ? 1 : 0);
Dianne Hackborn4eba96b2011-01-21 13:34:36 -0800735 }
736
Dianne Hackborna413dc02013-07-12 12:02:55 -0700737 public final void scheduleResumeActivity(IBinder token, int processState,
Adam Powellcfbe9be2013-11-06 14:58:58 -0800738 boolean isForward, Bundle resumeArgs) {
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700739 int seq = getLifecycleSeq();
740 if (DEBUG_ORDER) Slog.d(TAG, "resumeActivity " + ActivityThread.this
741 + " operation received seq: " + seq);
Dianne Hackborna413dc02013-07-12 12:02:55 -0700742 updateProcessState(processState, false);
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -0700743 sendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0, 0, seq);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800744 }
745
746 public final void scheduleSendResult(IBinder token, List<ResultInfo> results) {
747 ResultData res = new ResultData();
748 res.token = token;
749 res.results = results;
Jeff Brown9ef09972013-10-15 20:49:59 -0700750 sendMessage(H.SEND_RESULT, res);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800751 }
752
753 // we use token to identify this activity without having to send the
754 // activity itself back to the activity manager. (matters more with ipc)
Wale Ogunwale60454db2015-01-23 16:05:07 -0800755 @Override
Dianne Hackbornb06ea702009-07-13 13:07:51 -0700756 public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
Wale Ogunwale60454db2015-01-23 16:05:07 -0800757 ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
758 CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
759 int procState, Bundle state, PersistableBundle persistentState,
760 List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
761 boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {
Dianne Hackborna413dc02013-07-12 12:02:55 -0700762
763 updateProcessState(procState, false);
764
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -0700765 ActivityClientRecord r = new ActivityClientRecord();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800766
767 r.token = token;
Dianne Hackbornb06ea702009-07-13 13:07:51 -0700768 r.ident = ident;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800769 r.intent = intent;
Dianne Hackborn85d558c2014-11-04 10:31:54 -0800770 r.referrer = referrer;
Dianne Hackborn91097de2014-04-04 18:02:06 -0700771 r.voiceInteractor = voiceInteractor;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800772 r.activityInfo = info;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400773 r.compatInfo = compatInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800774 r.state = state;
Craig Mautnera0026042014-04-23 11:45:37 -0700775 r.persistentState = persistentState;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800776
777 r.pendingResults = pendingResults;
778 r.pendingIntents = pendingNewIntents;
779
780 r.startsNotResumed = notResumed;
781 r.isForward = isForward;
782
Jeff Hao1b012d32014-08-20 10:35:34 -0700783 r.profilerInfo = profilerInfo;
Dianne Hackborn62f20ec2011-08-15 17:40:28 -0700784
Wale Ogunwale60454db2015-01-23 16:05:07 -0800785 r.overrideConfig = overrideConfig;
Dianne Hackborn58f42a52011-10-10 13:46:34 -0700786 updatePendingConfiguration(curConfig);
787
Jeff Brown9ef09972013-10-15 20:49:59 -0700788 sendMessage(H.LAUNCH_ACTIVITY, r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800789 }
790
Wale Ogunwale60454db2015-01-23 16:05:07 -0800791 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800792 public final void scheduleRelaunchActivity(IBinder token,
Dianne Hackborn85d558c2014-11-04 10:31:54 -0800793 List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
Wale Ogunwale60454db2015-01-23 16:05:07 -0800794 int configChanges, boolean notResumed, Configuration config,
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -0700795 Configuration overrideConfig, boolean preserveWindow) {
Dianne Hackborn30c9bd82010-12-01 16:07:40 -0800796 requestRelaunchActivity(token, pendingResults, pendingNewIntents,
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -0700797 configChanges, notResumed, config, overrideConfig, true, preserveWindow);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800798 }
799
Wale Ogunwale826c7062016-09-13 08:25:54 -0700800 public final void scheduleNewIntent(
801 List<ReferrerIntent> intents, IBinder token, boolean andPause) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800802 NewIntentData data = new NewIntentData();
803 data.intents = intents;
804 data.token = token;
Wale Ogunwale826c7062016-09-13 08:25:54 -0700805 data.andPause = andPause;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800806
Jeff Brown9ef09972013-10-15 20:49:59 -0700807 sendMessage(H.NEW_INTENT, data);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800808 }
809
810 public final void scheduleDestroyActivity(IBinder token, boolean finishing,
811 int configChanges) {
Jeff Brown9ef09972013-10-15 20:49:59 -0700812 sendMessage(H.DESTROY_ACTIVITY, token, finishing ? 1 : 0,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800813 configChanges);
814 }
815
816 public final void scheduleReceiver(Intent intent, ActivityInfo info,
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400817 CompatibilityInfo compatInfo, int resultCode, String data, Bundle extras,
Dianne Hackborna413dc02013-07-12 12:02:55 -0700818 boolean sync, int sendingUser, int processState) {
819 updateProcessState(processState, false);
Dianne Hackborne829fef2010-10-26 17:44:01 -0700820 ReceiverData r = new ReceiverData(intent, resultCode, data, extras,
Dianne Hackborn20e80982012-08-31 19:00:44 -0700821 sync, false, mAppThread.asBinder(), sendingUser);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800822 r.info = info;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400823 r.compatInfo = compatInfo;
Jeff Brown9ef09972013-10-15 20:49:59 -0700824 sendMessage(H.RECEIVER, r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800825 }
826
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400827 public final void scheduleCreateBackupAgent(ApplicationInfo app,
828 CompatibilityInfo compatInfo, int backupMode) {
Christopher Tate181fafa2009-05-14 11:12:14 -0700829 CreateBackupAgentData d = new CreateBackupAgentData();
830 d.appInfo = app;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400831 d.compatInfo = compatInfo;
Christopher Tate181fafa2009-05-14 11:12:14 -0700832 d.backupMode = backupMode;
833
Jeff Brown9ef09972013-10-15 20:49:59 -0700834 sendMessage(H.CREATE_BACKUP_AGENT, d);
Christopher Tate181fafa2009-05-14 11:12:14 -0700835 }
836
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400837 public final void scheduleDestroyBackupAgent(ApplicationInfo app,
838 CompatibilityInfo compatInfo) {
Christopher Tate181fafa2009-05-14 11:12:14 -0700839 CreateBackupAgentData d = new CreateBackupAgentData();
840 d.appInfo = app;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400841 d.compatInfo = compatInfo;
Christopher Tate181fafa2009-05-14 11:12:14 -0700842
Jeff Brown9ef09972013-10-15 20:49:59 -0700843 sendMessage(H.DESTROY_BACKUP_AGENT, d);
Christopher Tate181fafa2009-05-14 11:12:14 -0700844 }
845
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800846 public final void scheduleCreateService(IBinder token,
Dianne Hackborna413dc02013-07-12 12:02:55 -0700847 ServiceInfo info, CompatibilityInfo compatInfo, int processState) {
848 updateProcessState(processState, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800849 CreateServiceData s = new CreateServiceData();
850 s.token = token;
851 s.info = info;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400852 s.compatInfo = compatInfo;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800853
Jeff Brown9ef09972013-10-15 20:49:59 -0700854 sendMessage(H.CREATE_SERVICE, s);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800855 }
856
857 public final void scheduleBindService(IBinder token, Intent intent,
Dianne Hackborna413dc02013-07-12 12:02:55 -0700858 boolean rebind, int processState) {
859 updateProcessState(processState, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800860 BindServiceData s = new BindServiceData();
861 s.token = token;
862 s.intent = intent;
863 s.rebind = rebind;
864
Amith Yamasani742a6712011-05-04 14:49:28 -0700865 if (DEBUG_SERVICE)
866 Slog.v(TAG, "scheduleBindService token=" + token + " intent=" + intent + " uid="
867 + Binder.getCallingUid() + " pid=" + Binder.getCallingPid());
Jeff Brown9ef09972013-10-15 20:49:59 -0700868 sendMessage(H.BIND_SERVICE, s);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800869 }
870
871 public final void scheduleUnbindService(IBinder token, Intent intent) {
872 BindServiceData s = new BindServiceData();
873 s.token = token;
874 s.intent = intent;
875
Jeff Brown9ef09972013-10-15 20:49:59 -0700876 sendMessage(H.UNBIND_SERVICE, s);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800877 }
878
Dianne Hackborn3f7c9f22017-04-04 15:36:33 -0700879 public final void scheduleServiceArgs(IBinder token, ParceledListSlice args) {
880 List<ServiceStartArgs> list = args.getList();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800881
Dianne Hackborn3f7c9f22017-04-04 15:36:33 -0700882 for (int i = 0; i < list.size(); i++) {
883 ServiceStartArgs ssa = list.get(i);
884 ServiceArgsData s = new ServiceArgsData();
885 s.token = token;
886 s.taskRemoved = ssa.taskRemoved;
887 s.startId = ssa.startId;
888 s.flags = ssa.flags;
889 s.args = ssa.args;
890
891 sendMessage(H.SERVICE_ARGS, s);
892 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800893 }
894
895 public final void scheduleStopService(IBinder token) {
Jeff Brown9ef09972013-10-15 20:49:59 -0700896 sendMessage(H.STOP_SERVICE, token);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800897 }
898
Jeff Hao1b012d32014-08-20 10:35:34 -0700899 public final void bindApplication(String processName, ApplicationInfo appInfo,
900 List<ProviderInfo> providers, ComponentName instrumentationName,
901 ProfilerInfo profilerInfo, Bundle instrumentationArgs,
902 IInstrumentationWatcher instrumentationWatcher,
Svetoslav Ganov80943d82013-01-02 10:25:37 -0800903 IUiAutomationConnection instrumentationUiConnection, int debugMode,
Pablo Ceballosa4d4e822015-10-05 10:27:52 -0700904 boolean enableBinderTracking, boolean trackAllocation,
905 boolean isRestrictedBackupMode, boolean persistent, Configuration config,
Sudheer Shankacc6418f2016-10-13 12:03:44 -0700906 CompatibilityInfo compatInfo, Map services, Bundle coreSettings,
Svet Ganov37e43272016-09-09 16:01:32 -0700907 String buildSerial) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800908
909 if (services != null) {
910 // Setup the service cache in the ServiceManager
911 ServiceManager.initServiceCache(services);
912 }
913
Svetoslav Ganov9aa597e2011-03-03 18:17:41 -0800914 setCoreSettings(coreSettings);
915
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800916 AppBindData data = new AppBindData();
917 data.processName = processName;
918 data.appInfo = appInfo;
919 data.providers = providers;
920 data.instrumentationName = instrumentationName;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800921 data.instrumentationArgs = instrumentationArgs;
922 data.instrumentationWatcher = instrumentationWatcher;
Svetoslav Ganov80943d82013-01-02 10:25:37 -0800923 data.instrumentationUiAutomationConnection = instrumentationUiConnection;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800924 data.debugMode = debugMode;
Rahul Chaturvedi52613f92015-06-17 23:54:08 -0400925 data.enableBinderTracking = enableBinderTracking;
Man Caocfa78b22015-06-11 20:14:34 -0700926 data.trackAllocation = trackAllocation;
Christopher Tate181fafa2009-05-14 11:12:14 -0700927 data.restrictedBackupMode = isRestrictedBackupMode;
Dianne Hackborn5d927c22011-09-02 12:22:18 -0700928 data.persistent = persistent;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800929 data.config = config;
Dianne Hackborne2515ee2011-04-27 18:52:56 -0400930 data.compatInfo = compatInfo;
Jeff Hao1b012d32014-08-20 10:35:34 -0700931 data.initProfilerInfo = profilerInfo;
Svet Ganov37e43272016-09-09 16:01:32 -0700932 data.buildSerial = buildSerial;
Jeff Brown9ef09972013-10-15 20:49:59 -0700933 sendMessage(H.BIND_APPLICATION, data);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800934 }
935
936 public final void scheduleExit() {
Jeff Brown9ef09972013-10-15 20:49:59 -0700937 sendMessage(H.EXIT_APPLICATION, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800938 }
939
Christopher Tate5e1ab332009-09-01 20:32:49 -0700940 public final void scheduleSuicide() {
Jeff Brown9ef09972013-10-15 20:49:59 -0700941 sendMessage(H.SUICIDE, null);
Christopher Tate5e1ab332009-09-01 20:32:49 -0700942 }
943
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800944 public void scheduleConfigurationChanged(Configuration config) {
Dianne Hackborn58f42a52011-10-10 13:46:34 -0700945 updatePendingConfiguration(config);
Jeff Brown9ef09972013-10-15 20:49:59 -0700946 sendMessage(H.CONFIGURATION_CHANGED, config);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800947 }
948
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +0100949 public void scheduleApplicationInfoChanged(ApplicationInfo ai) {
950 sendMessage(H.APPLICATION_INFO_CHANGED, ai);
951 }
952
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800953 public void updateTimeZone() {
954 TimeZone.setDefault(null);
955 }
956
Robert Greenwalt03595d02010-11-02 14:08:23 -0700957 public void clearDnsCache() {
958 // a non-standard API to get this to libcore
959 InetAddress.clearDnsCache();
Paul Jensene401d172014-09-12 10:47:39 -0400960 // Allow libcore to perform the necessary actions as it sees fit upon a network
961 // configuration change.
962 NetworkEventDispatcher.getInstance().onNetworkConfigurationChanged();
Robert Greenwalt03595d02010-11-02 14:08:23 -0700963 }
964
Jason Monk83520b92014-05-09 15:16:06 -0400965 public void setHttpProxy(String host, String port, String exclList, Uri pacFileUrl) {
Paul Jensen72db88e2015-03-10 10:54:12 -0400966 final ConnectivityManager cm = ConnectivityManager.from(getSystemContext());
967 final Network network = cm.getBoundNetworkForProcess();
Paul Jensene0bef712014-12-10 15:12:18 -0500968 if (network != null) {
Paul Jensen72db88e2015-03-10 10:54:12 -0400969 Proxy.setHttpProxySystemProperty(cm.getDefaultProxy());
Paul Jensene0bef712014-12-10 15:12:18 -0500970 } else {
971 Proxy.setHttpProxySystemProperty(host, port, exclList, pacFileUrl);
972 }
Robert Greenwalt434203a2010-10-11 16:00:27 -0700973 }
974
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800975 public void processInBackground() {
976 mH.removeMessages(H.GC_WHEN_IDLE);
977 mH.sendMessage(mH.obtainMessage(H.GC_WHEN_IDLE));
978 }
979
Sudheer Shankacc6418f2016-10-13 12:03:44 -0700980 public void dumpService(ParcelFileDescriptor pfd, IBinder servicetoken, String[] args) {
Dianne Hackborn625ac272010-09-17 18:29:22 -0700981 DumpComponentInfo data = new DumpComponentInfo();
Dianne Hackborne17aeb32011-04-07 15:11:57 -0700982 try {
Sudheer Shankacc6418f2016-10-13 12:03:44 -0700983 data.fd = pfd.dup();
Dianne Hackborne17aeb32011-04-07 15:11:57 -0700984 data.token = servicetoken;
985 data.args = args;
Jeff Brown9ef09972013-10-15 20:49:59 -0700986 sendMessage(H.DUMP_SERVICE, data, 0, 0, true /*async*/);
Dianne Hackborne17aeb32011-04-07 15:11:57 -0700987 } catch (IOException e) {
988 Slog.w(TAG, "dumpService failed", e);
Sudheer Shankacc6418f2016-10-13 12:03:44 -0700989 } finally {
990 IoUtils.closeQuietly(pfd);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -0800991 }
992 }
993
994 // This function exists to make sure all receiver dispatching is
995 // correctly ordered, since these are one-way calls and the binder driver
996 // applies transaction ordering per object for such calls.
997 public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent,
Dianne Hackborn68d881c2009-10-05 13:58:17 -0700998 int resultCode, String dataStr, Bundle extras, boolean ordered,
Dianne Hackborna413dc02013-07-12 12:02:55 -0700999 boolean sticky, int sendingUser, int processState) throws RemoteException {
1000 updateProcessState(processState, false);
Dianne Hackborn20e80982012-08-31 19:00:44 -07001001 receiver.performReceive(intent, resultCode, dataStr, extras, ordered,
1002 sticky, sendingUser);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001003 }
Bob Leee5408332009-09-04 18:31:17 -07001004
Wale Ogunwalec2607b42015-02-07 16:16:59 -08001005 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001006 public void scheduleLowMemory() {
Jeff Brown9ef09972013-10-15 20:49:59 -07001007 sendMessage(H.LOW_MEMORY, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001008 }
1009
Wale Ogunwale60454db2015-01-23 16:05:07 -08001010 @Override
Wale Ogunwalec2607b42015-02-07 16:16:59 -08001011 public void scheduleActivityConfigurationChanged(
Andrii Kulianb047b8b2017-02-08 18:38:26 -08001012 IBinder token, Configuration overrideConfig) {
Wale Ogunwalec2607b42015-02-07 16:16:59 -08001013 sendMessage(H.ACTIVITY_CONFIGURATION_CHANGED,
Andrii Kulianb047b8b2017-02-08 18:38:26 -08001014 new ActivityConfigChangeData(token, overrideConfig));
1015 }
1016
1017 @Override
1018 public void scheduleActivityMovedToDisplay(IBinder token, int displayId,
1019 Configuration overrideConfig) {
1020 sendMessage(H.ACTIVITY_MOVED_TO_DISPLAY,
1021 new ActivityConfigChangeData(token, overrideConfig), displayId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001022 }
1023
Wale Ogunwalec2607b42015-02-07 16:16:59 -08001024 @Override
Jeff Hao1b012d32014-08-20 10:35:34 -07001025 public void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType) {
1026 sendMessage(H.PROFILER_CONTROL, profilerInfo, start ? 1 : 0, profileType);
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08001027 }
1028
Makoto Onuki4556b7b2017-07-07 14:58:58 -07001029 @Override
Christopher Ferris8d652f82017-04-11 16:29:18 -07001030 public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String path,
1031 ParcelFileDescriptor fd) {
Andy McFadden824c5102010-07-09 16:26:57 -07001032 DumpHeapData dhd = new DumpHeapData();
Christopher Ferris8d652f82017-04-11 16:29:18 -07001033 dhd.managed = managed;
1034 dhd.mallocInfo = mallocInfo;
Makoto Onuki4556b7b2017-07-07 14:58:58 -07001035 dhd.runGc = runGc;
Andy McFadden824c5102010-07-09 16:26:57 -07001036 dhd.path = path;
1037 dhd.fd = fd;
Christopher Ferris8d652f82017-04-11 16:29:18 -07001038 sendMessage(H.DUMP_HEAP, dhd, 0, 0, true /*async*/);
Andy McFadden824c5102010-07-09 16:26:57 -07001039 }
1040
Leonard Mosescuf3409ce2016-10-06 17:32:05 -07001041 public void attachAgent(String agent) {
1042 sendMessage(H.ATTACH_AGENT, agent);
1043 }
1044
Dianne Hackborn06de2ea2009-05-21 12:56:43 -07001045 public void setSchedulingGroup(int group) {
1046 // Note: do this immediately, since going into the foreground
1047 // should happen regardless of what pending work we have to do
1048 // and the activity manager will wait for us to report back that
1049 // we are done before sending us to the background.
1050 try {
1051 Process.setProcessGroup(Process.myPid(), group);
1052 } catch (Exception e) {
Dianne Hackbornc9421ba2010-03-11 22:23:46 -08001053 Slog.w(TAG, "Failed setting process group to " + group, e);
Dianne Hackborn06de2ea2009-05-21 12:56:43 -07001054 }
1055 }
Bob Leee5408332009-09-04 18:31:17 -07001056
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07001057 public void dispatchPackageBroadcast(int cmd, String[] packages) {
Jeff Brown9ef09972013-10-15 20:49:59 -07001058 sendMessage(H.DISPATCH_PACKAGE_BROADCAST, packages, cmd);
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07001059 }
Dianne Hackborn9d39d0c2010-06-24 15:57:42 -07001060
1061 public void scheduleCrash(String msg) {
Jeff Brown9ef09972013-10-15 20:49:59 -07001062 sendMessage(H.SCHEDULE_CRASH, msg);
Dianne Hackborn9d39d0c2010-06-24 15:57:42 -07001063 }
Dianne Hackborn625ac272010-09-17 18:29:22 -07001064
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001065 public void dumpActivity(ParcelFileDescriptor pfd, IBinder activitytoken,
Dianne Hackborn30d71892010-12-11 10:37:55 -08001066 String prefix, String[] args) {
Dianne Hackborn625ac272010-09-17 18:29:22 -07001067 DumpComponentInfo data = new DumpComponentInfo();
Dianne Hackborne17aeb32011-04-07 15:11:57 -07001068 try {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001069 data.fd = pfd.dup();
Dianne Hackborne17aeb32011-04-07 15:11:57 -07001070 data.token = activitytoken;
1071 data.prefix = prefix;
1072 data.args = args;
Jeff Brown9ef09972013-10-15 20:49:59 -07001073 sendMessage(H.DUMP_ACTIVITY, data, 0, 0, true /*async*/);
Dianne Hackborne17aeb32011-04-07 15:11:57 -07001074 } catch (IOException e) {
1075 Slog.w(TAG, "dumpActivity failed", e);
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001076 } finally {
1077 IoUtils.closeQuietly(pfd);
Dianne Hackborn625ac272010-09-17 18:29:22 -07001078 }
1079 }
Chet Haase9c1e23b2011-03-24 10:51:31 -07001080
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001081 public void dumpProvider(ParcelFileDescriptor pfd, IBinder providertoken,
Marco Nelissen18cb2872011-11-15 11:19:53 -08001082 String[] args) {
1083 DumpComponentInfo data = new DumpComponentInfo();
1084 try {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001085 data.fd = pfd.dup();
Marco Nelissen18cb2872011-11-15 11:19:53 -08001086 data.token = providertoken;
1087 data.args = args;
Jeff Brown9ef09972013-10-15 20:49:59 -07001088 sendMessage(H.DUMP_PROVIDER, data, 0, 0, true /*async*/);
Marco Nelissen18cb2872011-11-15 11:19:53 -08001089 } catch (IOException e) {
1090 Slog.w(TAG, "dumpProvider failed", e);
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001091 } finally {
1092 IoUtils.closeQuietly(pfd);
Marco Nelissen18cb2872011-11-15 11:19:53 -08001093 }
1094 }
1095
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001096 @Override
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001097 public void dumpMemInfo(ParcelFileDescriptor pfd, Debug.MemoryInfo mem, boolean checkin,
Colin Crossc4fb5f92016-02-02 16:51:15 -08001098 boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly,
1099 boolean dumpUnreachable, String[] args) {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001100 FileOutputStream fout = new FileOutputStream(pfd.getFileDescriptor());
Dianne Hackborn8c841092013-06-24 13:46:13 -07001101 PrintWriter pw = new FastPrintWriter(fout);
Dianne Hackborn0e3328f2011-07-17 13:31:17 -07001102 try {
Colin Crossc4fb5f92016-02-02 16:51:15 -08001103 dumpMemInfo(pw, mem, checkin, dumpFullInfo, dumpDalvik, dumpSummaryOnly, dumpUnreachable);
Dianne Hackborn0e3328f2011-07-17 13:31:17 -07001104 } finally {
Chet Haase9c1e23b2011-03-24 10:51:31 -07001105 pw.flush();
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001106 IoUtils.closeQuietly(pfd);
Chet Haase9c1e23b2011-03-24 10:51:31 -07001107 }
Dianne Hackborn0e3328f2011-07-17 13:31:17 -07001108 }
1109
Dianne Hackborn3bc8f78d2013-09-19 13:34:35 -07001110 private void dumpMemInfo(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin,
Colin Crossc4fb5f92016-02-02 16:51:15 -08001111 boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, boolean dumpUnreachable) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001112 long nativeMax = Debug.getNativeHeapSize() / 1024;
1113 long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024;
1114 long nativeFree = Debug.getNativeHeapFreeSize() / 1024;
1115
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001116 Runtime runtime = Runtime.getRuntime();
Mathieu Chartierd288a262015-07-10 13:44:42 -07001117 runtime.gc(); // Do GC since countInstancesOfClass counts unreachable objects.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001118 long dalvikMax = runtime.totalMemory() / 1024;
1119 long dalvikFree = runtime.freeMemory() / 1024;
1120 long dalvikAllocated = dalvikMax - dalvikFree;
Richard Uhler2c036192016-09-14 09:48:31 +01001121
1122 Class[] classesToCount = new Class[] {
1123 ContextImpl.class,
1124 Activity.class,
1125 WebView.class,
1126 OpenSSLSocketImpl.class
1127 };
1128 long[] instanceCounts = VMDebug.countInstancesOfClasses(classesToCount, true);
1129 long appContextInstanceCount = instanceCounts[0];
1130 long activityInstanceCount = instanceCounts[1];
1131 long webviewInstanceCount = instanceCounts[2];
1132 long openSslSocketCount = instanceCounts[3];
1133
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001134 long viewInstanceCount = ViewDebug.getViewInstanceCount();
Romain Guy65b345f2011-07-27 18:51:50 -07001135 long viewRootInstanceCount = ViewDebug.getViewRootImplCount();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001136 int globalAssetCount = AssetManager.getGlobalAssetCount();
1137 int globalAssetManagerCount = AssetManager.getGlobalAssetManagerCount();
1138 int binderLocalObjectCount = Debug.getBinderLocalObjectCount();
1139 int binderProxyObjectCount = Debug.getBinderProxyObjectCount();
1140 int binderDeathObjectCount = Debug.getBinderDeathObjectCount();
Dianne Hackbornfabb70b2014-11-11 12:22:36 -08001141 long parcelSize = Parcel.getGlobalAllocSize();
1142 long parcelCount = Parcel.getGlobalAllocCount();
Vasu Noric3849202010-03-09 10:47:25 -08001143 SQLiteDebug.PagerStats stats = SQLiteDebug.getDatabaseInfo();
Bob Leee5408332009-09-04 18:31:17 -07001144
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07001145 dumpMemInfoTable(pw, memInfo, checkin, dumpFullInfo, dumpDalvik, dumpSummaryOnly,
1146 Process.myPid(),
Dianne Hackborne77187d2013-10-25 16:32:41 -07001147 (mBoundApplication != null) ? mBoundApplication.processName : "unknown",
1148 nativeMax, nativeAllocated, nativeFree,
1149 dalvikMax, dalvikAllocated, dalvikFree);
1150
Dianne Hackbornb437e092011-08-05 17:50:29 -07001151 if (checkin) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001152 // NOTE: if you change anything significant below, also consider changing
1153 // ACTIVITY_THREAD_CHECKIN_VERSION.
Anwar Ghuloum3c615062013-05-13 14:18:02 -07001154
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001155 // Object counts
1156 pw.print(viewInstanceCount); pw.print(',');
1157 pw.print(viewRootInstanceCount); pw.print(',');
1158 pw.print(appContextInstanceCount); pw.print(',');
1159 pw.print(activityInstanceCount); pw.print(',');
Bob Leee5408332009-09-04 18:31:17 -07001160
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001161 pw.print(globalAssetCount); pw.print(',');
1162 pw.print(globalAssetManagerCount); pw.print(',');
1163 pw.print(binderLocalObjectCount); pw.print(',');
1164 pw.print(binderProxyObjectCount); pw.print(',');
Bob Leee5408332009-09-04 18:31:17 -07001165
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001166 pw.print(binderDeathObjectCount); pw.print(',');
1167 pw.print(openSslSocketCount); pw.print(',');
Bob Leee5408332009-09-04 18:31:17 -07001168
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001169 // SQL
Vasu Noric3849202010-03-09 10:47:25 -08001170 pw.print(stats.memoryUsed / 1024); pw.print(',');
Jeff Brown2a293b62012-01-19 14:02:22 -08001171 pw.print(stats.memoryUsed / 1024); pw.print(',');
1172 pw.print(stats.pageCacheOverflow / 1024); pw.print(',');
Dianne Hackbornb437e092011-08-05 17:50:29 -07001173 pw.print(stats.largestMemAlloc / 1024);
Vasu Noric3849202010-03-09 10:47:25 -08001174 for (int i = 0; i < stats.dbStats.size(); i++) {
1175 DbStats dbStats = stats.dbStats.get(i);
Dianne Hackbornb437e092011-08-05 17:50:29 -07001176 pw.print(','); pw.print(dbStats.dbName);
1177 pw.print(','); pw.print(dbStats.pageSize);
1178 pw.print(','); pw.print(dbStats.dbSize);
1179 pw.print(','); pw.print(dbStats.lookaside);
1180 pw.print(','); pw.print(dbStats.cache);
1181 pw.print(','); pw.print(dbStats.cache);
Vasu Noric3849202010-03-09 10:47:25 -08001182 }
Dianne Hackbornb437e092011-08-05 17:50:29 -07001183 pw.println();
Bob Leee5408332009-09-04 18:31:17 -07001184
Dianne Hackborn3bc8f78d2013-09-19 13:34:35 -07001185 return;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001186 }
Bob Leee5408332009-09-04 18:31:17 -07001187
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001188 pw.println(" ");
1189 pw.println(" Objects");
Romain Guy65b345f2011-07-27 18:51:50 -07001190 printRow(pw, TWO_COUNT_COLUMNS, "Views:", viewInstanceCount, "ViewRootImpl:",
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001191 viewRootInstanceCount);
1192
1193 printRow(pw, TWO_COUNT_COLUMNS, "AppContexts:", appContextInstanceCount,
1194 "Activities:", activityInstanceCount);
1195
1196 printRow(pw, TWO_COUNT_COLUMNS, "Assets:", globalAssetCount,
1197 "AssetManagers:", globalAssetManagerCount);
1198
1199 printRow(pw, TWO_COUNT_COLUMNS, "Local Binders:", binderLocalObjectCount,
1200 "Proxy Binders:", binderProxyObjectCount);
Dianne Hackbornfabb70b2014-11-11 12:22:36 -08001201 printRow(pw, TWO_COUNT_COLUMNS, "Parcel memory:", parcelSize/1024,
1202 "Parcel count:", parcelCount);
1203 printRow(pw, TWO_COUNT_COLUMNS, "Death Recipients:", binderDeathObjectCount,
1204 "OpenSSL Sockets:", openSslSocketCount);
Richard Uhler2c036192016-09-14 09:48:31 +01001205 printRow(pw, ONE_COUNT_COLUMN, "WebViews:", webviewInstanceCount);
Bob Leee5408332009-09-04 18:31:17 -07001206
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001207 // SQLite mem info
1208 pw.println(" ");
1209 pw.println(" SQL");
Jeff Brown2a293b62012-01-19 14:02:22 -08001210 printRow(pw, ONE_COUNT_COLUMN, "MEMORY_USED:", stats.memoryUsed / 1024);
1211 printRow(pw, TWO_COUNT_COLUMNS, "PAGECACHE_OVERFLOW:",
1212 stats.pageCacheOverflow / 1024, "MALLOC_SIZE:", stats.largestMemAlloc / 1024);
Vasu Noric3849202010-03-09 10:47:25 -08001213 pw.println(" ");
1214 int N = stats.dbStats.size();
1215 if (N > 0) {
1216 pw.println(" DATABASES");
Vasu Nori3c7131f2010-09-21 14:36:57 -07001217 printRow(pw, " %8s %8s %14s %14s %s", "pgsz", "dbsz", "Lookaside(b)", "cache",
1218 "Dbname");
Vasu Noric3849202010-03-09 10:47:25 -08001219 for (int i = 0; i < N; i++) {
1220 DbStats dbStats = stats.dbStats.get(i);
Vasu Nori3c7131f2010-09-21 14:36:57 -07001221 printRow(pw, DB_INFO_FORMAT,
1222 (dbStats.pageSize > 0) ? String.valueOf(dbStats.pageSize) : " ",
1223 (dbStats.dbSize > 0) ? String.valueOf(dbStats.dbSize) : " ",
1224 (dbStats.lookaside > 0) ? String.valueOf(dbStats.lookaside) : " ",
1225 dbStats.cache, dbStats.dbName);
Vasu Noric3849202010-03-09 10:47:25 -08001226 }
1227 }
Bob Leee5408332009-09-04 18:31:17 -07001228
Dianne Hackborn82e1ee92009-08-11 18:56:41 -07001229 // Asset details.
1230 String assetAlloc = AssetManager.getAssetAllocations();
1231 if (assetAlloc != null) {
1232 pw.println(" ");
1233 pw.println(" Asset Allocations");
1234 pw.print(assetAlloc);
1235 }
Colin Crossc4fb5f92016-02-02 16:51:15 -08001236
1237 // Unreachable native memory
1238 if (dumpUnreachable) {
1239 boolean showContents = ((mBoundApplication != null)
1240 && ((mBoundApplication.appInfo.flags&ApplicationInfo.FLAG_DEBUGGABLE) != 0))
1241 || android.os.Build.IS_DEBUGGABLE;
1242 pw.println(" ");
1243 pw.println(" Unreachable memory");
1244 pw.print(Debug.getUnreachableMemory(100, showContents));
1245 }
Dianne Hackborn0e3328f2011-07-17 13:31:17 -07001246 }
1247
1248 @Override
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001249 public void dumpGfxInfo(ParcelFileDescriptor pfd, String[] args) {
Chris Craikfc294242016-12-13 18:10:46 -08001250 nDumpGraphicsInfo(pfd.getFileDescriptor());
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001251 WindowManagerGlobal.getInstance().dumpGfxInfo(pfd.getFileDescriptor(), args);
1252 IoUtils.closeQuietly(pfd);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001253 }
1254
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001255 private void dumpDatabaseInfo(ParcelFileDescriptor pfd, String[] args) {
1256 PrintWriter pw = new FastPrintWriter(
1257 new FileOutputStream(pfd.getFileDescriptor()));
Jeff Brown6754ba22011-12-14 20:20:01 -08001258 PrintWriterPrinter printer = new PrintWriterPrinter(pw);
1259 SQLiteDebug.dump(printer, args);
1260 pw.flush();
1261 }
1262
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07001263 @Override
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001264 public void dumpDbInfo(final ParcelFileDescriptor pfd, final String[] args) {
riddle_hsu1d6c40a2014-07-31 00:18:00 +08001265 if (mSystemThread) {
Felipe Leme29de4922016-06-07 16:14:07 -07001266 // Ensure this invocation is asynchronous to prevent writer waiting if buffer cannot
1267 // be consumed. But it must duplicate the file descriptor first, since caller might
1268 // be closing it.
1269 final ParcelFileDescriptor dup;
1270 try {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001271 dup = pfd.dup();
Felipe Leme29de4922016-06-07 16:14:07 -07001272 } catch (IOException e) {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001273 Log.w(TAG, "Could not dup FD " + pfd.getFileDescriptor().getInt$());
Felipe Leme29de4922016-06-07 16:14:07 -07001274 return;
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001275 } finally {
1276 IoUtils.closeQuietly(pfd);
Felipe Leme29de4922016-06-07 16:14:07 -07001277 }
1278
riddle_hsu1d6c40a2014-07-31 00:18:00 +08001279 AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
1280 @Override
1281 public void run() {
Felipe Lemec74972f2016-06-08 09:12:37 -07001282 try {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001283 dumpDatabaseInfo(dup, args);
Felipe Lemec74972f2016-06-08 09:12:37 -07001284 } finally {
1285 IoUtils.closeQuietly(dup);
1286 }
riddle_hsu1d6c40a2014-07-31 00:18:00 +08001287 }
1288 });
1289 } else {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001290 dumpDatabaseInfo(pfd, args);
1291 IoUtils.closeQuietly(pfd);
riddle_hsu1d6c40a2014-07-31 00:18:00 +08001292 }
1293 }
1294
1295 @Override
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07001296 public void unstableProviderDied(IBinder provider) {
Jeff Brown9ef09972013-10-15 20:49:59 -07001297 sendMessage(H.UNSTABLE_PROVIDER_DIED, provider);
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07001298 }
1299
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08001300 @Override
Adam Skorydfc7fd72013-08-05 19:23:41 -07001301 public void requestAssistContextExtras(IBinder activityToken, IBinder requestToken,
Svet Ganovfd31f852017-04-26 15:54:27 -07001302 int requestType, int sessionId, int flags) {
Adam Skorydfc7fd72013-08-05 19:23:41 -07001303 RequestAssistContextExtras cmd = new RequestAssistContextExtras();
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08001304 cmd.activityToken = activityToken;
1305 cmd.requestToken = requestToken;
1306 cmd.requestType = requestType;
Amith Yamasani4f128e42016-05-10 11:44:12 -07001307 cmd.sessionId = sessionId;
Svet Ganovfd31f852017-04-26 15:54:27 -07001308 cmd.flags = flags;
Jeff Brown9ef09972013-10-15 20:49:59 -07001309 sendMessage(H.REQUEST_ASSIST_CONTEXT_EXTRAS, cmd);
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08001310 }
1311
Svetoslav Ganov9aa597e2011-03-03 18:17:41 -08001312 public void setCoreSettings(Bundle coreSettings) {
Jeff Brown9ef09972013-10-15 20:49:59 -07001313 sendMessage(H.SET_CORE_SETTINGS, coreSettings);
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08001314 }
Dianne Hackborne2515ee2011-04-27 18:52:56 -04001315
1316 public void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) {
1317 UpdateCompatibilityData ucd = new UpdateCompatibilityData();
1318 ucd.pkg = pkg;
1319 ucd.info = info;
Jeff Brown9ef09972013-10-15 20:49:59 -07001320 sendMessage(H.UPDATE_PACKAGE_COMPATIBILITY_INFO, ucd);
Dianne Hackborne2515ee2011-04-27 18:52:56 -04001321 }
Dianne Hackbornce86ba82011-07-13 19:33:41 -07001322
1323 public void scheduleTrimMemory(int level) {
Jeff Brown9ef09972013-10-15 20:49:59 -07001324 sendMessage(H.TRIM_MEMORY, null, level);
Dianne Hackbornce86ba82011-07-13 19:33:41 -07001325 }
Marco Nelissen18cb2872011-11-15 11:19:53 -08001326
Craig Mautner5eda9b32013-07-02 11:58:16 -07001327 public void scheduleTranslucentConversionComplete(IBinder token, boolean drawComplete) {
Jeff Brown9ef09972013-10-15 20:49:59 -07001328 sendMessage(H.TRANSLUCENT_CONVERSION_COMPLETE, token, drawComplete ? 1 : 0);
Craig Mautner5eda9b32013-07-02 11:58:16 -07001329 }
Dianne Hackborna413dc02013-07-12 12:02:55 -07001330
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001331 public void scheduleOnNewActivityOptions(IBinder token, Bundle options) {
Craig Mautnereb8abf72014-07-02 15:04:09 -07001332 sendMessage(H.ON_NEW_ACTIVITY_OPTIONS,
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001333 new Pair<IBinder, ActivityOptions>(token, ActivityOptions.fromBundle(options)));
Craig Mautnereb8abf72014-07-02 15:04:09 -07001334 }
1335
Dianne Hackborna413dc02013-07-12 12:02:55 -07001336 public void setProcessState(int state) {
1337 updateProcessState(state, true);
1338 }
1339
1340 public void updateProcessState(int processState, boolean fromIpc) {
1341 synchronized (this) {
1342 if (mLastProcessState != processState) {
1343 mLastProcessState = processState;
Mathieu Chartier1e370902013-07-18 10:58:01 -07001344 // Update Dalvik state based on ActivityManager.PROCESS_STATE_* constants.
1345 final int DALVIK_PROCESS_STATE_JANK_PERCEPTIBLE = 0;
1346 final int DALVIK_PROCESS_STATE_JANK_IMPERCEPTIBLE = 1;
1347 int dalvikProcessState = DALVIK_PROCESS_STATE_JANK_IMPERCEPTIBLE;
1348 // TODO: Tune this since things like gmail sync are important background but not jank perceptible.
1349 if (processState <= ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
1350 dalvikProcessState = DALVIK_PROCESS_STATE_JANK_PERCEPTIBLE;
1351 }
1352 VMRuntime.getRuntime().updateProcessState(dalvikProcessState);
Dianne Hackborna413dc02013-07-12 12:02:55 -07001353 if (false) {
1354 Slog.i(TAG, "******************* PROCESS STATE CHANGED TO: " + processState
1355 + (fromIpc ? " (from ipc": ""));
1356 }
1357 }
1358 }
1359 }
Jeff Sharkeydd97f422013-10-08 17:01:30 -07001360
Sudheer Shanka84a48952017-03-08 18:19:01 -08001361 /**
1362 * Updates {@link #mNetworkBlockSeq}. This is used by ActivityManagerService to inform
1363 * the main thread that it needs to wait for the network rules to get updated before
1364 * launching an activity.
1365 */
1366 @Override
1367 public void setNetworkBlockSeq(long procStateSeq) {
1368 synchronized (mNetworkPolicyLock) {
1369 mNetworkBlockSeq = procStateSeq;
1370 }
1371 }
1372
Jeff Sharkeydd97f422013-10-08 17:01:30 -07001373 @Override
1374 public void scheduleInstallProvider(ProviderInfo provider) {
Jeff Brown9ef09972013-10-15 20:49:59 -07001375 sendMessage(H.INSTALL_PROVIDER, provider);
Jeff Sharkeydd97f422013-10-08 17:01:30 -07001376 }
Narayan Kamathccb2a0862013-12-19 14:49:36 +00001377
1378 @Override
Neil Fullerb7146fe2016-11-15 16:52:15 +00001379 public final void updateTimePrefs(int timeFormatPreference) {
1380 final Boolean timeFormatPreferenceBool;
1381 // For convenience we are using the Intent extra values.
1382 if (timeFormatPreference == Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR) {
1383 timeFormatPreferenceBool = Boolean.FALSE;
1384 } else if (timeFormatPreference == Intent.EXTRA_TIME_PREF_VALUE_USE_24_HOUR) {
1385 timeFormatPreferenceBool = Boolean.TRUE;
1386 } else {
1387 // timeFormatPreference == Intent.EXTRA_TIME_PREF_VALUE_USE_LOCALE_DEFAULT
1388 // (or unknown).
1389 timeFormatPreferenceBool = null;
1390 }
1391 DateFormat.set24HourTimePref(timeFormatPreferenceBool);
Narayan Kamathccb2a0862013-12-19 14:49:36 +00001392 }
Craig Mautneree2e45a2014-06-27 12:10:03 -07001393
1394 @Override
Craig Mautner8746a472014-07-24 15:12:54 -07001395 public void scheduleEnterAnimationComplete(IBinder token) {
1396 sendMessage(H.ENTER_ANIMATION_COMPLETE, token);
1397 }
Jeff Sharkey605eb792014-11-04 13:34:06 -08001398
1399 @Override
1400 public void notifyCleartextNetwork(byte[] firstPacket) {
1401 if (StrictMode.vmCleartextNetworkEnabled()) {
1402 StrictMode.onCleartextNetworkDetected(firstPacket);
1403 }
1404 }
Rahul Chaturvedi52613f92015-06-17 23:54:08 -04001405
1406 @Override
1407 public void startBinderTracking() {
1408 sendMessage(H.START_BINDER_TRACKING, null);
1409 }
1410
1411 @Override
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001412 public void stopBinderTrackingAndDump(ParcelFileDescriptor pfd) {
Rahul Chaturvedi52613f92015-06-17 23:54:08 -04001413 try {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001414 sendMessage(H.STOP_BINDER_TRACKING_AND_DUMP, pfd.dup());
Rahul Chaturvedi52613f92015-06-17 23:54:08 -04001415 } catch (IOException e) {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07001416 } finally {
1417 IoUtils.closeQuietly(pfd);
Rahul Chaturvedi52613f92015-06-17 23:54:08 -04001418 }
1419 }
Wale Ogunwale5f986092015-12-04 15:35:38 -08001420
1421 @Override
Winson Chung5af42fc2017-03-24 17:11:33 -07001422 public void scheduleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode,
1423 Configuration overrideConfig) throws RemoteException {
1424 SomeArgs args = SomeArgs.obtain();
1425 args.arg1 = token;
1426 args.arg2 = overrideConfig;
1427 args.argi1 = isInMultiWindowMode ? 1 : 0;
1428 sendMessage(H.MULTI_WINDOW_MODE_CHANGED, args);
Wale Ogunwale5f986092015-12-04 15:35:38 -08001429 }
1430
1431 @Override
Winson Chung5af42fc2017-03-24 17:11:33 -07001432 public void schedulePictureInPictureModeChanged(IBinder token, boolean isInPipMode,
1433 Configuration overrideConfig) throws RemoteException {
1434 SomeArgs args = SomeArgs.obtain();
1435 args.arg1 = token;
1436 args.arg2 = overrideConfig;
1437 args.argi1 = isInPipMode ? 1 : 0;
1438 sendMessage(H.PICTURE_IN_PICTURE_MODE_CHANGED, args);
Wale Ogunwale5f986092015-12-04 15:35:38 -08001439 }
Amith Yamasani0af6fa72016-01-17 15:36:19 -08001440
1441 @Override
1442 public void scheduleLocalVoiceInteractionStarted(IBinder token,
1443 IVoiceInteractor voiceInteractor) throws RemoteException {
1444 SomeArgs args = SomeArgs.obtain();
1445 args.arg1 = token;
1446 args.arg2 = voiceInteractor;
1447 sendMessage(H.LOCAL_VOICE_INTERACTION_STARTED, args);
1448 }
Chad Brubakerc72875b2016-04-27 16:35:11 -07001449
1450 @Override
1451 public void handleTrustStorageUpdate() {
1452 NetworkSecurityPolicy.getInstance().handleTrustStorageUpdate();
1453 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001454 }
1455
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001456 private int getLifecycleSeq() {
1457 synchronized (mResourcesManager) {
1458 return mLifecycleSeq++;
1459 }
1460 }
1461
Romain Guy65b345f2011-07-27 18:51:50 -07001462 private class H extends Handler {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001463 public static final int LAUNCH_ACTIVITY = 100;
1464 public static final int PAUSE_ACTIVITY = 101;
1465 public static final int PAUSE_ACTIVITY_FINISHING= 102;
1466 public static final int STOP_ACTIVITY_SHOW = 103;
1467 public static final int STOP_ACTIVITY_HIDE = 104;
1468 public static final int SHOW_WINDOW = 105;
1469 public static final int HIDE_WINDOW = 106;
1470 public static final int RESUME_ACTIVITY = 107;
1471 public static final int SEND_RESULT = 108;
Brian Carlstromed7e0072011-03-24 13:27:57 -07001472 public static final int DESTROY_ACTIVITY = 109;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001473 public static final int BIND_APPLICATION = 110;
1474 public static final int EXIT_APPLICATION = 111;
1475 public static final int NEW_INTENT = 112;
1476 public static final int RECEIVER = 113;
1477 public static final int CREATE_SERVICE = 114;
1478 public static final int SERVICE_ARGS = 115;
1479 public static final int STOP_SERVICE = 116;
Dianne Hackborn09233282014-04-30 11:33:59 -07001480
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001481 public static final int CONFIGURATION_CHANGED = 118;
1482 public static final int CLEAN_UP_CONTEXT = 119;
1483 public static final int GC_WHEN_IDLE = 120;
1484 public static final int BIND_SERVICE = 121;
1485 public static final int UNBIND_SERVICE = 122;
1486 public static final int DUMP_SERVICE = 123;
1487 public static final int LOW_MEMORY = 124;
1488 public static final int ACTIVITY_CONFIGURATION_CHANGED = 125;
1489 public static final int RELAUNCH_ACTIVITY = 126;
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08001490 public static final int PROFILER_CONTROL = 127;
Christopher Tate181fafa2009-05-14 11:12:14 -07001491 public static final int CREATE_BACKUP_AGENT = 128;
Christopher Tate5e1ab332009-09-01 20:32:49 -07001492 public static final int DESTROY_BACKUP_AGENT = 129;
1493 public static final int SUICIDE = 130;
Dianne Hackborn9bfb7072009-09-22 11:37:40 -07001494 public static final int REMOVE_PROVIDER = 131;
Dianne Hackborn2a9094d2010-02-03 19:20:09 -08001495 public static final int ENABLE_JIT = 132;
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07001496 public static final int DISPATCH_PACKAGE_BROADCAST = 133;
Dianne Hackborn9d39d0c2010-06-24 15:57:42 -07001497 public static final int SCHEDULE_CRASH = 134;
Andy McFadden824c5102010-07-09 16:26:57 -07001498 public static final int DUMP_HEAP = 135;
Dianne Hackborn625ac272010-09-17 18:29:22 -07001499 public static final int DUMP_ACTIVITY = 136;
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08001500 public static final int SLEEPING = 137;
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08001501 public static final int SET_CORE_SETTINGS = 138;
Dianne Hackborne2515ee2011-04-27 18:52:56 -04001502 public static final int UPDATE_PACKAGE_COMPATIBILITY_INFO = 139;
Dianne Hackbornce86ba82011-07-13 19:33:41 -07001503 public static final int TRIM_MEMORY = 140;
Marco Nelissen18cb2872011-11-15 11:19:53 -08001504 public static final int DUMP_PROVIDER = 141;
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07001505 public static final int UNSTABLE_PROVIDER_DIED = 142;
Adam Skorydfc7fd72013-08-05 19:23:41 -07001506 public static final int REQUEST_ASSIST_CONTEXT_EXTRAS = 143;
Craig Mautner5eda9b32013-07-02 11:58:16 -07001507 public static final int TRANSLUCENT_CONVERSION_COMPLETE = 144;
Jeff Sharkeydd97f422013-10-08 17:01:30 -07001508 public static final int INSTALL_PROVIDER = 145;
Craig Mautnereb8abf72014-07-02 15:04:09 -07001509 public static final int ON_NEW_ACTIVITY_OPTIONS = 146;
Craig Mautner8746a472014-07-24 15:12:54 -07001510 public static final int ENTER_ANIMATION_COMPLETE = 149;
Rahul Chaturvedi52613f92015-06-17 23:54:08 -04001511 public static final int START_BINDER_TRACKING = 150;
1512 public static final int STOP_BINDER_TRACKING_AND_DUMP = 151;
Andrii Kulian933076d2016-03-29 17:04:42 -07001513 public static final int MULTI_WINDOW_MODE_CHANGED = 152;
1514 public static final int PICTURE_IN_PICTURE_MODE_CHANGED = 153;
Amith Yamasani0af6fa72016-01-17 15:36:19 -08001515 public static final int LOCAL_VOICE_INTERACTION_STARTED = 154;
Leonard Mosescuf3409ce2016-10-06 17:32:05 -07001516 public static final int ATTACH_AGENT = 155;
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01001517 public static final int APPLICATION_INFO_CHANGED = 156;
Andrii Kulianb047b8b2017-02-08 18:38:26 -08001518 public static final int ACTIVITY_MOVED_TO_DISPLAY = 157;
Narayan Kamathccb2a0862013-12-19 14:49:36 +00001519
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001520 String codeToString(int code) {
Dianne Hackborn287952c2010-09-22 22:34:31 -07001521 if (DEBUG_MESSAGES) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001522 switch (code) {
1523 case LAUNCH_ACTIVITY: return "LAUNCH_ACTIVITY";
1524 case PAUSE_ACTIVITY: return "PAUSE_ACTIVITY";
1525 case PAUSE_ACTIVITY_FINISHING: return "PAUSE_ACTIVITY_FINISHING";
1526 case STOP_ACTIVITY_SHOW: return "STOP_ACTIVITY_SHOW";
1527 case STOP_ACTIVITY_HIDE: return "STOP_ACTIVITY_HIDE";
1528 case SHOW_WINDOW: return "SHOW_WINDOW";
1529 case HIDE_WINDOW: return "HIDE_WINDOW";
1530 case RESUME_ACTIVITY: return "RESUME_ACTIVITY";
1531 case SEND_RESULT: return "SEND_RESULT";
1532 case DESTROY_ACTIVITY: return "DESTROY_ACTIVITY";
1533 case BIND_APPLICATION: return "BIND_APPLICATION";
1534 case EXIT_APPLICATION: return "EXIT_APPLICATION";
1535 case NEW_INTENT: return "NEW_INTENT";
1536 case RECEIVER: return "RECEIVER";
1537 case CREATE_SERVICE: return "CREATE_SERVICE";
1538 case SERVICE_ARGS: return "SERVICE_ARGS";
1539 case STOP_SERVICE: return "STOP_SERVICE";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001540 case CONFIGURATION_CHANGED: return "CONFIGURATION_CHANGED";
1541 case CLEAN_UP_CONTEXT: return "CLEAN_UP_CONTEXT";
1542 case GC_WHEN_IDLE: return "GC_WHEN_IDLE";
1543 case BIND_SERVICE: return "BIND_SERVICE";
1544 case UNBIND_SERVICE: return "UNBIND_SERVICE";
1545 case DUMP_SERVICE: return "DUMP_SERVICE";
1546 case LOW_MEMORY: return "LOW_MEMORY";
1547 case ACTIVITY_CONFIGURATION_CHANGED: return "ACTIVITY_CONFIGURATION_CHANGED";
Andrii Kulianb047b8b2017-02-08 18:38:26 -08001548 case ACTIVITY_MOVED_TO_DISPLAY: return "ACTIVITY_MOVED_TO_DISPLAY";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001549 case RELAUNCH_ACTIVITY: return "RELAUNCH_ACTIVITY";
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08001550 case PROFILER_CONTROL: return "PROFILER_CONTROL";
Christopher Tate181fafa2009-05-14 11:12:14 -07001551 case CREATE_BACKUP_AGENT: return "CREATE_BACKUP_AGENT";
1552 case DESTROY_BACKUP_AGENT: return "DESTROY_BACKUP_AGENT";
Christopher Tate5e1ab332009-09-01 20:32:49 -07001553 case SUICIDE: return "SUICIDE";
Dianne Hackborn9bfb7072009-09-22 11:37:40 -07001554 case REMOVE_PROVIDER: return "REMOVE_PROVIDER";
Dianne Hackborn2a9094d2010-02-03 19:20:09 -08001555 case ENABLE_JIT: return "ENABLE_JIT";
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07001556 case DISPATCH_PACKAGE_BROADCAST: return "DISPATCH_PACKAGE_BROADCAST";
Dianne Hackborn9d39d0c2010-06-24 15:57:42 -07001557 case SCHEDULE_CRASH: return "SCHEDULE_CRASH";
Andy McFadden824c5102010-07-09 16:26:57 -07001558 case DUMP_HEAP: return "DUMP_HEAP";
Dianne Hackborn625ac272010-09-17 18:29:22 -07001559 case DUMP_ACTIVITY: return "DUMP_ACTIVITY";
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08001560 case SLEEPING: return "SLEEPING";
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08001561 case SET_CORE_SETTINGS: return "SET_CORE_SETTINGS";
Dianne Hackborne2515ee2011-04-27 18:52:56 -04001562 case UPDATE_PACKAGE_COMPATIBILITY_INFO: return "UPDATE_PACKAGE_COMPATIBILITY_INFO";
Dianne Hackbornce86ba82011-07-13 19:33:41 -07001563 case TRIM_MEMORY: return "TRIM_MEMORY";
Marco Nelissen18cb2872011-11-15 11:19:53 -08001564 case DUMP_PROVIDER: return "DUMP_PROVIDER";
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07001565 case UNSTABLE_PROVIDER_DIED: return "UNSTABLE_PROVIDER_DIED";
Adam Skorydfc7fd72013-08-05 19:23:41 -07001566 case REQUEST_ASSIST_CONTEXT_EXTRAS: return "REQUEST_ASSIST_CONTEXT_EXTRAS";
Craig Mautner5eda9b32013-07-02 11:58:16 -07001567 case TRANSLUCENT_CONVERSION_COMPLETE: return "TRANSLUCENT_CONVERSION_COMPLETE";
Jeff Sharkeydd97f422013-10-08 17:01:30 -07001568 case INSTALL_PROVIDER: return "INSTALL_PROVIDER";
Craig Mautnereb8abf72014-07-02 15:04:09 -07001569 case ON_NEW_ACTIVITY_OPTIONS: return "ON_NEW_ACTIVITY_OPTIONS";
Craig Mautner8746a472014-07-24 15:12:54 -07001570 case ENTER_ANIMATION_COMPLETE: return "ENTER_ANIMATION_COMPLETE";
Andrii Kulian933076d2016-03-29 17:04:42 -07001571 case MULTI_WINDOW_MODE_CHANGED: return "MULTI_WINDOW_MODE_CHANGED";
1572 case PICTURE_IN_PICTURE_MODE_CHANGED: return "PICTURE_IN_PICTURE_MODE_CHANGED";
Amith Yamasani0af6fa72016-01-17 15:36:19 -08001573 case LOCAL_VOICE_INTERACTION_STARTED: return "LOCAL_VOICE_INTERACTION_STARTED";
Leonard Mosescuf3409ce2016-10-06 17:32:05 -07001574 case ATTACH_AGENT: return "ATTACH_AGENT";
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01001575 case APPLICATION_INFO_CHANGED: return "APPLICATION_INFO_CHANGED";
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001576 }
1577 }
Dianne Hackborn755c8bf2012-05-07 15:06:09 -07001578 return Integer.toString(code);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001579 }
1580 public void handleMessage(Message msg) {
Dianne Hackborn755c8bf2012-05-07 15:06:09 -07001581 if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001582 switch (msg.what) {
1583 case LAUNCH_ACTIVITY: {
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001584 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");
Adam Powellcfbe9be2013-11-06 14:58:58 -08001585 final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001586
1587 r.packageInfo = getPackageInfoNoCheck(
Dianne Hackborne2515ee2011-04-27 18:52:56 -04001588 r.activityInfo.applicationInfo, r.compatInfo);
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08001589 handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001590 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001591 } break;
1592 case RELAUNCH_ACTIVITY: {
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001593 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001594 ActivityClientRecord r = (ActivityClientRecord)msg.obj;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08001595 handleRelaunchActivity(r);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001596 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001597 } break;
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001598 case PAUSE_ACTIVITY: {
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001599 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001600 SomeArgs args = (SomeArgs) msg.obj;
1601 handlePauseActivity((IBinder) args.arg1, false,
1602 (args.argi1 & USER_LEAVING) != 0, args.argi2,
1603 (args.argi1 & DONT_REPORT) != 0, args.argi3);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001604 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001605 } break;
1606 case PAUSE_ACTIVITY_FINISHING: {
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001607 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001608 SomeArgs args = (SomeArgs) msg.obj;
1609 handlePauseActivity((IBinder) args.arg1, true, (args.argi1 & USER_LEAVING) != 0,
1610 args.argi2, (args.argi1 & DONT_REPORT) != 0, args.argi3);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001611 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001612 } break;
1613 case STOP_ACTIVITY_SHOW: {
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001614 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001615 SomeArgs args = (SomeArgs) msg.obj;
1616 handleStopActivity((IBinder) args.arg1, true, args.argi2, args.argi3);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001617 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001618 } break;
1619 case STOP_ACTIVITY_HIDE: {
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001620 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001621 SomeArgs args = (SomeArgs) msg.obj;
1622 handleStopActivity((IBinder) args.arg1, false, args.argi2, args.argi3);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001623 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001624 } break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001625 case SHOW_WINDOW:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001626 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityShowWindow");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001627 handleWindowVisibility((IBinder)msg.obj, true);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001628 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001629 break;
1630 case HIDE_WINDOW:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001631 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityHideWindow");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001632 handleWindowVisibility((IBinder)msg.obj, false);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001633 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001634 break;
1635 case RESUME_ACTIVITY:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001636 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityResume");
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001637 SomeArgs args = (SomeArgs) msg.obj;
1638 handleResumeActivity((IBinder) args.arg1, true, args.argi1 != 0, true,
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08001639 args.argi3, "RESUME_ACTIVITY");
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001640 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001641 break;
1642 case SEND_RESULT:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001643 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDeliverResult");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001644 handleSendResult((ResultData)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001645 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001646 break;
1647 case DESTROY_ACTIVITY:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001648 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001649 handleDestroyActivity((IBinder)msg.obj, msg.arg1 != 0,
1650 msg.arg2, false);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001651 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001652 break;
1653 case BIND_APPLICATION:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001654 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001655 AppBindData data = (AppBindData)msg.obj;
1656 handleBindApplication(data);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001657 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001658 break;
1659 case EXIT_APPLICATION:
1660 if (mInitialApplication != null) {
1661 mInitialApplication.onTerminate();
1662 }
1663 Looper.myLooper().quit();
1664 break;
1665 case NEW_INTENT:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001666 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityNewIntent");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001667 handleNewIntent((NewIntentData)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001668 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001669 break;
1670 case RECEIVER:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001671 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveComp");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001672 handleReceiver((ReceiverData)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001673 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001674 break;
1675 case CREATE_SERVICE:
Tim Murrayb6f5a422016-04-07 15:25:22 -07001676 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ("serviceCreate: " + String.valueOf(msg.obj)));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001677 handleCreateService((CreateServiceData)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001678 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001679 break;
1680 case BIND_SERVICE:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001681 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceBind");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001682 handleBindService((BindServiceData)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001683 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001684 break;
1685 case UNBIND_SERVICE:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001686 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceUnbind");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001687 handleUnbindService((BindServiceData)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001688 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001689 break;
1690 case SERVICE_ARGS:
Tim Murrayb6f5a422016-04-07 15:25:22 -07001691 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, ("serviceStart: " + String.valueOf(msg.obj)));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001692 handleServiceArgs((ServiceArgsData)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001693 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001694 break;
1695 case STOP_SERVICE:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001696 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStop");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001697 handleStopService((IBinder)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001698 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001699 break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001700 case CONFIGURATION_CHANGED:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001701 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "configChanged");
Dianne Hackborn908aecc2012-07-31 16:37:34 -07001702 mCurDefaultDisplayDpi = ((Configuration)msg.obj).densityDpi;
Chong Zhang4951f9d2016-06-23 13:15:08 -07001703 mUpdatingSystemConfig = true;
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01001704 try {
1705 handleConfigurationChanged((Configuration) msg.obj, null);
1706 } finally {
1707 mUpdatingSystemConfig = false;
1708 }
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001709 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001710 break;
1711 case CLEAN_UP_CONTEXT:
1712 ContextCleanupInfo cci = (ContextCleanupInfo)msg.obj;
1713 cci.context.performFinalCleanup(cci.who, cci.what);
1714 break;
1715 case GC_WHEN_IDLE:
1716 scheduleGcIdler();
1717 break;
1718 case DUMP_SERVICE:
Dianne Hackborn625ac272010-09-17 18:29:22 -07001719 handleDumpService((DumpComponentInfo)msg.obj);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001720 break;
1721 case LOW_MEMORY:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001722 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "lowMemory");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001723 handleLowMemory();
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001724 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001725 break;
1726 case ACTIVITY_CONFIGURATION_CHANGED:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001727 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityConfigChanged");
Filip Gruszczynskica664812015-12-04 12:43:36 -08001728 handleActivityConfigurationChanged((ActivityConfigChangeData) msg.obj,
Andrii Kulianb047b8b2017-02-08 18:38:26 -08001729 INVALID_DISPLAY);
1730 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
1731 break;
1732 case ACTIVITY_MOVED_TO_DISPLAY:
1733 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityMovedToDisplay");
1734 handleActivityConfigurationChanged((ActivityConfigChangeData) msg.obj,
1735 msg.arg1 /* displayId */);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001736 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001737 break;
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08001738 case PROFILER_CONTROL:
Jeff Hao1b012d32014-08-20 10:35:34 -07001739 handleProfilerControl(msg.arg1 != 0, (ProfilerInfo)msg.obj, msg.arg2);
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08001740 break;
Christopher Tate181fafa2009-05-14 11:12:14 -07001741 case CREATE_BACKUP_AGENT:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001742 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupCreateAgent");
Christopher Tate181fafa2009-05-14 11:12:14 -07001743 handleCreateBackupAgent((CreateBackupAgentData)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001744 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Christopher Tate181fafa2009-05-14 11:12:14 -07001745 break;
1746 case DESTROY_BACKUP_AGENT:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001747 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupDestroyAgent");
Christopher Tate181fafa2009-05-14 11:12:14 -07001748 handleDestroyBackupAgent((CreateBackupAgentData)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001749 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Christopher Tate181fafa2009-05-14 11:12:14 -07001750 break;
Christopher Tate5e1ab332009-09-01 20:32:49 -07001751 case SUICIDE:
Dianne Hackborn9bfb7072009-09-22 11:37:40 -07001752 Process.killProcess(Process.myPid());
1753 break;
1754 case REMOVE_PROVIDER:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001755 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "providerRemove");
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07001756 completeRemoveProvider((ProviderRefCount)msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001757 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Christopher Tate5e1ab332009-09-01 20:32:49 -07001758 break;
Dianne Hackborn2a9094d2010-02-03 19:20:09 -08001759 case ENABLE_JIT:
1760 ensureJitEnabled();
1761 break;
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07001762 case DISPATCH_PACKAGE_BROADCAST:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001763 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastPackage");
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07001764 handleDispatchPackageBroadcast(msg.arg1, (String[])msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001765 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07001766 break;
Dianne Hackborn9d39d0c2010-06-24 15:57:42 -07001767 case SCHEDULE_CRASH:
1768 throw new RemoteServiceException((String)msg.obj);
Andy McFadden824c5102010-07-09 16:26:57 -07001769 case DUMP_HEAP:
Christopher Ferris8d652f82017-04-11 16:29:18 -07001770 handleDumpHeap((DumpHeapData) msg.obj);
Andy McFadden824c5102010-07-09 16:26:57 -07001771 break;
Dianne Hackborn625ac272010-09-17 18:29:22 -07001772 case DUMP_ACTIVITY:
1773 handleDumpActivity((DumpComponentInfo)msg.obj);
1774 break;
Marco Nelissen18cb2872011-11-15 11:19:53 -08001775 case DUMP_PROVIDER:
1776 handleDumpProvider((DumpComponentInfo)msg.obj);
1777 break;
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08001778 case SLEEPING:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001779 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "sleeping");
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08001780 handleSleeping((IBinder)msg.obj, msg.arg1 != 0);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001781 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08001782 break;
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08001783 case SET_CORE_SETTINGS:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001784 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setCoreSettings");
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08001785 handleSetCoreSettings((Bundle) msg.obj);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001786 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08001787 break;
Dianne Hackborne2515ee2011-04-27 18:52:56 -04001788 case UPDATE_PACKAGE_COMPATIBILITY_INFO:
1789 handleUpdatePackageCompatibilityInfo((UpdateCompatibilityData)msg.obj);
Dianne Hackbornf0754f5b2011-07-21 16:02:07 -07001790 break;
Dianne Hackbornce86ba82011-07-13 19:33:41 -07001791 case TRIM_MEMORY:
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001792 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "trimMemory");
Dianne Hackbornce86ba82011-07-13 19:33:41 -07001793 handleTrimMemory(msg.arg1);
Dianne Hackborn1ded0b12012-04-26 14:14:50 -07001794 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Dianne Hackbornf0754f5b2011-07-21 16:02:07 -07001795 break;
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07001796 case UNSTABLE_PROVIDER_DIED:
1797 handleUnstableProviderDied((IBinder)msg.obj, false);
1798 break;
Adam Skorydfc7fd72013-08-05 19:23:41 -07001799 case REQUEST_ASSIST_CONTEXT_EXTRAS:
1800 handleRequestAssistContextExtras((RequestAssistContextExtras)msg.obj);
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08001801 break;
Craig Mautner5eda9b32013-07-02 11:58:16 -07001802 case TRANSLUCENT_CONVERSION_COMPLETE:
1803 handleTranslucentConversionComplete((IBinder)msg.obj, msg.arg1 == 1);
1804 break;
Jeff Sharkeydd97f422013-10-08 17:01:30 -07001805 case INSTALL_PROVIDER:
1806 handleInstallProvider((ProviderInfo) msg.obj);
1807 break;
Craig Mautnereb8abf72014-07-02 15:04:09 -07001808 case ON_NEW_ACTIVITY_OPTIONS:
1809 Pair<IBinder, ActivityOptions> pair = (Pair<IBinder, ActivityOptions>) msg.obj;
1810 onNewActivityOptions(pair.first, pair.second);
Dake Gu7ef70b02014-07-08 18:37:12 -07001811 break;
Craig Mautner8746a472014-07-24 15:12:54 -07001812 case ENTER_ANIMATION_COMPLETE:
1813 handleEnterAnimationComplete((IBinder) msg.obj);
1814 break;
Rahul Chaturvedi52613f92015-06-17 23:54:08 -04001815 case START_BINDER_TRACKING:
1816 handleStartBinderTracking();
1817 break;
1818 case STOP_BINDER_TRACKING_AND_DUMP:
1819 handleStopBinderTrackingAndDump((ParcelFileDescriptor) msg.obj);
1820 break;
Andrii Kulian933076d2016-03-29 17:04:42 -07001821 case MULTI_WINDOW_MODE_CHANGED:
Winson Chung5af42fc2017-03-24 17:11:33 -07001822 handleMultiWindowModeChanged((IBinder) ((SomeArgs) msg.obj).arg1,
1823 ((SomeArgs) msg.obj).argi1 == 1,
1824 (Configuration) ((SomeArgs) msg.obj).arg2);
Wale Ogunwale5f986092015-12-04 15:35:38 -08001825 break;
Andrii Kulian933076d2016-03-29 17:04:42 -07001826 case PICTURE_IN_PICTURE_MODE_CHANGED:
Winson Chung5af42fc2017-03-24 17:11:33 -07001827 handlePictureInPictureModeChanged((IBinder) ((SomeArgs) msg.obj).arg1,
1828 ((SomeArgs) msg.obj).argi1 == 1,
1829 (Configuration) ((SomeArgs) msg.obj).arg2);
Wale Ogunwale5f986092015-12-04 15:35:38 -08001830 break;
Amith Yamasani0af6fa72016-01-17 15:36:19 -08001831 case LOCAL_VOICE_INTERACTION_STARTED:
1832 handleLocalVoiceInteractionStarted((IBinder) ((SomeArgs) msg.obj).arg1,
1833 (IVoiceInteractor) ((SomeArgs) msg.obj).arg2);
Amith Yamasani61019112017-01-10 15:05:00 -08001834 break;
Leonard Mosescuf3409ce2016-10-06 17:32:05 -07001835 case ATTACH_AGENT:
1836 handleAttachAgent((String) msg.obj);
Amith Yamasani0af6fa72016-01-17 15:36:19 -08001837 break;
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01001838 case APPLICATION_INFO_CHANGED:
1839 mUpdatingSystemConfig = true;
1840 try {
1841 handleApplicationInfoChanged((ApplicationInfo) msg.obj);
1842 } finally {
1843 mUpdatingSystemConfig = false;
1844 }
1845 break;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001846 }
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07001847 Object obj = msg.obj;
1848 if (obj instanceof SomeArgs) {
1849 ((SomeArgs) obj).recycle();
1850 }
Dianne Hackborn755c8bf2012-05-07 15:06:09 -07001851 if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + codeToString(msg.what));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001852 }
1853 }
1854
Romain Guy65b345f2011-07-27 18:51:50 -07001855 private class Idler implements MessageQueue.IdleHandler {
Craig Mautner48d0d182013-06-11 07:53:06 -07001856 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001857 public final boolean queueIdle() {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001858 ActivityClientRecord a = mNewActivities;
Dianne Hackborn62f20ec2011-08-15 17:40:28 -07001859 boolean stopProfiling = false;
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07001860 if (mBoundApplication != null && mProfiler.profileFd != null
1861 && mProfiler.autoStopProfiler) {
Dianne Hackborn62f20ec2011-08-15 17:40:28 -07001862 stopProfiling = true;
1863 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001864 if (a != null) {
1865 mNewActivities = null;
Sudheer Shankadc589ac2016-11-10 15:30:17 -08001866 IActivityManager am = ActivityManager.getService();
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001867 ActivityClientRecord prev;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001868 do {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07001869 if (localLOGV) Slog.v(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001870 TAG, "Reporting idle of " + a +
1871 " finished=" +
Romain Guy65b345f2011-07-27 18:51:50 -07001872 (a.activity != null && a.activity.mFinished));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001873 if (a.activity != null && !a.activity.mFinished) {
1874 try {
Dianne Hackborn62f20ec2011-08-15 17:40:28 -07001875 am.activityIdle(a.token, a.createdConfig, stopProfiling);
Dianne Hackborne88846e2009-09-30 21:34:25 -07001876 a.createdConfig = null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001877 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001878 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001879 }
1880 }
1881 prev = a;
1882 a = a.nextIdle;
1883 prev.nextIdle = null;
1884 } while (a != null);
1885 }
Dianne Hackborn62f20ec2011-08-15 17:40:28 -07001886 if (stopProfiling) {
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07001887 mProfiler.stopProfiling();
Dianne Hackborn62f20ec2011-08-15 17:40:28 -07001888 }
Dianne Hackborn2a9094d2010-02-03 19:20:09 -08001889 ensureJitEnabled();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001890 return false;
1891 }
1892 }
1893
1894 final class GcIdler implements MessageQueue.IdleHandler {
Craig Mautner48d0d182013-06-11 07:53:06 -07001895 @Override
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001896 public final boolean queueIdle() {
1897 doGcIfNeeded();
1898 return false;
1899 }
1900 }
1901
Romain Guy65b345f2011-07-27 18:51:50 -07001902 public static ActivityThread currentActivityThread() {
Jeff Sharkey66a017b2013-01-17 18:18:22 -08001903 return sCurrentActivityThread;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001904 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001905
Wale Ogunwale9a6ef1e2015-06-02 13:41:00 -07001906 public static boolean isSystem() {
1907 return (sCurrentActivityThread != null) ? sCurrentActivityThread.mSystemThread : false;
1908 }
1909
Svetoslavfbf0eca2015-05-01 16:52:41 -07001910 public static String currentOpPackageName() {
1911 ActivityThread am = currentActivityThread();
1912 return (am != null && am.getApplication() != null)
1913 ? am.getApplication().getOpPackageName() : null;
1914 }
1915
Romain Guy65b345f2011-07-27 18:51:50 -07001916 public static String currentPackageName() {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001917 ActivityThread am = currentActivityThread();
1918 return (am != null && am.mBoundApplication != null)
Dianne Hackbornb57a50b2013-04-11 17:29:32 -07001919 ? am.mBoundApplication.appInfo.packageName : null;
1920 }
1921
1922 public static String currentProcessName() {
1923 ActivityThread am = currentActivityThread();
1924 return (am != null && am.mBoundApplication != null)
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001925 ? am.mBoundApplication.processName : null;
1926 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001927
Romain Guy65b345f2011-07-27 18:51:50 -07001928 public static Application currentApplication() {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001929 ActivityThread am = currentActivityThread();
1930 return am != null ? am.mInitialApplication : null;
1931 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001932
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001933 public static IPackageManager getPackageManager() {
1934 if (sPackageManager != null) {
1935 //Slog.v("PackageManager", "returning cur default = " + sPackageManager);
1936 return sPackageManager;
1937 }
1938 IBinder b = ServiceManager.getService("package");
1939 //Slog.v("PackageManager", "default service binder = " + b);
1940 sPackageManager = IPackageManager.Stub.asInterface(b);
1941 //Slog.v("PackageManager", "default service = " + sPackageManager);
1942 return sPackageManager;
1943 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001944
Romain Guy65b345f2011-07-27 18:51:50 -07001945 private Configuration mMainThreadConfig = new Configuration();
Amith Yamasani4f128e42016-05-10 11:44:12 -07001946
Dianne Hackborn908aecc2012-07-31 16:37:34 -07001947 Configuration applyConfigCompatMainThread(int displayDensity, Configuration config,
1948 CompatibilityInfo compat) {
Dianne Hackborn5fd21692011-06-07 14:09:47 -07001949 if (config == null) {
1950 return null;
1951 }
Craig Mautner48d0d182013-06-11 07:53:06 -07001952 if (!compat.supportsScreen()) {
Dianne Hackborn5fd21692011-06-07 14:09:47 -07001953 mMainThreadConfig.setTo(config);
1954 config = mMainThreadConfig;
Dianne Hackborn908aecc2012-07-31 16:37:34 -07001955 compat.applyToConfiguration(displayDensity, config);
Dianne Hackborn5fd21692011-06-07 14:09:47 -07001956 }
1957 return config;
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001958 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001959
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001960 /**
Todd Kennedy39bfee52016-02-24 10:28:21 -08001961 * Creates the top level resources for the given package. Will return an existing
1962 * Resources if one has already been created.
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001963 */
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07001964 Resources getTopLevelResources(String resDir, String[] splitResDirs, String[] overlayDirs,
Adam Lesinski082614c2016-03-04 14:33:47 -08001965 String[] libDirs, int displayId, LoadedApk pkgInfo) {
1966 return mResourcesManager.getResources(null, resDir, splitResDirs, overlayDirs, libDirs,
1967 displayId, null, pkgInfo.getCompatibilityInfo(), pkgInfo.getClassLoader());
Todd Kennedy39bfee52016-02-24 10:28:21 -08001968 }
1969
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001970 final Handler getHandler() {
1971 return mH;
1972 }
1973
Dianne Hackborne2515ee2011-04-27 18:52:56 -04001974 public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo,
1975 int flags) {
Amith Yamasani98edc952012-09-25 14:09:27 -07001976 return getPackageInfo(packageName, compatInfo, flags, UserHandle.myUserId());
1977 }
1978
1979 public final LoadedApk getPackageInfo(String packageName, CompatibilityInfo compatInfo,
1980 int flags, int userId) {
Jeff Sharkeyb9f36742015-04-08 21:02:14 -07001981 final boolean differentUser = (UserHandle.myUserId() != userId);
Craig Mautner88c05892013-06-28 09:47:45 -07001982 synchronized (mResourcesManager) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001983 WeakReference<LoadedApk> ref;
Jeff Sharkeyb9f36742015-04-08 21:02:14 -07001984 if (differentUser) {
1985 // Caching not supported across users
1986 ref = null;
1987 } else if ((flags & Context.CONTEXT_INCLUDE_CODE) != 0) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001988 ref = mPackages.get(packageName);
1989 } else {
1990 ref = mResourcePackages.get(packageName);
1991 }
Jeff Sharkeyb9f36742015-04-08 21:02:14 -07001992
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07001993 LoadedApk packageInfo = ref != null ? ref.get() : null;
Dianne Hackborn399cccb2010-04-13 22:57:49 -07001994 //Slog.i(TAG, "getPackageInfo " + packageName + ": " + packageInfo);
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07001995 //if (packageInfo != null) Slog.i(TAG, "isUptoDate " + packageInfo.mResDir
1996 // + ": " + packageInfo.mResources.getAssets().isUpToDate());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08001997 if (packageInfo != null && (packageInfo.mResources == null
1998 || packageInfo.mResources.getAssets().isUpToDate())) {
1999 if (packageInfo.isSecurityViolation()
2000 && (flags&Context.CONTEXT_IGNORE_SECURITY) == 0) {
2001 throw new SecurityException(
2002 "Requesting code from " + packageName
2003 + " to be run in process "
2004 + mBoundApplication.processName
2005 + "/" + mBoundApplication.appInfo.uid);
2006 }
2007 return packageInfo;
2008 }
2009 }
2010
2011 ApplicationInfo ai = null;
2012 try {
2013 ai = getPackageManager().getApplicationInfo(packageName,
Jeff Sharkeyc5967e92016-01-07 18:50:29 -07002014 PackageManager.GET_SHARED_LIBRARY_FILES
2015 | PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
2016 userId);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002017 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002018 throw e.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002019 }
2020
2021 if (ai != null) {
Dianne Hackborne2515ee2011-04-27 18:52:56 -04002022 return getPackageInfo(ai, compatInfo, flags);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002023 }
2024
2025 return null;
2026 }
2027
Dianne Hackborne2515ee2011-04-27 18:52:56 -04002028 public final LoadedApk getPackageInfo(ApplicationInfo ai, CompatibilityInfo compatInfo,
2029 int flags) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002030 boolean includeCode = (flags&Context.CONTEXT_INCLUDE_CODE) != 0;
2031 boolean securityViolation = includeCode && ai.uid != 0
2032 && ai.uid != Process.SYSTEM_UID && (mBoundApplication != null
Dianne Hackbornf02b60a2012-08-16 10:48:27 -07002033 ? !UserHandle.isSameApp(ai.uid, mBoundApplication.appInfo.uid)
Amith Yamasani742a6712011-05-04 14:49:28 -07002034 : true);
Dianne Hackbornfee756f2014-07-16 17:31:10 -07002035 boolean registerPackage = includeCode && (flags&Context.CONTEXT_REGISTER_PACKAGE) != 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002036 if ((flags&(Context.CONTEXT_INCLUDE_CODE
2037 |Context.CONTEXT_IGNORE_SECURITY))
2038 == Context.CONTEXT_INCLUDE_CODE) {
2039 if (securityViolation) {
2040 String msg = "Requesting code from " + ai.packageName
2041 + " (with uid " + ai.uid + ")";
2042 if (mBoundApplication != null) {
2043 msg = msg + " to be run in process "
2044 + mBoundApplication.processName + " (with uid "
2045 + mBoundApplication.appInfo.uid + ")";
2046 }
2047 throw new SecurityException(msg);
2048 }
2049 }
Dianne Hackbornfee756f2014-07-16 17:31:10 -07002050 return getPackageInfo(ai, compatInfo, null, securityViolation, includeCode,
2051 registerPackage);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002052 }
2053
Dianne Hackborne2515ee2011-04-27 18:52:56 -04002054 public final LoadedApk getPackageInfoNoCheck(ApplicationInfo ai,
2055 CompatibilityInfo compatInfo) {
Dianne Hackbornfee756f2014-07-16 17:31:10 -07002056 return getPackageInfo(ai, compatInfo, null, false, true, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002057 }
2058
Dianne Hackborne2515ee2011-04-27 18:52:56 -04002059 public final LoadedApk peekPackageInfo(String packageName, boolean includeCode) {
Craig Mautner88c05892013-06-28 09:47:45 -07002060 synchronized (mResourcesManager) {
Dianne Hackborne2515ee2011-04-27 18:52:56 -04002061 WeakReference<LoadedApk> ref;
2062 if (includeCode) {
2063 ref = mPackages.get(packageName);
2064 } else {
2065 ref = mResourcePackages.get(packageName);
2066 }
2067 return ref != null ? ref.get() : null;
2068 }
2069 }
2070
Romain Guy65b345f2011-07-27 18:51:50 -07002071 private LoadedApk getPackageInfo(ApplicationInfo aInfo, CompatibilityInfo compatInfo,
Dianne Hackbornfee756f2014-07-16 17:31:10 -07002072 ClassLoader baseLoader, boolean securityViolation, boolean includeCode,
2073 boolean registerPackage) {
Jeff Sharkeyb9f36742015-04-08 21:02:14 -07002074 final boolean differentUser = (UserHandle.myUserId() != UserHandle.getUserId(aInfo.uid));
Craig Mautner88c05892013-06-28 09:47:45 -07002075 synchronized (mResourcesManager) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07002076 WeakReference<LoadedApk> ref;
Jeff Sharkeyb9f36742015-04-08 21:02:14 -07002077 if (differentUser) {
2078 // Caching not supported across users
2079 ref = null;
2080 } else if (includeCode) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002081 ref = mPackages.get(aInfo.packageName);
2082 } else {
2083 ref = mResourcePackages.get(aInfo.packageName);
2084 }
Jeff Sharkeyb9f36742015-04-08 21:02:14 -07002085
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07002086 LoadedApk packageInfo = ref != null ? ref.get() : null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002087 if (packageInfo == null || (packageInfo.mResources != null
2088 && !packageInfo.mResources.getAssets().isUpToDate())) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07002089 if (localLOGV) Slog.v(TAG, (includeCode ? "Loading code package "
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002090 : "Loading resource-only package ") + aInfo.packageName
2091 + " (in " + (mBoundApplication != null
2092 ? mBoundApplication.processName : null)
2093 + ")");
2094 packageInfo =
Jeff Browndefd4a62014-03-10 21:24:37 -07002095 new LoadedApk(this, aInfo, compatInfo, baseLoader,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002096 securityViolation, includeCode &&
Dianne Hackbornfee756f2014-07-16 17:31:10 -07002097 (aInfo.flags&ApplicationInfo.FLAG_HAS_CODE) != 0, registerPackage);
Narayan Kamathcb383182014-10-29 17:56:42 +00002098
2099 if (mSystemThread && "android".equals(aInfo.packageName)) {
2100 packageInfo.installSystemApplicationInfo(aInfo,
2101 getSystemContext().mPackageInfo.getClassLoader());
2102 }
2103
Jeff Sharkeyb9f36742015-04-08 21:02:14 -07002104 if (differentUser) {
2105 // Caching not supported across users
2106 } else if (includeCode) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002107 mPackages.put(aInfo.packageName,
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07002108 new WeakReference<LoadedApk>(packageInfo));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002109 } else {
2110 mResourcePackages.put(aInfo.packageName,
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07002111 new WeakReference<LoadedApk>(packageInfo));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002112 }
2113 }
2114 return packageInfo;
2115 }
2116 }
2117
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002118 ActivityThread() {
Craig Mautner88c05892013-06-28 09:47:45 -07002119 mResourcesManager = ResourcesManager.getInstance();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002120 }
2121
2122 public ApplicationThread getApplicationThread()
2123 {
2124 return mAppThread;
2125 }
2126
2127 public Instrumentation getInstrumentation()
2128 {
2129 return mInstrumentation;
2130 }
2131
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002132 public boolean isProfiling() {
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07002133 return mProfiler != null && mProfiler.profileFile != null
2134 && mProfiler.profileFd == null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002135 }
2136
2137 public String getProfileFilePath() {
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07002138 return mProfiler.profileFile;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002139 }
2140
2141 public Looper getLooper() {
2142 return mLooper;
2143 }
2144
2145 public Application getApplication() {
2146 return mInitialApplication;
2147 }
Bob Leee5408332009-09-04 18:31:17 -07002148
Dianne Hackbornd97c7ad2009-06-19 11:37:35 -07002149 public String getProcessName() {
2150 return mBoundApplication.processName;
2151 }
Bob Leee5408332009-09-04 18:31:17 -07002152
Dianne Hackborn21556372010-02-04 16:34:40 -08002153 public ContextImpl getSystemContext() {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002154 synchronized (this) {
2155 if (mSystemContext == null) {
Jeff Browndefd4a62014-03-10 21:24:37 -07002156 mSystemContext = ContextImpl.createSystemContext(this);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002157 }
Jeff Browndefd4a62014-03-10 21:24:37 -07002158 return mSystemContext;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002159 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002160 }
2161
Adam Lesinskia82b6262017-03-21 16:56:17 -07002162 public ContextImpl getSystemUiContext() {
2163 synchronized (this) {
2164 if (mSystemUiContext == null) {
Adam Lesinski6f1a9172017-04-10 16:35:19 -07002165 mSystemUiContext = ContextImpl.createSystemUiContext(getSystemContext());
Adam Lesinskia82b6262017-03-21 16:56:17 -07002166 }
2167 return mSystemUiContext;
2168 }
2169 }
2170
Narayan Kamath29564cd2014-08-07 10:57:40 +01002171 public void installSystemApplicationInfo(ApplicationInfo info, ClassLoader classLoader) {
Mike Cleron432b7132009-09-24 15:28:29 -07002172 synchronized (this) {
Narayan Kamath29564cd2014-08-07 10:57:40 +01002173 getSystemContext().installSystemApplicationInfo(info, classLoader);
Adam Lesinskia82b6262017-03-21 16:56:17 -07002174 getSystemUiContext().installSystemApplicationInfo(info, classLoader);
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07002175
2176 // give ourselves a default profiler
2177 mProfiler = new Profiler();
Mike Cleron432b7132009-09-24 15:28:29 -07002178 }
2179 }
2180
Dianne Hackborn2a9094d2010-02-03 19:20:09 -08002181 void ensureJitEnabled() {
2182 if (!mJitEnabled) {
2183 mJitEnabled = true;
2184 dalvik.system.VMRuntime.getRuntime().startJitCompilation();
2185 }
2186 }
Craig Mautner48d0d182013-06-11 07:53:06 -07002187
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002188 void scheduleGcIdler() {
2189 if (!mGcIdlerScheduled) {
2190 mGcIdlerScheduled = true;
2191 Looper.myQueue().addIdleHandler(mGcIdler);
2192 }
2193 mH.removeMessages(H.GC_WHEN_IDLE);
2194 }
2195
2196 void unscheduleGcIdler() {
2197 if (mGcIdlerScheduled) {
2198 mGcIdlerScheduled = false;
2199 Looper.myQueue().removeIdleHandler(mGcIdler);
2200 }
2201 mH.removeMessages(H.GC_WHEN_IDLE);
2202 }
2203
2204 void doGcIfNeeded() {
2205 mGcIdlerScheduled = false;
2206 final long now = SystemClock.uptimeMillis();
Dianne Hackborn399cccb2010-04-13 22:57:49 -07002207 //Slog.i(TAG, "**** WE MIGHT WANT TO GC: then=" + Binder.getLastGcTime()
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002208 // + "m now=" + now);
2209 if ((BinderInternal.getLastGcTime()+MIN_TIME_BETWEEN_GCS) < now) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07002210 //Slog.i(TAG, "**** WE DO, WE DO WANT TO GC!");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002211 BinderInternal.forceGc("bg");
2212 }
2213 }
2214
Dianne Hackborne77187d2013-10-25 16:32:41 -07002215 private static final String HEAP_FULL_COLUMN
2216 = "%13s %8s %8s %8s %8s %8s %8s %8s %8s %8s %8s";
2217 private static final String HEAP_COLUMN
2218 = "%13s %8s %8s %8s %8s %8s %8s %8s";
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002219 private static final String ONE_COUNT_COLUMN = "%21s %8d";
2220 private static final String TWO_COUNT_COLUMNS = "%21s %8d %21s %8d";
2221 private static final String ONE_COUNT_COLUMN_HEADER = "%21s %8s";
Dianne Hackborne77187d2013-10-25 16:32:41 -07002222
2223 // Formatting for checkin service - update version if row format changes
Martijn Coenen41f94ed2015-12-14 15:28:51 +01002224 private static final int ACTIVITY_THREAD_CHECKIN_VERSION = 4;
Dianne Hackborne77187d2013-10-25 16:32:41 -07002225
2226 static void printRow(PrintWriter pw, String format, Object...objs) {
2227 pw.println(String.format(format, objs));
2228 }
2229
2230 public static void dumpMemInfoTable(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin,
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002231 boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly,
2232 int pid, String processName,
Dianne Hackborne77187d2013-10-25 16:32:41 -07002233 long nativeMax, long nativeAllocated, long nativeFree,
2234 long dalvikMax, long dalvikAllocated, long dalvikFree) {
2235
2236 // For checkin, we print one long comma-separated list of values
2237 if (checkin) {
2238 // NOTE: if you change anything significant below, also consider changing
2239 // ACTIVITY_THREAD_CHECKIN_VERSION.
2240
2241 // Header
2242 pw.print(ACTIVITY_THREAD_CHECKIN_VERSION); pw.print(',');
2243 pw.print(pid); pw.print(',');
2244 pw.print(processName); pw.print(',');
2245
2246 // Heap info - max
2247 pw.print(nativeMax); pw.print(',');
2248 pw.print(dalvikMax); pw.print(',');
2249 pw.print("N/A,");
2250 pw.print(nativeMax + dalvikMax); pw.print(',');
2251
2252 // Heap info - allocated
2253 pw.print(nativeAllocated); pw.print(',');
2254 pw.print(dalvikAllocated); pw.print(',');
2255 pw.print("N/A,");
2256 pw.print(nativeAllocated + dalvikAllocated); pw.print(',');
2257
2258 // Heap info - free
2259 pw.print(nativeFree); pw.print(',');
2260 pw.print(dalvikFree); pw.print(',');
2261 pw.print("N/A,");
2262 pw.print(nativeFree + dalvikFree); pw.print(',');
2263
2264 // Heap info - proportional set size
2265 pw.print(memInfo.nativePss); pw.print(',');
2266 pw.print(memInfo.dalvikPss); pw.print(',');
2267 pw.print(memInfo.otherPss); pw.print(',');
2268 pw.print(memInfo.getTotalPss()); pw.print(',');
2269
2270 // Heap info - swappable set size
2271 pw.print(memInfo.nativeSwappablePss); pw.print(',');
2272 pw.print(memInfo.dalvikSwappablePss); pw.print(',');
2273 pw.print(memInfo.otherSwappablePss); pw.print(',');
2274 pw.print(memInfo.getTotalSwappablePss()); pw.print(',');
2275
2276 // Heap info - shared dirty
2277 pw.print(memInfo.nativeSharedDirty); pw.print(',');
2278 pw.print(memInfo.dalvikSharedDirty); pw.print(',');
2279 pw.print(memInfo.otherSharedDirty); pw.print(',');
2280 pw.print(memInfo.getTotalSharedDirty()); pw.print(',');
2281
2282 // Heap info - shared clean
2283 pw.print(memInfo.nativeSharedClean); pw.print(',');
2284 pw.print(memInfo.dalvikSharedClean); pw.print(',');
2285 pw.print(memInfo.otherSharedClean); pw.print(',');
2286 pw.print(memInfo.getTotalSharedClean()); pw.print(',');
2287
2288 // Heap info - private Dirty
2289 pw.print(memInfo.nativePrivateDirty); pw.print(',');
2290 pw.print(memInfo.dalvikPrivateDirty); pw.print(',');
2291 pw.print(memInfo.otherPrivateDirty); pw.print(',');
2292 pw.print(memInfo.getTotalPrivateDirty()); pw.print(',');
2293
2294 // Heap info - private Clean
2295 pw.print(memInfo.nativePrivateClean); pw.print(',');
2296 pw.print(memInfo.dalvikPrivateClean); pw.print(',');
2297 pw.print(memInfo.otherPrivateClean); pw.print(',');
2298 pw.print(memInfo.getTotalPrivateClean()); pw.print(',');
2299
Martijn Coenen41f94ed2015-12-14 15:28:51 +01002300 // Heap info - swapped out
2301 pw.print(memInfo.nativeSwappedOut); pw.print(',');
2302 pw.print(memInfo.dalvikSwappedOut); pw.print(',');
2303 pw.print(memInfo.otherSwappedOut); pw.print(',');
2304 pw.print(memInfo.getTotalSwappedOut()); pw.print(',');
2305
2306 // Heap info - swapped out pss
2307 if (memInfo.hasSwappedOutPss) {
2308 pw.print(memInfo.nativeSwappedOutPss); pw.print(',');
2309 pw.print(memInfo.dalvikSwappedOutPss); pw.print(',');
2310 pw.print(memInfo.otherSwappedOutPss); pw.print(',');
2311 pw.print(memInfo.getTotalSwappedOutPss()); pw.print(',');
2312 } else {
2313 pw.print("N/A,");
2314 pw.print("N/A,");
2315 pw.print("N/A,");
2316 pw.print("N/A,");
2317 }
2318
Dianne Hackborne77187d2013-10-25 16:32:41 -07002319 // Heap info - other areas
2320 for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
2321 pw.print(Debug.MemoryInfo.getOtherLabel(i)); pw.print(',');
2322 pw.print(memInfo.getOtherPss(i)); pw.print(',');
2323 pw.print(memInfo.getOtherSwappablePss(i)); pw.print(',');
2324 pw.print(memInfo.getOtherSharedDirty(i)); pw.print(',');
2325 pw.print(memInfo.getOtherSharedClean(i)); pw.print(',');
2326 pw.print(memInfo.getOtherPrivateDirty(i)); pw.print(',');
2327 pw.print(memInfo.getOtherPrivateClean(i)); pw.print(',');
Martijn Coenen41f94ed2015-12-14 15:28:51 +01002328 pw.print(memInfo.getOtherSwappedOut(i)); pw.print(',');
2329 if (memInfo.hasSwappedOutPss) {
2330 pw.print(memInfo.getOtherSwappedOutPss(i)); pw.print(',');
2331 } else {
2332 pw.print("N/A,");
2333 }
Dianne Hackborne77187d2013-10-25 16:32:41 -07002334 }
2335 return;
2336 }
2337
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002338 if (!dumpSummaryOnly) {
2339 if (dumpFullInfo) {
2340 printRow(pw, HEAP_FULL_COLUMN, "", "Pss", "Pss", "Shared", "Private",
Martijn Coenene0764852016-01-07 17:04:22 -08002341 "Shared", "Private", memInfo.hasSwappedOutPss ? "SwapPss" : "Swap",
2342 "Heap", "Heap", "Heap");
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002343 printRow(pw, HEAP_FULL_COLUMN, "", "Total", "Clean", "Dirty", "Dirty",
Martijn Coenene0764852016-01-07 17:04:22 -08002344 "Clean", "Clean", "Dirty",
2345 "Size", "Alloc", "Free");
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002346 printRow(pw, HEAP_FULL_COLUMN, "", "------", "------", "------", "------",
2347 "------", "------", "------", "------", "------", "------");
2348 printRow(pw, HEAP_FULL_COLUMN, "Native Heap", memInfo.nativePss,
2349 memInfo.nativeSwappablePss, memInfo.nativeSharedDirty,
2350 memInfo.nativePrivateDirty, memInfo.nativeSharedClean,
Martijn Coenene0764852016-01-07 17:04:22 -08002351 memInfo.nativePrivateClean, memInfo.hasSwappedOutPss ?
Richard Uhler91702eb32017-06-23 16:54:25 +01002352 memInfo.nativeSwappedOutPss : memInfo.nativeSwappedOut,
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002353 nativeMax, nativeAllocated, nativeFree);
2354 printRow(pw, HEAP_FULL_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
2355 memInfo.dalvikSwappablePss, memInfo.dalvikSharedDirty,
2356 memInfo.dalvikPrivateDirty, memInfo.dalvikSharedClean,
Martijn Coenene0764852016-01-07 17:04:22 -08002357 memInfo.dalvikPrivateClean, memInfo.hasSwappedOutPss ?
Richard Uhler91702eb32017-06-23 16:54:25 +01002358 memInfo.dalvikSwappedOutPss : memInfo.dalvikSwappedOut,
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002359 dalvikMax, dalvikAllocated, dalvikFree);
2360 } else {
2361 printRow(pw, HEAP_COLUMN, "", "Pss", "Private",
Martijn Coenene0764852016-01-07 17:04:22 -08002362 "Private", memInfo.hasSwappedOutPss ? "SwapPss" : "Swap",
2363 "Heap", "Heap", "Heap");
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002364 printRow(pw, HEAP_COLUMN, "", "Total", "Dirty",
2365 "Clean", "Dirty", "Size", "Alloc", "Free");
2366 printRow(pw, HEAP_COLUMN, "", "------", "------", "------",
2367 "------", "------", "------", "------", "------");
2368 printRow(pw, HEAP_COLUMN, "Native Heap", memInfo.nativePss,
2369 memInfo.nativePrivateDirty,
Martijn Coenene0764852016-01-07 17:04:22 -08002370 memInfo.nativePrivateClean,
2371 memInfo.hasSwappedOutPss ? memInfo.nativeSwappedOutPss :
2372 memInfo.nativeSwappedOut,
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002373 nativeMax, nativeAllocated, nativeFree);
2374 printRow(pw, HEAP_COLUMN, "Dalvik Heap", memInfo.dalvikPss,
2375 memInfo.dalvikPrivateDirty,
Martijn Coenene0764852016-01-07 17:04:22 -08002376 memInfo.dalvikPrivateClean,
2377 memInfo.hasSwappedOutPss ? memInfo.dalvikSwappedOutPss :
2378 memInfo.dalvikSwappedOut,
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002379 dalvikMax, dalvikAllocated, dalvikFree);
Dianne Hackborne77187d2013-10-25 16:32:41 -07002380 }
Dianne Hackborne77187d2013-10-25 16:32:41 -07002381
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002382 int otherPss = memInfo.otherPss;
2383 int otherSwappablePss = memInfo.otherSwappablePss;
2384 int otherSharedDirty = memInfo.otherSharedDirty;
2385 int otherPrivateDirty = memInfo.otherPrivateDirty;
2386 int otherSharedClean = memInfo.otherSharedClean;
2387 int otherPrivateClean = memInfo.otherPrivateClean;
2388 int otherSwappedOut = memInfo.otherSwappedOut;
Martijn Coenene0764852016-01-07 17:04:22 -08002389 int otherSwappedOutPss = memInfo.otherSwappedOutPss;
Dianne Hackborne77187d2013-10-25 16:32:41 -07002390
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002391 for (int i=0; i<Debug.MemoryInfo.NUM_OTHER_STATS; i++) {
Dianne Hackborne77187d2013-10-25 16:32:41 -07002392 final int myPss = memInfo.getOtherPss(i);
2393 final int mySwappablePss = memInfo.getOtherSwappablePss(i);
2394 final int mySharedDirty = memInfo.getOtherSharedDirty(i);
2395 final int myPrivateDirty = memInfo.getOtherPrivateDirty(i);
2396 final int mySharedClean = memInfo.getOtherSharedClean(i);
2397 final int myPrivateClean = memInfo.getOtherPrivateClean(i);
2398 final int mySwappedOut = memInfo.getOtherSwappedOut(i);
Martijn Coenene0764852016-01-07 17:04:22 -08002399 final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
Dianne Hackborne77187d2013-10-25 16:32:41 -07002400 if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
Martijn Coenene0764852016-01-07 17:04:22 -08002401 || mySharedClean != 0 || myPrivateClean != 0
2402 || (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
Dianne Hackborne77187d2013-10-25 16:32:41 -07002403 if (dumpFullInfo) {
2404 printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
2405 myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
Martijn Coenene0764852016-01-07 17:04:22 -08002406 mySharedClean, myPrivateClean,
2407 memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
2408 "", "", "");
Dianne Hackborne77187d2013-10-25 16:32:41 -07002409 } else {
2410 printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
2411 myPss, myPrivateDirty,
Martijn Coenene0764852016-01-07 17:04:22 -08002412 myPrivateClean,
2413 memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
2414 "", "", "");
Dianne Hackborne77187d2013-10-25 16:32:41 -07002415 }
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002416 otherPss -= myPss;
2417 otherSwappablePss -= mySwappablePss;
2418 otherSharedDirty -= mySharedDirty;
2419 otherPrivateDirty -= myPrivateDirty;
2420 otherSharedClean -= mySharedClean;
2421 otherPrivateClean -= myPrivateClean;
2422 otherSwappedOut -= mySwappedOut;
Martijn Coenene0764852016-01-07 17:04:22 -08002423 otherSwappedOutPss -= mySwappedOutPss;
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002424 }
2425 }
2426
2427 if (dumpFullInfo) {
2428 printRow(pw, HEAP_FULL_COLUMN, "Unknown", otherPss, otherSwappablePss,
2429 otherSharedDirty, otherPrivateDirty, otherSharedClean, otherPrivateClean,
Martijn Coenene0764852016-01-07 17:04:22 -08002430 memInfo.hasSwappedOutPss ? otherSwappedOutPss : otherSwappedOut,
2431 "", "", "");
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002432 printRow(pw, HEAP_FULL_COLUMN, "TOTAL", memInfo.getTotalPss(),
2433 memInfo.getTotalSwappablePss(),
2434 memInfo.getTotalSharedDirty(), memInfo.getTotalPrivateDirty(),
2435 memInfo.getTotalSharedClean(), memInfo.getTotalPrivateClean(),
Thierry Strudel9b511602016-02-25 17:46:38 -08002436 memInfo.hasSwappedOutPss ? memInfo.getTotalSwappedOutPss() :
2437 memInfo.getTotalSwappedOut(),
Martijn Coenene0764852016-01-07 17:04:22 -08002438 nativeMax+dalvikMax, nativeAllocated+dalvikAllocated,
2439 nativeFree+dalvikFree);
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002440 } else {
2441 printRow(pw, HEAP_COLUMN, "Unknown", otherPss,
Martijn Coenene0764852016-01-07 17:04:22 -08002442 otherPrivateDirty, otherPrivateClean,
2443 memInfo.hasSwappedOutPss ? otherSwappedOutPss : otherSwappedOut,
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002444 "", "", "");
2445 printRow(pw, HEAP_COLUMN, "TOTAL", memInfo.getTotalPss(),
2446 memInfo.getTotalPrivateDirty(),
2447 memInfo.getTotalPrivateClean(),
Martijn Coenene0764852016-01-07 17:04:22 -08002448 memInfo.hasSwappedOutPss ? memInfo.getTotalSwappedOutPss() :
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002449 memInfo.getTotalSwappedOut(),
2450 nativeMax+dalvikMax,
2451 nativeAllocated+dalvikAllocated, nativeFree+dalvikFree);
2452 }
2453
2454 if (dumpDalvik) {
2455 pw.println(" ");
2456 pw.println(" Dalvik Details");
2457
2458 for (int i=Debug.MemoryInfo.NUM_OTHER_STATS;
2459 i<Debug.MemoryInfo.NUM_OTHER_STATS + Debug.MemoryInfo.NUM_DVK_STATS; i++) {
2460 final int myPss = memInfo.getOtherPss(i);
2461 final int mySwappablePss = memInfo.getOtherSwappablePss(i);
2462 final int mySharedDirty = memInfo.getOtherSharedDirty(i);
2463 final int myPrivateDirty = memInfo.getOtherPrivateDirty(i);
2464 final int mySharedClean = memInfo.getOtherSharedClean(i);
2465 final int myPrivateClean = memInfo.getOtherPrivateClean(i);
2466 final int mySwappedOut = memInfo.getOtherSwappedOut(i);
Martijn Coenene0764852016-01-07 17:04:22 -08002467 final int mySwappedOutPss = memInfo.getOtherSwappedOutPss(i);
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002468 if (myPss != 0 || mySharedDirty != 0 || myPrivateDirty != 0
Martijn Coenene0764852016-01-07 17:04:22 -08002469 || mySharedClean != 0 || myPrivateClean != 0
2470 || (memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut) != 0) {
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002471 if (dumpFullInfo) {
2472 printRow(pw, HEAP_FULL_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
2473 myPss, mySwappablePss, mySharedDirty, myPrivateDirty,
Martijn Coenene0764852016-01-07 17:04:22 -08002474 mySharedClean, myPrivateClean,
2475 memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
2476 "", "", "");
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002477 } else {
2478 printRow(pw, HEAP_COLUMN, Debug.MemoryInfo.getOtherLabel(i),
2479 myPss, myPrivateDirty,
Martijn Coenene0764852016-01-07 17:04:22 -08002480 myPrivateClean,
2481 memInfo.hasSwappedOutPss ? mySwappedOutPss : mySwappedOut,
2482 "", "", "");
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002483 }
2484 }
Dianne Hackborne77187d2013-10-25 16:32:41 -07002485 }
2486 }
2487 }
Richard Uhlerc14b9cf2015-03-13 12:38:38 -07002488
2489 pw.println(" ");
2490 pw.println(" App Summary");
2491 printRow(pw, ONE_COUNT_COLUMN_HEADER, "", "Pss(KB)");
2492 printRow(pw, ONE_COUNT_COLUMN_HEADER, "", "------");
2493 printRow(pw, ONE_COUNT_COLUMN,
2494 "Java Heap:", memInfo.getSummaryJavaHeap());
2495 printRow(pw, ONE_COUNT_COLUMN,
2496 "Native Heap:", memInfo.getSummaryNativeHeap());
2497 printRow(pw, ONE_COUNT_COLUMN,
2498 "Code:", memInfo.getSummaryCode());
2499 printRow(pw, ONE_COUNT_COLUMN,
2500 "Stack:", memInfo.getSummaryStack());
2501 printRow(pw, ONE_COUNT_COLUMN,
2502 "Graphics:", memInfo.getSummaryGraphics());
2503 printRow(pw, ONE_COUNT_COLUMN,
2504 "Private Other:", memInfo.getSummaryPrivateOther());
2505 printRow(pw, ONE_COUNT_COLUMN,
2506 "System:", memInfo.getSummarySystem());
2507 pw.println(" ");
Martijn Coenene0764852016-01-07 17:04:22 -08002508 if (memInfo.hasSwappedOutPss) {
2509 printRow(pw, TWO_COUNT_COLUMNS,
2510 "TOTAL:", memInfo.getSummaryTotalPss(),
2511 "TOTAL SWAP PSS:", memInfo.getSummaryTotalSwapPss());
2512 } else {
2513 printRow(pw, TWO_COUNT_COLUMNS,
2514 "TOTAL:", memInfo.getSummaryTotalPss(),
2515 "TOTAL SWAP (KB):", memInfo.getSummaryTotalSwap());
2516 }
Dianne Hackborne77187d2013-10-25 16:32:41 -07002517 }
2518
Jeff Hamilton52d32032011-01-08 15:31:26 -06002519 public void registerOnActivityPausedListener(Activity activity,
2520 OnActivityPausedListener listener) {
2521 synchronized (mOnPauseListeners) {
2522 ArrayList<OnActivityPausedListener> list = mOnPauseListeners.get(activity);
2523 if (list == null) {
2524 list = new ArrayList<OnActivityPausedListener>();
2525 mOnPauseListeners.put(activity, list);
2526 }
2527 list.add(listener);
2528 }
2529 }
2530
Jeff Hamiltonce3224c2011-01-17 11:05:03 -08002531 public void unregisterOnActivityPausedListener(Activity activity,
2532 OnActivityPausedListener listener) {
2533 synchronized (mOnPauseListeners) {
2534 ArrayList<OnActivityPausedListener> list = mOnPauseListeners.get(activity);
2535 if (list != null) {
2536 list.remove(listener);
2537 }
2538 }
2539 }
2540
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002541 public final ActivityInfo resolveActivityInfo(Intent intent) {
2542 ActivityInfo aInfo = intent.resolveActivityInfo(
2543 mInitialApplication.getPackageManager(), PackageManager.GET_SHARED_LIBRARY_FILES);
2544 if (aInfo == null) {
2545 // Throw an exception.
2546 Instrumentation.checkStartActivityResult(
Dianne Hackborna4972e92012-03-14 10:38:05 -07002547 ActivityManager.START_CLASS_NOT_FOUND, intent);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002548 }
2549 return aInfo;
2550 }
Bob Leee5408332009-09-04 18:31:17 -07002551
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002552 public final Activity startActivityNow(Activity parent, String id,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002553 Intent intent, ActivityInfo activityInfo, IBinder token, Bundle state,
Dianne Hackbornb4bc78b2010-05-12 18:59:50 -07002554 Activity.NonConfigurationInstances lastNonConfigurationInstances) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07002555 ActivityClientRecord r = new ActivityClientRecord();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002556 r.token = token;
Dianne Hackbornb06ea702009-07-13 13:07:51 -07002557 r.ident = 0;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002558 r.intent = intent;
2559 r.state = state;
2560 r.parent = parent;
2561 r.embeddedID = id;
2562 r.activityInfo = activityInfo;
Dianne Hackbornb4bc78b2010-05-12 18:59:50 -07002563 r.lastNonConfigurationInstances = lastNonConfigurationInstances;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002564 if (localLOGV) {
2565 ComponentName compname = intent.getComponent();
2566 String name;
2567 if (compname != null) {
2568 name = compname.toShortString();
2569 } else {
2570 name = "(Intent " + intent + ").getComponent() returned null";
2571 }
Dianne Hackborn399cccb2010-04-13 22:57:49 -07002572 Slog.v(TAG, "Performing launch: action=" + intent.getAction()
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002573 + ", comp=" + name
2574 + ", token=" + token);
2575 }
Craig Mautner233ceee2014-05-09 17:05:11 -07002576 return performLaunchActivity(r, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002577 }
2578
2579 public final Activity getActivity(IBinder token) {
2580 return mActivities.get(token).activity;
2581 }
2582
2583 public final void sendActivityResult(
2584 IBinder token, String id, int requestCode,
2585 int resultCode, Intent data) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07002586 if (DEBUG_RESULTS) Slog.v(TAG, "sendActivityResult: id=" + id
Chris Tate8a7dc172009-03-24 20:11:42 -07002587 + " req=" + requestCode + " res=" + resultCode + " data=" + data);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002588 ArrayList<ResultInfo> list = new ArrayList<ResultInfo>();
2589 list.add(new ResultInfo(id, requestCode, resultCode, data));
2590 mAppThread.scheduleSendResult(token, list);
2591 }
2592
Jeff Brown9ef09972013-10-15 20:49:59 -07002593 private void sendMessage(int what, Object obj) {
2594 sendMessage(what, obj, 0, 0, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002595 }
2596
Jeff Brown9ef09972013-10-15 20:49:59 -07002597 private void sendMessage(int what, Object obj, int arg1) {
2598 sendMessage(what, obj, arg1, 0, false);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002599 }
2600
Jeff Brown9ef09972013-10-15 20:49:59 -07002601 private void sendMessage(int what, Object obj, int arg1, int arg2) {
2602 sendMessage(what, obj, arg1, arg2, false);
2603 }
2604
2605 private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
2606 if (DEBUG_MESSAGES) Slog.v(
2607 TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
2608 + ": " + arg1 + " / " + obj);
2609 Message msg = Message.obtain();
2610 msg.what = what;
2611 msg.obj = obj;
2612 msg.arg1 = arg1;
2613 msg.arg2 = arg2;
2614 if (async) {
2615 msg.setAsynchronous(true);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002616 }
Jeff Brown9ef09972013-10-15 20:49:59 -07002617 mH.sendMessage(msg);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002618 }
2619
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07002620 private void sendMessage(int what, Object obj, int arg1, int arg2, int seq) {
2621 if (DEBUG_MESSAGES) Slog.v(
2622 TAG, "SCHEDULE " + mH.codeToString(what) + " arg1=" + arg1 + " arg2=" + arg2 +
2623 "seq= " + seq);
2624 Message msg = Message.obtain();
2625 msg.what = what;
2626 SomeArgs args = SomeArgs.obtain();
2627 args.arg1 = obj;
2628 args.argi1 = arg1;
2629 args.argi2 = arg2;
2630 args.argi3 = seq;
2631 msg.obj = args;
2632 mH.sendMessage(msg);
2633 }
2634
Dianne Hackborn21556372010-02-04 16:34:40 -08002635 final void scheduleContextCleanup(ContextImpl context, String who,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002636 String what) {
2637 ContextCleanupInfo cci = new ContextCleanupInfo();
2638 cci.context = context;
2639 cci.who = who;
2640 cci.what = what;
Jeff Brown9ef09972013-10-15 20:49:59 -07002641 sendMessage(H.CLEAN_UP_CONTEXT, cci);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002642 }
2643
Craig Mautner233ceee2014-05-09 17:05:11 -07002644 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002645 // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");
2646
2647 ActivityInfo aInfo = r.activityInfo;
2648 if (r.packageInfo == null) {
Dianne Hackborne2515ee2011-04-27 18:52:56 -04002649 r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002650 Context.CONTEXT_INCLUDE_CODE);
2651 }
Bob Leee5408332009-09-04 18:31:17 -07002652
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002653 ComponentName component = r.intent.getComponent();
2654 if (component == null) {
2655 component = r.intent.resolveActivity(
2656 mInitialApplication.getPackageManager());
2657 r.intent.setComponent(component);
2658 }
2659
2660 if (r.activityInfo.targetActivity != null) {
2661 component = new ComponentName(r.activityInfo.packageName,
2662 r.activityInfo.targetActivity);
2663 }
2664
Adam Lesinski4e862812016-11-21 16:02:24 -08002665 ContextImpl appContext = createBaseContextForActivity(r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002666 Activity activity = null;
2667 try {
Adam Lesinski4e862812016-11-21 16:02:24 -08002668 java.lang.ClassLoader cl = appContext.getClassLoader();
Jason Monk69457102017-06-06 18:01:31 -04002669 if (appContext.getApplicationContext() instanceof Application) {
2670 activity = ((Application) appContext.getApplicationContext())
2671 .instantiateActivity(cl, component.getClassName(), r.intent);
2672 }
2673 if (activity == null) {
2674 activity = mInstrumentation.newActivity(
2675 cl, component.getClassName(), r.intent);
2676 }
Brad Fitzpatrick5f8b5c12011-01-20 15:12:08 -08002677 StrictMode.incrementExpectedActivityCount(activity.getClass());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002678 r.intent.setExtrasClassLoader(cl);
Nicolas Prevotd1c99b12014-07-04 16:56:17 +01002679 r.intent.prepareToEnterProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002680 if (r.state != null) {
2681 r.state.setClassLoader(cl);
2682 }
2683 } catch (Exception e) {
2684 if (!mInstrumentation.onException(activity, e)) {
2685 throw new RuntimeException(
2686 "Unable to instantiate activity " + component
2687 + ": " + e.toString(), e);
2688 }
2689 }
2690
2691 try {
Dianne Hackborn0be1f782009-11-09 12:30:12 -08002692 Application app = r.packageInfo.makeApplication(false, mInstrumentation);
Bob Leee5408332009-09-04 18:31:17 -07002693
Dianne Hackborn399cccb2010-04-13 22:57:49 -07002694 if (localLOGV) Slog.v(TAG, "Performing launch of " + r);
2695 if (localLOGV) Slog.v(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002696 TAG, r + ": app=" + app
2697 + ", appName=" + app.getPackageName()
2698 + ", pkg=" + r.packageInfo.getPackageName()
2699 + ", comp=" + r.intent.getComponent().toShortString()
2700 + ", dir=" + r.packageInfo.getAppDir());
2701
2702 if (activity != null) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002703 CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
Dianne Hackborn5fd21692011-06-07 14:09:47 -07002704 Configuration config = new Configuration(mCompatConfiguration);
Andrii Kuliand0ad9382016-04-18 20:54:20 -07002705 if (r.overrideConfig != null) {
2706 config.updateFrom(r.overrideConfig);
2707 }
Dianne Hackborn399cccb2010-04-13 22:57:49 -07002708 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
Dianne Hackborndc6b6352009-09-30 14:20:09 -07002709 + r.activityInfo.name + " with config " + config);
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07002710 Window window = null;
2711 if (r.mPendingRemoveWindow != null && r.mPreserveWindow) {
2712 window = r.mPendingRemoveWindow;
2713 r.mPendingRemoveWindow = null;
2714 r.mPendingRemoveWindowManager = null;
2715 }
Adam Lesinski4e862812016-11-21 16:02:24 -08002716 appContext.setOuterContext(activity);
Dianne Hackbornb06ea702009-07-13 13:07:51 -07002717 activity.attach(appContext, this, getInstrumentation(), r.token,
2718 r.ident, app, r.intent, r.activityInfo, title, r.parent,
Craig Mautner233ceee2014-05-09 17:05:11 -07002719 r.embeddedID, r.lastNonConfigurationInstances, config,
Andrii Kulian51c1b672017-04-07 18:39:32 -07002720 r.referrer, r.voiceInteractor, window, r.configCallback);
Bob Leee5408332009-09-04 18:31:17 -07002721
Christopher Tateb70f3df2009-04-07 16:07:59 -07002722 if (customIntent != null) {
2723 activity.mIntent = customIntent;
2724 }
Dianne Hackbornb4bc78b2010-05-12 18:59:50 -07002725 r.lastNonConfigurationInstances = null;
Sudheer Shanka84a48952017-03-08 18:19:01 -08002726 checkAndBlockForNetworkAccess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002727 activity.mStartedActivity = false;
2728 int theme = r.activityInfo.getThemeResource();
2729 if (theme != 0) {
2730 activity.setTheme(theme);
2731 }
2732
2733 activity.mCalled = false;
Craig Mautnera0026042014-04-23 11:45:37 -07002734 if (r.isPersistable()) {
2735 mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
2736 } else {
2737 mInstrumentation.callActivityOnCreate(activity, r.state);
2738 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002739 if (!activity.mCalled) {
2740 throw new SuperNotCalledException(
2741 "Activity " + r.intent.getComponent().toShortString() +
2742 " did not call through to super.onCreate()");
2743 }
2744 r.activity = activity;
2745 r.stopped = true;
2746 if (!r.activity.mFinished) {
2747 activity.performStart();
2748 r.stopped = false;
2749 }
2750 if (!r.activity.mFinished) {
Craig Mautnera0026042014-04-23 11:45:37 -07002751 if (r.isPersistable()) {
2752 if (r.state != null || r.persistentState != null) {
2753 mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
2754 r.persistentState);
2755 }
2756 } else if (r.state != null) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002757 mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
2758 }
2759 }
2760 if (!r.activity.mFinished) {
2761 activity.mCalled = false;
Craig Mautnera0026042014-04-23 11:45:37 -07002762 if (r.isPersistable()) {
2763 mInstrumentation.callActivityOnPostCreate(activity, r.state,
2764 r.persistentState);
2765 } else {
2766 mInstrumentation.callActivityOnPostCreate(activity, r.state);
2767 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002768 if (!activity.mCalled) {
2769 throw new SuperNotCalledException(
2770 "Activity " + r.intent.getComponent().toShortString() +
2771 " did not call through to super.onPostCreate()");
2772 }
2773 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002774 }
2775 r.paused = true;
2776
2777 mActivities.put(r.token, r);
2778
2779 } catch (SuperNotCalledException e) {
2780 throw e;
2781
2782 } catch (Exception e) {
2783 if (!mInstrumentation.onException(activity, e)) {
2784 throw new RuntimeException(
2785 "Unable to start activity " + component
2786 + ": " + e.toString(), e);
2787 }
2788 }
2789
2790 return activity;
2791 }
2792
Sudheer Shanka84a48952017-03-08 18:19:01 -08002793 /**
2794 * Checks if {@link #mNetworkBlockSeq} is {@link #INVALID_PROC_STATE_SEQ} and if so, returns
2795 * immediately. Otherwise, makes a blocking call to ActivityManagerService to wait for the
2796 * network rules to get updated.
2797 */
2798 private void checkAndBlockForNetworkAccess() {
2799 synchronized (mNetworkPolicyLock) {
2800 if (mNetworkBlockSeq != INVALID_PROC_STATE_SEQ) {
2801 try {
2802 ActivityManager.getService().waitForNetworkStateUpdate(mNetworkBlockSeq);
2803 mNetworkBlockSeq = INVALID_PROC_STATE_SEQ;
2804 } catch (RemoteException ignored) {}
2805 }
2806 }
2807 }
2808
Adam Lesinski4e862812016-11-21 16:02:24 -08002809 private ContextImpl createBaseContextForActivity(ActivityClientRecord r) {
2810 final int displayId;
Craig Mautnere0a38842013-12-16 16:14:02 -08002811 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08002812 displayId = ActivityManager.getService().getActivityDisplayId(r.token);
Craig Mautnere0a38842013-12-16 16:14:02 -08002813 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002814 throw e.rethrowFromSystemServer();
Craig Mautnere0a38842013-12-16 16:14:02 -08002815 }
Jeff Brownefd43bd2012-09-21 17:02:35 -07002816
Wale Ogunwale7c726682015-02-06 17:34:28 -08002817 ContextImpl appContext = ContextImpl.createActivityContext(
Adam Lesinski4e862812016-11-21 16:02:24 -08002818 this, r.packageInfo, r.activityInfo, r.token, displayId, r.overrideConfig);
Wale Ogunwale7c726682015-02-06 17:34:28 -08002819
2820 final DisplayManagerGlobal dm = DisplayManagerGlobal.getInstance();
Jeff Brownefd43bd2012-09-21 17:02:35 -07002821 // For debugging purposes, if the activity's package name contains the value of
2822 // the "debug.use-second-display" system property as a substring, then show
2823 // its content on a secondary display if there is one.
Jeff Brownefd43bd2012-09-21 17:02:35 -07002824 String pkgName = SystemProperties.get("debug.second-display.pkg");
2825 if (pkgName != null && !pkgName.isEmpty()
2826 && r.packageInfo.mPackageName.contains(pkgName)) {
Wale Ogunwale7c726682015-02-06 17:34:28 -08002827 for (int id : dm.getDisplayIds()) {
2828 if (id != Display.DEFAULT_DISPLAY) {
Wale Ogunwale26698512015-06-05 16:55:33 -07002829 Display display =
Bryce Lee609bf652017-02-09 16:50:13 -08002830 dm.getCompatibleDisplay(id, appContext.getResources());
Adam Lesinski4e862812016-11-21 16:02:24 -08002831 appContext = (ContextImpl) appContext.createDisplayContext(display);
Jeff Brownefd43bd2012-09-21 17:02:35 -07002832 break;
2833 }
2834 }
2835 }
Adam Lesinski4e862812016-11-21 16:02:24 -08002836 return appContext;
Jeff Brownefd43bd2012-09-21 17:02:35 -07002837 }
2838
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08002839 private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002840 // If we are getting ready to gc after going to the background, well
2841 // we are back active so skip it.
2842 unscheduleGcIdler();
Dianne Hackborn89ad4562014-08-24 16:45:38 -07002843 mSomeActivitiesChanged = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002844
Jeff Hao1b012d32014-08-20 10:35:34 -07002845 if (r.profilerInfo != null) {
2846 mProfiler.setProfiler(r.profilerInfo);
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07002847 mProfiler.startProfiling();
Dianne Hackborn62f20ec2011-08-15 17:40:28 -07002848 }
2849
Dianne Hackborn58f42a52011-10-10 13:46:34 -07002850 // Make sure we are running with the most recent config.
2851 handleConfigurationChanged(null, null);
2852
Dianne Hackborn399cccb2010-04-13 22:57:49 -07002853 if (localLOGV) Slog.v(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002854 TAG, "Handling launch of " + r);
Adam Powellcfbe9be2013-11-06 14:58:58 -08002855
Chet Haase0d1c27a2014-11-03 18:35:16 +00002856 // Initialize before creating the activity
Jesse Hallc37984f2017-05-23 16:55:08 -07002857 if (!ThreadedRenderer.sRendererDisabled) {
2858 GraphicsEnvironment.earlyInitEGL();
2859 }
Chet Haase0d1c27a2014-11-03 18:35:16 +00002860 WindowManagerGlobal.initialize();
2861
Craig Mautner233ceee2014-05-09 17:05:11 -07002862 Activity a = performLaunchActivity(r, customIntent);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002863
2864 if (a != null) {
Dianne Hackborn871ecdc2009-12-11 15:24:33 -08002865 r.createdConfig = new Configuration(mConfiguration);
Filip Gruszczynski23493322015-07-29 17:02:59 -07002866 reportSizeConfigurations(r);
Dianne Hackborn9e0f5d92010-02-22 15:05:42 -08002867 Bundle oldState = r.state;
Craig Mautner233ceee2014-05-09 17:05:11 -07002868 handleResumeActivity(r.token, false, r.isForward,
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08002869 !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002870
2871 if (!r.activity.mFinished && r.startsNotResumed) {
Wale Ogunwale5dc6d652016-05-04 10:24:33 -07002872 // The activity manager actually wants this one to start out paused, because it
2873 // needs to be visible but isn't in the foreground. We accomplish this by going
2874 // through the normal startup (because activities expect to go through onResume()
2875 // the first time they run, before their window is displayed), and then pausing it.
2876 // However, in this case we do -not- need to do the full pause cycle (of freezing
2877 // and such) because the activity manager assumes it can just retain the current
2878 // state it has.
2879 performPauseActivityIfNeeded(r, reason);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002880
Wale Ogunwale5dc6d652016-05-04 10:24:33 -07002881 // We need to keep around the original state, in case we need to be created again.
2882 // But we only do this for pre-Honeycomb apps, which always save their state when
2883 // pausing, so we can not have them save their state when restarting from a paused
2884 // state. For HC and later, we want to (and can) let the state be saved as the
2885 // normal part of stopping the activity.
2886 if (r.isPreHoneycomb()) {
2887 r.state = oldState;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002888 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002889 }
2890 } else {
Wale Ogunwale5dc6d652016-05-04 10:24:33 -07002891 // If there was an error, for any reason, tell the activity manager to stop us.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002892 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08002893 ActivityManager.getService()
Wale Ogunwaleba7881c2015-08-01 19:28:29 -07002894 .finishActivity(r.token, Activity.RESULT_CANCELED, null,
2895 Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002896 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002897 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002898 }
2899 }
2900 }
2901
Filip Gruszczynski23493322015-07-29 17:02:59 -07002902 private void reportSizeConfigurations(ActivityClientRecord r) {
2903 Configuration[] configurations = r.activity.getResources().getSizeConfigurations();
2904 if (configurations == null) {
2905 return;
2906 }
Filip Gruszczynski20aa0ae2015-10-30 10:08:27 -07002907 SparseIntArray horizontal = new SparseIntArray();
2908 SparseIntArray vertical = new SparseIntArray();
2909 SparseIntArray smallest = new SparseIntArray();
Filip Gruszczynski23493322015-07-29 17:02:59 -07002910 for (int i = configurations.length - 1; i >= 0; i--) {
2911 Configuration config = configurations[i];
2912 if (config.screenHeightDp != Configuration.SCREEN_HEIGHT_DP_UNDEFINED) {
Filip Gruszczynski20aa0ae2015-10-30 10:08:27 -07002913 vertical.put(config.screenHeightDp, 0);
Filip Gruszczynski23493322015-07-29 17:02:59 -07002914 }
2915 if (config.screenWidthDp != Configuration.SCREEN_WIDTH_DP_UNDEFINED) {
Filip Gruszczynski20aa0ae2015-10-30 10:08:27 -07002916 horizontal.put(config.screenWidthDp, 0);
Filip Gruszczynski23493322015-07-29 17:02:59 -07002917 }
2918 if (config.smallestScreenWidthDp != Configuration.SMALLEST_SCREEN_WIDTH_DP_UNDEFINED) {
Filip Gruszczynski20aa0ae2015-10-30 10:08:27 -07002919 smallest.put(config.smallestScreenWidthDp, 0);
Filip Gruszczynski23493322015-07-29 17:02:59 -07002920 }
2921 }
Filip Gruszczynski23493322015-07-29 17:02:59 -07002922 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08002923 ActivityManager.getService().reportSizeConfigurations(r.token,
Filip Gruszczynski20aa0ae2015-10-30 10:08:27 -07002924 horizontal.copyKeys(), vertical.copyKeys(), smallest.copyKeys());
Filip Gruszczynski23493322015-07-29 17:02:59 -07002925 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07002926 throw ex.rethrowFromSystemServer();
Filip Gruszczynski23493322015-07-29 17:02:59 -07002927 }
2928
2929 }
2930
Dianne Hackborn85d558c2014-11-04 10:31:54 -08002931 private void deliverNewIntents(ActivityClientRecord r, List<ReferrerIntent> intents) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002932 final int N = intents.size();
2933 for (int i=0; i<N; i++) {
Dianne Hackborna01a0fa2014-12-02 10:33:14 -08002934 ReferrerIntent intent = intents.get(i);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002935 intent.setExtrasClassLoader(r.activity.getClassLoader());
Nicolas Prevotd1c99b12014-07-04 16:56:17 +01002936 intent.prepareToEnterProcess();
Dianne Hackbornfb3cffe2010-10-25 17:08:56 -07002937 r.activity.mFragments.noteStateNotSaved();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002938 mInstrumentation.callActivityOnNewIntent(r.activity, intent);
2939 }
2940 }
2941
Wale Ogunwale826c7062016-09-13 08:25:54 -07002942 void performNewIntents(IBinder token, List<ReferrerIntent> intents, boolean andPause) {
2943 final ActivityClientRecord r = mActivities.get(token);
2944 if (r == null) {
2945 return;
2946 }
2947
2948 final boolean resumed = !r.paused;
2949 if (resumed) {
2950 r.activity.mTemporaryPause = true;
2951 mInstrumentation.callActivityOnPause(r.activity);
2952 }
Sudheer Shanka43b5ea42017-06-21 11:24:53 -07002953 checkAndBlockForNetworkAccess();
Wale Ogunwale826c7062016-09-13 08:25:54 -07002954 deliverNewIntents(r, intents);
2955 if (resumed) {
2956 r.activity.performResume();
2957 r.activity.mTemporaryPause = false;
2958 }
2959
2960 if (r.paused && andPause) {
2961 // In this case the activity was in the paused state when we delivered the intent,
2962 // to guarantee onResume gets called after onNewIntent we temporarily resume the
2963 // activity and pause again as the caller wanted.
2964 performResumeActivity(token, false, "performNewIntents");
2965 performPauseActivityIfNeeded(r, "performNewIntents");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002966 }
2967 }
Bob Leee5408332009-09-04 18:31:17 -07002968
Romain Guy65b345f2011-07-27 18:51:50 -07002969 private void handleNewIntent(NewIntentData data) {
Wale Ogunwale826c7062016-09-13 08:25:54 -07002970 performNewIntents(data.token, data.intents, data.andPause);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08002971 }
2972
Adam Skorydfc7fd72013-08-05 19:23:41 -07002973 public void handleRequestAssistContextExtras(RequestAssistContextExtras cmd) {
Felipe Leme640f30a2017-03-06 15:44:06 -08002974 // Filling for autofill has a few differences:
Felipe Leme1ca634a2016-11-28 17:21:21 -08002975 // - it does not need an AssistContent
2976 // - it does not call onProvideAssistData()
2977 // - it needs an IAutoFillCallback
Felipe Leme640f30a2017-03-06 15:44:06 -08002978 boolean forAutofill = cmd.requestType == ActivityManager.ASSIST_CONTEXT_AUTOFILL;
Felipe Leme1ca634a2016-11-28 17:21:21 -08002979
Felipe Leme85d1c2d2017-04-21 08:56:04 -07002980 // TODO: decide if lastSessionId logic applies to autofill sessions
Amith Yamasani4f128e42016-05-10 11:44:12 -07002981 if (mLastSessionId != cmd.sessionId) {
2982 // Clear the existing structures
2983 mLastSessionId = cmd.sessionId;
2984 for (int i = mLastAssistStructures.size() - 1; i >= 0; i--) {
2985 AssistStructure structure = mLastAssistStructures.get(i).get();
2986 if (structure != null) {
2987 structure.clearSendChannel();
2988 }
2989 mLastAssistStructures.remove(i);
Dianne Hackborn782d4982015-07-08 17:36:37 -07002990 }
2991 }
Felipe Leme29a5b0d2016-10-25 14:57:11 -07002992
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08002993 Bundle data = new Bundle();
Dianne Hackborn09d57fe2015-05-27 18:05:52 -07002994 AssistStructure structure = null;
Felipe Leme640f30a2017-03-06 15:44:06 -08002995 AssistContent content = forAutofill ? null : new AssistContent();
Amith Yamasani858f98d2017-02-22 12:59:53 -08002996 final long startTime = SystemClock.uptimeMillis();
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08002997 ActivityClientRecord r = mActivities.get(cmd.activityToken);
Dianne Hackborna3acdb32015-06-08 17:07:40 -07002998 Uri referrer = null;
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08002999 if (r != null) {
Felipe Leme640f30a2017-03-06 15:44:06 -08003000 if (!forAutofill) {
Felipe Leme1ca634a2016-11-28 17:21:21 -08003001 r.activity.getApplication().dispatchOnProvideAssistData(r.activity, data);
Felipe Leme29a5b0d2016-10-25 14:57:11 -07003002 r.activity.onProvideAssistData(data);
Felipe Leme6d553872016-12-08 17:13:25 -08003003 referrer = r.activity.onProvideReferrer();
Felipe Leme29a5b0d2016-10-25 14:57:11 -07003004 }
Felipe Leme640f30a2017-03-06 15:44:06 -08003005 if (cmd.requestType == ActivityManager.ASSIST_CONTEXT_FULL || forAutofill) {
Svet Ganovfd31f852017-04-26 15:54:27 -07003006 structure = new AssistStructure(r.activity, forAutofill, cmd.flags);
Adam Skory4aaed142015-04-22 11:29:31 -06003007 Intent activityIntent = r.activity.getIntent();
Felipe Leme6d553872016-12-08 17:13:25 -08003008 boolean notSecure = r.window == null ||
Dianne Hackborn09d57fe2015-05-27 18:05:52 -07003009 (r.window.getAttributes().flags
Felipe Leme6d553872016-12-08 17:13:25 -08003010 & WindowManager.LayoutParams.FLAG_SECURE) == 0;
3011 if (activityIntent != null && notSecure) {
Felipe Leme640f30a2017-03-06 15:44:06 -08003012 if (!forAutofill) {
Felipe Leme1ca634a2016-11-28 17:21:21 -08003013 Intent intent = new Intent(activityIntent);
3014 intent.setFlags(intent.getFlags() & ~(Intent.FLAG_GRANT_WRITE_URI_PERMISSION
3015 | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION));
3016 intent.removeUnsafeExtras();
Felipe Leme29a5b0d2016-10-25 14:57:11 -07003017 content.setDefaultIntent(intent);
3018 }
Adam Skory4aaed142015-04-22 11:29:31 -06003019 } else {
Felipe Leme640f30a2017-03-06 15:44:06 -08003020 if (!forAutofill) {
Felipe Leme29a5b0d2016-10-25 14:57:11 -07003021 content.setDefaultIntent(new Intent());
3022 }
Adam Skory4aaed142015-04-22 11:29:31 -06003023 }
Felipe Leme640f30a2017-03-06 15:44:06 -08003024 if (!forAutofill) {
Felipe Leme29a5b0d2016-10-25 14:57:11 -07003025 r.activity.onProvideAssistContent(content);
3026 }
Dianne Hackborna83ce1d2015-03-11 15:16:13 -07003027 }
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08003028 }
Dianne Hackborn09d57fe2015-05-27 18:05:52 -07003029 if (structure == null) {
3030 structure = new AssistStructure();
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08003031 }
Felipe Leme0200d9e2017-01-24 15:10:26 -08003032
Felipe Leme85d1c2d2017-04-21 08:56:04 -07003033 // TODO: decide if lastSessionId logic applies to autofill sessions
Amith Yamasani858f98d2017-02-22 12:59:53 -08003034
3035 structure.setAcquisitionStartTime(startTime);
3036 structure.setAcquisitionEndTime(SystemClock.uptimeMillis());
3037
Amith Yamasani4f128e42016-05-10 11:44:12 -07003038 mLastAssistStructures.add(new WeakReference<>(structure));
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003039 IActivityManager mgr = ActivityManager.getService();
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08003040 try {
Dianne Hackborna3acdb32015-06-08 17:07:40 -07003041 mgr.reportAssistContextExtras(cmd.requestToken, data, structure, content, referrer);
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08003042 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003043 throw e.rethrowFromSystemServer();
Dianne Hackbornf9c5e0f2013-01-23 14:39:13 -08003044 }
3045 }
Craig Mautner5eda9b32013-07-02 11:58:16 -07003046
3047 public void handleTranslucentConversionComplete(IBinder token, boolean drawComplete) {
3048 ActivityClientRecord r = mActivities.get(token);
3049 if (r != null) {
3050 r.activity.onTranslucentConversionComplete(drawComplete);
3051 }
3052 }
3053
Craig Mautnereb8abf72014-07-02 15:04:09 -07003054 public void onNewActivityOptions(IBinder token, ActivityOptions options) {
3055 ActivityClientRecord r = mActivities.get(token);
3056 if (r != null) {
3057 r.activity.onNewActivityOptions(options);
3058 }
3059 }
3060
Jeff Sharkeydd97f422013-10-08 17:01:30 -07003061 public void handleInstallProvider(ProviderInfo info) {
Jeff Sharkeybb2e2ca2014-10-23 11:42:31 -07003062 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
3063 try {
Jeff Sharkeya6bfeae2017-07-05 16:50:24 -06003064 installContentProviders(mInitialApplication, Arrays.asList(info));
Jeff Sharkeybb2e2ca2014-10-23 11:42:31 -07003065 } finally {
3066 StrictMode.setThreadPolicy(oldPolicy);
3067 }
Jeff Sharkeydd97f422013-10-08 17:01:30 -07003068 }
3069
Craig Mautner8746a472014-07-24 15:12:54 -07003070 private void handleEnterAnimationComplete(IBinder token) {
3071 ActivityClientRecord r = mActivities.get(token);
3072 if (r != null) {
Filip Gruszczynski6eafa902014-11-14 14:24:37 -08003073 r.activity.dispatchEnterAnimationComplete();
Craig Mautner8746a472014-07-24 15:12:54 -07003074 }
3075 }
3076
Rahul Chaturvedi52613f92015-06-17 23:54:08 -04003077 private void handleStartBinderTracking() {
3078 Binder.enableTracing();
3079 }
3080
3081 private void handleStopBinderTrackingAndDump(ParcelFileDescriptor fd) {
3082 try {
3083 Binder.disableTracing();
3084 Binder.getTransactionTracker().writeTracesToFile(fd);
3085 } finally {
3086 IoUtils.closeQuietly(fd);
3087 Binder.getTransactionTracker().clearTraces();
3088 }
3089 }
3090
Winson Chung5af42fc2017-03-24 17:11:33 -07003091 private void handleMultiWindowModeChanged(IBinder token, boolean isInMultiWindowMode,
3092 Configuration overrideConfig) {
Wale Ogunwale5f986092015-12-04 15:35:38 -08003093 final ActivityClientRecord r = mActivities.get(token);
3094 if (r != null) {
Winson Chung5af42fc2017-03-24 17:11:33 -07003095 final Configuration newConfig = new Configuration(mConfiguration);
3096 if (overrideConfig != null) {
3097 newConfig.updateFrom(overrideConfig);
3098 }
3099 r.activity.dispatchMultiWindowModeChanged(isInMultiWindowMode, newConfig);
Wale Ogunwale5f986092015-12-04 15:35:38 -08003100 }
3101 }
3102
Winson Chung5af42fc2017-03-24 17:11:33 -07003103 private void handlePictureInPictureModeChanged(IBinder token, boolean isInPipMode,
3104 Configuration overrideConfig) {
Wale Ogunwale5f986092015-12-04 15:35:38 -08003105 final ActivityClientRecord r = mActivities.get(token);
3106 if (r != null) {
Winson Chung5af42fc2017-03-24 17:11:33 -07003107 final Configuration newConfig = new Configuration(mConfiguration);
3108 if (overrideConfig != null) {
3109 newConfig.updateFrom(overrideConfig);
3110 }
3111 r.activity.dispatchPictureInPictureModeChanged(isInPipMode, newConfig);
Wale Ogunwale5f986092015-12-04 15:35:38 -08003112 }
3113 }
3114
Amith Yamasani0af6fa72016-01-17 15:36:19 -08003115 private void handleLocalVoiceInteractionStarted(IBinder token, IVoiceInteractor interactor) {
3116 final ActivityClientRecord r = mActivities.get(token);
3117 if (r != null) {
3118 r.voiceInteractor = interactor;
3119 r.activity.setVoiceInteractor(interactor);
3120 if (interactor == null) {
3121 r.activity.onLocalVoiceInteractionStopped();
3122 } else {
3123 r.activity.onLocalVoiceInteractionStarted();
3124 }
3125 }
3126 }
3127
Leonard Mosescuf3409ce2016-10-06 17:32:05 -07003128 static final void handleAttachAgent(String agent) {
3129 try {
3130 VMDebug.attachAgent(agent);
3131 } catch (IOException e) {
3132 Slog.e(TAG, "Attaching agent failed: " + agent);
3133 }
3134 }
3135
Brad Fitzpatrickbfb19192010-10-29 15:25:44 -07003136 private static final ThreadLocal<Intent> sCurrentBroadcastIntent = new ThreadLocal<Intent>();
3137
3138 /**
3139 * Return the Intent that's currently being handled by a
3140 * BroadcastReceiver on this thread, or null if none.
3141 * @hide
3142 */
3143 public static Intent getIntentBeingBroadcast() {
3144 return sCurrentBroadcastIntent.get();
3145 }
3146
Romain Guy65b345f2011-07-27 18:51:50 -07003147 private void handleReceiver(ReceiverData data) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003148 // If we are getting ready to gc after going to the background, well
3149 // we are back active so skip it.
3150 unscheduleGcIdler();
3151
3152 String component = data.intent.getComponent().getClassName();
3153
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07003154 LoadedApk packageInfo = getPackageInfoNoCheck(
Dianne Hackborne2515ee2011-04-27 18:52:56 -04003155 data.info.applicationInfo, data.compatInfo);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003156
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003157 IActivityManager mgr = ActivityManager.getService();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003158
Adam Lesinski4e862812016-11-21 16:02:24 -08003159 Application app;
Romain Guy65b345f2011-07-27 18:51:50 -07003160 BroadcastReceiver receiver;
Adam Lesinski4e862812016-11-21 16:02:24 -08003161 ContextImpl context;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003162 try {
Adam Lesinski4e862812016-11-21 16:02:24 -08003163 app = packageInfo.makeApplication(false, mInstrumentation);
3164 context = (ContextImpl) app.getBaseContext();
3165 if (data.info.splitName != null) {
3166 context = (ContextImpl) context.createContextForSplit(data.info.splitName);
3167 }
3168 java.lang.ClassLoader cl = context.getClassLoader();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003169 data.intent.setExtrasClassLoader(cl);
Nicolas Prevotd1c99b12014-07-04 16:56:17 +01003170 data.intent.prepareToEnterProcess();
Dianne Hackborne829fef2010-10-26 17:44:01 -07003171 data.setExtrasClassLoader(cl);
Jason Monk69457102017-06-06 18:01:31 -04003172 receiver = instantiate(cl, component, data.intent, app,
3173 Application::instantiateReceiver);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003174 } catch (Exception e) {
Dianne Hackborne829fef2010-10-26 17:44:01 -07003175 if (DEBUG_BROADCAST) Slog.i(TAG,
3176 "Finishing failed broadcast to " + data.intent.getComponent());
3177 data.sendFinished(mgr);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003178 throw new RuntimeException(
3179 "Unable to instantiate receiver " + component
3180 + ": " + e.toString(), e);
3181 }
3182
3183 try {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003184 if (localLOGV) Slog.v(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003185 TAG, "Performing receive of " + data.intent
3186 + ": app=" + app
3187 + ", appName=" + app.getPackageName()
3188 + ", pkg=" + packageInfo.getPackageName()
3189 + ", comp=" + data.intent.getComponent().toShortString()
3190 + ", dir=" + packageInfo.getAppDir());
3191
Brad Fitzpatrickbfb19192010-10-29 15:25:44 -07003192 sCurrentBroadcastIntent.set(data.intent);
Dianne Hackborne829fef2010-10-26 17:44:01 -07003193 receiver.setPendingResult(data);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003194 receiver.onReceive(context.getReceiverRestrictedContext(),
3195 data.intent);
3196 } catch (Exception e) {
Dianne Hackborne829fef2010-10-26 17:44:01 -07003197 if (DEBUG_BROADCAST) Slog.i(TAG,
3198 "Finishing failed broadcast to " + data.intent.getComponent());
3199 data.sendFinished(mgr);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003200 if (!mInstrumentation.onException(receiver, e)) {
3201 throw new RuntimeException(
3202 "Unable to start receiver " + component
3203 + ": " + e.toString(), e);
3204 }
Brad Fitzpatrickbfb19192010-10-29 15:25:44 -07003205 } finally {
3206 sCurrentBroadcastIntent.set(null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003207 }
3208
Dianne Hackborne829fef2010-10-26 17:44:01 -07003209 if (receiver.getPendingResult() != null) {
3210 data.finish();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003211 }
3212 }
3213
Christopher Tate181fafa2009-05-14 11:12:14 -07003214 // Instantiate a BackupAgent and tell it that it's alive
Romain Guy65b345f2011-07-27 18:51:50 -07003215 private void handleCreateBackupAgent(CreateBackupAgentData data) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003216 if (DEBUG_BACKUP) Slog.v(TAG, "handleCreateBackupAgent: " + data);
Christopher Tate181fafa2009-05-14 11:12:14 -07003217
Christopher Tate346acb12012-10-15 19:20:25 -07003218 // Sanity check the requested target package's uid against ours
3219 try {
3220 PackageInfo requestedPackage = getPackageManager().getPackageInfo(
3221 data.appInfo.packageName, 0, UserHandle.myUserId());
3222 if (requestedPackage.applicationInfo.uid != Process.myUid()) {
3223 Slog.w(TAG, "Asked to instantiate non-matching package "
3224 + data.appInfo.packageName);
3225 return;
3226 }
3227 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003228 throw e.rethrowFromSystemServer();
Christopher Tate346acb12012-10-15 19:20:25 -07003229 }
3230
Christopher Tate181fafa2009-05-14 11:12:14 -07003231 // no longer idle; we have backup work to do
3232 unscheduleGcIdler();
3233
3234 // instantiate the BackupAgent class named in the manifest
Dianne Hackborne2515ee2011-04-27 18:52:56 -04003235 LoadedApk packageInfo = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
Christopher Tate181fafa2009-05-14 11:12:14 -07003236 String packageName = packageInfo.mPackageName;
Christopher Tate346acb12012-10-15 19:20:25 -07003237 if (packageName == null) {
3238 Slog.d(TAG, "Asked to create backup agent for nonexistent package");
3239 return;
3240 }
3241
Christopher Tate181fafa2009-05-14 11:12:14 -07003242 String classname = data.appInfo.backupAgentName;
Christopher Tate79ec80d2011-06-24 14:58:49 -07003243 // full backup operation but no app-supplied agent? use the default implementation
Sudheer Shankacc6418f2016-10-13 12:03:44 -07003244 if (classname == null && (data.backupMode == ApplicationThreadConstants.BACKUP_MODE_FULL
3245 || data.backupMode == ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL)) {
Christopher Tate4a627c72011-04-01 14:43:32 -07003246 classname = "android.app.backup.FullBackupAgent";
Christopher Tate181fafa2009-05-14 11:12:14 -07003247 }
Christopher Tate4a627c72011-04-01 14:43:32 -07003248
Christopher Tate181fafa2009-05-14 11:12:14 -07003249 try {
Christopher Tated1475e02009-07-09 15:36:17 -07003250 IBinder binder = null;
Christopher Tate2e40d112014-07-15 12:37:38 -07003251 BackupAgent agent = mBackupAgents.get(packageName);
3252 if (agent != null) {
3253 // reusing the existing instance
3254 if (DEBUG_BACKUP) {
3255 Slog.v(TAG, "Reusing existing agent instance");
Christopher Tated1475e02009-07-09 15:36:17 -07003256 }
Christopher Tate2e40d112014-07-15 12:37:38 -07003257 binder = agent.onBind();
3258 } else {
3259 try {
3260 if (DEBUG_BACKUP) Slog.v(TAG, "Initializing agent class " + classname);
Jason Monk69457102017-06-06 18:01:31 -04003261 ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
Christopher Tate2e40d112014-07-15 12:37:38 -07003262
3263 java.lang.ClassLoader cl = packageInfo.getClassLoader();
Jason Monk69457102017-06-06 18:01:31 -04003264 agent = instantiate(cl, classname, context,
3265 Application::instantiateBackupAgent);
Christopher Tate2e40d112014-07-15 12:37:38 -07003266
3267 // set up the agent's context
Christopher Tate2e40d112014-07-15 12:37:38 -07003268 context.setOuterContext(agent);
3269 agent.attach(context);
3270
3271 agent.onCreate();
3272 binder = agent.onBind();
3273 mBackupAgents.put(packageName, agent);
3274 } catch (Exception e) {
3275 // If this is during restore, fail silently; otherwise go
3276 // ahead and let the user see the crash.
3277 Slog.e(TAG, "Agent threw during creation: " + e);
Sudheer Shankacc6418f2016-10-13 12:03:44 -07003278 if (data.backupMode != ApplicationThreadConstants.BACKUP_MODE_RESTORE
3279 && data.backupMode !=
3280 ApplicationThreadConstants.BACKUP_MODE_RESTORE_FULL) {
Christopher Tate2e40d112014-07-15 12:37:38 -07003281 throw e;
3282 }
3283 // falling through with 'binder' still null
3284 }
Christopher Tated1475e02009-07-09 15:36:17 -07003285 }
Christopher Tate181fafa2009-05-14 11:12:14 -07003286
3287 // tell the OS that we're live now
Christopher Tate181fafa2009-05-14 11:12:14 -07003288 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003289 ActivityManager.getService().backupAgentCreated(packageName, binder);
Christopher Tate181fafa2009-05-14 11:12:14 -07003290 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003291 throw e.rethrowFromSystemServer();
Christopher Tate181fafa2009-05-14 11:12:14 -07003292 }
Christopher Tate181fafa2009-05-14 11:12:14 -07003293 } catch (Exception e) {
3294 throw new RuntimeException("Unable to create BackupAgent "
Christopher Tate4a627c72011-04-01 14:43:32 -07003295 + classname + ": " + e.toString(), e);
Christopher Tate181fafa2009-05-14 11:12:14 -07003296 }
3297 }
3298
3299 // Tear down a BackupAgent
Romain Guy65b345f2011-07-27 18:51:50 -07003300 private void handleDestroyBackupAgent(CreateBackupAgentData data) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003301 if (DEBUG_BACKUP) Slog.v(TAG, "handleDestroyBackupAgent: " + data);
Bob Leee5408332009-09-04 18:31:17 -07003302
Dianne Hackborne2515ee2011-04-27 18:52:56 -04003303 LoadedApk packageInfo = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
Christopher Tate181fafa2009-05-14 11:12:14 -07003304 String packageName = packageInfo.mPackageName;
3305 BackupAgent agent = mBackupAgents.get(packageName);
3306 if (agent != null) {
3307 try {
3308 agent.onDestroy();
3309 } catch (Exception e) {
Dianne Hackbornc9421ba2010-03-11 22:23:46 -08003310 Slog.w(TAG, "Exception thrown in onDestroy by backup agent of " + data.appInfo);
Christopher Tate181fafa2009-05-14 11:12:14 -07003311 e.printStackTrace();
3312 }
3313 mBackupAgents.remove(packageName);
3314 } else {
Dianne Hackbornc9421ba2010-03-11 22:23:46 -08003315 Slog.w(TAG, "Attempt to destroy unknown backup agent " + data);
Christopher Tate181fafa2009-05-14 11:12:14 -07003316 }
3317 }
3318
Romain Guy65b345f2011-07-27 18:51:50 -07003319 private void handleCreateService(CreateServiceData data) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003320 // If we are getting ready to gc after going to the background, well
3321 // we are back active so skip it.
3322 unscheduleGcIdler();
3323
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07003324 LoadedApk packageInfo = getPackageInfoNoCheck(
Dianne Hackborne2515ee2011-04-27 18:52:56 -04003325 data.info.applicationInfo, data.compatInfo);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003326 Service service = null;
Jason Monk69457102017-06-06 18:01:31 -04003327 Application app = null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003328 try {
Jason Monk69457102017-06-06 18:01:31 -04003329 app = packageInfo.makeApplication(false, mInstrumentation);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003330 java.lang.ClassLoader cl = packageInfo.getClassLoader();
Jason Monk69457102017-06-06 18:01:31 -04003331 service = instantiate(cl, data.info.name, data.intent, app,
3332 Application::instantiateService);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003333 } catch (Exception e) {
3334 if (!mInstrumentation.onException(service, e)) {
3335 throw new RuntimeException(
3336 "Unable to instantiate service " + data.info.name
3337 + ": " + e.toString(), e);
3338 }
3339 }
3340
3341 try {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003342 if (localLOGV) Slog.v(TAG, "Creating service " + data.info.name);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003343
Jeff Browndefd4a62014-03-10 21:24:37 -07003344 ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
3345 context.setOuterContext(service);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003346
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003347 service.attach(context, this, data.info.name, data.token, app,
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003348 ActivityManager.getService());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003349 service.onCreate();
3350 mServices.put(data.token, service);
3351 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003352 ActivityManager.getService().serviceDoneExecuting(
Dianne Hackborn455625e2015-01-21 09:55:13 -08003353 data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003354 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003355 throw e.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003356 }
3357 } catch (Exception e) {
3358 if (!mInstrumentation.onException(service, e)) {
3359 throw new RuntimeException(
3360 "Unable to create service " + data.info.name
3361 + ": " + e.toString(), e);
3362 }
3363 }
3364 }
3365
Romain Guy65b345f2011-07-27 18:51:50 -07003366 private void handleBindService(BindServiceData data) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003367 Service s = mServices.get(data.token);
Amith Yamasani742a6712011-05-04 14:49:28 -07003368 if (DEBUG_SERVICE)
3369 Slog.v(TAG, "handleBindService s=" + s + " rebind=" + data.rebind);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003370 if (s != null) {
3371 try {
3372 data.intent.setExtrasClassLoader(s.getClassLoader());
Nicolas Prevotd1c99b12014-07-04 16:56:17 +01003373 data.intent.prepareToEnterProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003374 try {
3375 if (!data.rebind) {
3376 IBinder binder = s.onBind(data.intent);
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003377 ActivityManager.getService().publishService(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003378 data.token, data.intent, binder);
3379 } else {
3380 s.onRebind(data.intent);
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003381 ActivityManager.getService().serviceDoneExecuting(
Dianne Hackborn455625e2015-01-21 09:55:13 -08003382 data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003383 }
Dianne Hackborn2a9094d2010-02-03 19:20:09 -08003384 ensureJitEnabled();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003385 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003386 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003387 }
3388 } catch (Exception e) {
3389 if (!mInstrumentation.onException(s, e)) {
3390 throw new RuntimeException(
3391 "Unable to bind to service " + s
3392 + " with " + data.intent + ": " + e.toString(), e);
3393 }
3394 }
3395 }
3396 }
3397
Romain Guy65b345f2011-07-27 18:51:50 -07003398 private void handleUnbindService(BindServiceData data) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003399 Service s = mServices.get(data.token);
3400 if (s != null) {
3401 try {
3402 data.intent.setExtrasClassLoader(s.getClassLoader());
Nicolas Prevotd1c99b12014-07-04 16:56:17 +01003403 data.intent.prepareToEnterProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003404 boolean doRebind = s.onUnbind(data.intent);
3405 try {
3406 if (doRebind) {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003407 ActivityManager.getService().unbindFinished(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003408 data.token, data.intent, doRebind);
3409 } else {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003410 ActivityManager.getService().serviceDoneExecuting(
Dianne Hackborn455625e2015-01-21 09:55:13 -08003411 data.token, SERVICE_DONE_EXECUTING_ANON, 0, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003412 }
3413 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003414 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003415 }
3416 } catch (Exception e) {
3417 if (!mInstrumentation.onException(s, e)) {
3418 throw new RuntimeException(
3419 "Unable to unbind to service " + s
3420 + " with " + data.intent + ": " + e.toString(), e);
3421 }
3422 }
3423 }
3424 }
3425
Dianne Hackborn625ac272010-09-17 18:29:22 -07003426 private void handleDumpService(DumpComponentInfo info) {
Jeff Sharkeye861b422012-03-01 20:59:22 -08003427 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
3428 try {
3429 Service s = mServices.get(info.token);
3430 if (s != null) {
Dianne Hackborn8c841092013-06-24 13:46:13 -07003431 PrintWriter pw = new FastPrintWriter(new FileOutputStream(
3432 info.fd.getFileDescriptor()));
Jeff Sharkeye861b422012-03-01 20:59:22 -08003433 s.dump(info.fd.getFileDescriptor(), pw, info.args);
3434 pw.flush();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003435 }
Jeff Sharkeye861b422012-03-01 20:59:22 -08003436 } finally {
3437 IoUtils.closeQuietly(info.fd);
3438 StrictMode.setThreadPolicy(oldPolicy);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003439 }
3440 }
3441
Dianne Hackborn625ac272010-09-17 18:29:22 -07003442 private void handleDumpActivity(DumpComponentInfo info) {
Jeff Sharkeye861b422012-03-01 20:59:22 -08003443 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
3444 try {
3445 ActivityClientRecord r = mActivities.get(info.token);
3446 if (r != null && r.activity != null) {
Dianne Hackborn8c841092013-06-24 13:46:13 -07003447 PrintWriter pw = new FastPrintWriter(new FileOutputStream(
3448 info.fd.getFileDescriptor()));
Jeff Sharkeye861b422012-03-01 20:59:22 -08003449 r.activity.dump(info.prefix, info.fd.getFileDescriptor(), pw, info.args);
3450 pw.flush();
Dianne Hackborn625ac272010-09-17 18:29:22 -07003451 }
Jeff Sharkeye861b422012-03-01 20:59:22 -08003452 } finally {
3453 IoUtils.closeQuietly(info.fd);
3454 StrictMode.setThreadPolicy(oldPolicy);
Dianne Hackborn625ac272010-09-17 18:29:22 -07003455 }
3456 }
3457
Marco Nelissen18cb2872011-11-15 11:19:53 -08003458 private void handleDumpProvider(DumpComponentInfo info) {
Jeff Sharkeye861b422012-03-01 20:59:22 -08003459 final StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskWrites();
3460 try {
3461 ProviderClientRecord r = mLocalProviders.get(info.token);
3462 if (r != null && r.mLocalProvider != null) {
Dianne Hackborn8c841092013-06-24 13:46:13 -07003463 PrintWriter pw = new FastPrintWriter(new FileOutputStream(
3464 info.fd.getFileDescriptor()));
Jeff Sharkeye861b422012-03-01 20:59:22 -08003465 r.mLocalProvider.dump(info.fd.getFileDescriptor(), pw, info.args);
3466 pw.flush();
Marco Nelissen18cb2872011-11-15 11:19:53 -08003467 }
Jeff Sharkeye861b422012-03-01 20:59:22 -08003468 } finally {
3469 IoUtils.closeQuietly(info.fd);
3470 StrictMode.setThreadPolicy(oldPolicy);
Marco Nelissen18cb2872011-11-15 11:19:53 -08003471 }
3472 }
3473
Romain Guy65b345f2011-07-27 18:51:50 -07003474 private void handleServiceArgs(ServiceArgsData data) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003475 Service s = mServices.get(data.token);
3476 if (s != null) {
3477 try {
3478 if (data.args != null) {
3479 data.args.setExtrasClassLoader(s.getClassLoader());
Nicolas Prevotd1c99b12014-07-04 16:56:17 +01003480 data.args.prepareToEnterProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003481 }
Dianne Hackborn0c5001d2011-04-12 18:16:08 -07003482 int res;
3483 if (!data.taskRemoved) {
3484 res = s.onStartCommand(data.args, data.flags, data.startId);
3485 } else {
3486 s.onTaskRemoved(data.args);
3487 res = Service.START_TASK_REMOVED_COMPLETE;
3488 }
Brad Fitzpatrick333b8cb2010-08-26 12:04:57 -07003489
3490 QueuedWork.waitToFinish();
3491
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003492 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003493 ActivityManager.getService().serviceDoneExecuting(
Dianne Hackborn455625e2015-01-21 09:55:13 -08003494 data.token, SERVICE_DONE_EXECUTING_START, data.startId, res);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003495 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003496 throw e.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003497 }
Dianne Hackborn2a9094d2010-02-03 19:20:09 -08003498 ensureJitEnabled();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003499 } catch (Exception e) {
3500 if (!mInstrumentation.onException(s, e)) {
3501 throw new RuntimeException(
3502 "Unable to start service " + s
3503 + " with " + data.args + ": " + e.toString(), e);
3504 }
3505 }
3506 }
3507 }
3508
Romain Guy65b345f2011-07-27 18:51:50 -07003509 private void handleStopService(IBinder token) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003510 Service s = mServices.remove(token);
3511 if (s != null) {
3512 try {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003513 if (localLOGV) Slog.v(TAG, "Destroying service " + s);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003514 s.onDestroy();
Amith Yamasani75928252017-05-22 15:10:47 -07003515 s.detachAndCleanUp();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003516 Context context = s.getBaseContext();
Dianne Hackborn21556372010-02-04 16:34:40 -08003517 if (context instanceof ContextImpl) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003518 final String who = s.getClassName();
Dianne Hackborn21556372010-02-04 16:34:40 -08003519 ((ContextImpl) context).scheduleFinalCleanup(who, "Service");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003520 }
Brad Fitzpatrick333b8cb2010-08-26 12:04:57 -07003521
3522 QueuedWork.waitToFinish();
3523
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003524 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003525 ActivityManager.getService().serviceDoneExecuting(
Dianne Hackborn455625e2015-01-21 09:55:13 -08003526 token, SERVICE_DONE_EXECUTING_STOP, 0, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003527 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003528 throw e.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003529 }
3530 } catch (Exception e) {
3531 if (!mInstrumentation.onException(s, e)) {
3532 throw new RuntimeException(
3533 "Unable to stop service " + s
3534 + ": " + e.toString(), e);
3535 }
Craig Mautner66c4a822015-01-16 12:48:16 -08003536 Slog.i(TAG, "handleStopService: exception for " + token, e);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003537 }
Craig Mautner9776ad42015-01-15 14:38:39 -08003538 } else {
3539 Slog.i(TAG, "handleStopService: token=" + token + " not found.");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003540 }
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003541 //Slog.i(TAG, "Running services: " + mServices);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003542 }
3543
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07003544 public final ActivityClientRecord performResumeActivity(IBinder token,
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003545 boolean clearHide, String reason) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07003546 ActivityClientRecord r = mActivities.get(token);
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003547 if (localLOGV) Slog.v(TAG, "Performing resume of " + r
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003548 + " finished=" + r.activity.mFinished);
3549 if (r != null && !r.activity.mFinished) {
3550 if (clearHide) {
3551 r.hideForNow = false;
3552 r.activity.mStartedActivity = false;
3553 }
3554 try {
Dianne Hackborn6bdd3a12015-08-05 15:01:28 -07003555 r.activity.onStateNotSaved();
Dianne Hackborn689586d2012-10-01 18:23:04 -07003556 r.activity.mFragments.noteStateNotSaved();
Sudheer Shanka43b5ea42017-06-21 11:24:53 -07003557 checkAndBlockForNetworkAccess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003558 if (r.pendingIntents != null) {
3559 deliverNewIntents(r, r.pendingIntents);
3560 r.pendingIntents = null;
3561 }
3562 if (r.pendingResults != null) {
3563 deliverResults(r, r.pendingResults);
3564 r.pendingResults = null;
3565 }
3566 r.activity.performResume();
3567
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01003568 synchronized (mResourcesManager) {
3569 // If there is a pending local relaunch that was requested when the activity was
3570 // paused, it will put the activity into paused state when it finally happens.
3571 // Since the activity resumed before being relaunched, we don't want that to
3572 // happen, so we need to clear the request to relaunch paused.
3573 for (int i = mRelaunchingActivities.size() - 1; i >= 0; i--) {
3574 final ActivityClientRecord relaunching = mRelaunchingActivities.get(i);
3575 if (relaunching.token == r.token
3576 && relaunching.onlyLocalRequest && relaunching.startsNotResumed) {
3577 relaunching.startsNotResumed = false;
3578 }
Filip Gruszczynskic3b61792016-01-22 16:43:48 -08003579 }
3580 }
3581
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003582 EventLog.writeEvent(LOG_AM_ON_RESUME_CALLED, UserHandle.myUserId(),
3583 r.activity.getComponentName().getClassName(), reason);
Bob Leee5408332009-09-04 18:31:17 -07003584
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003585 r.paused = false;
3586 r.stopped = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003587 r.state = null;
Craig Mautnera0026042014-04-23 11:45:37 -07003588 r.persistentState = null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003589 } catch (Exception e) {
3590 if (!mInstrumentation.onException(r.activity, e)) {
3591 throw new RuntimeException(
3592 "Unable to resume activity "
3593 + r.intent.getComponent().toShortString()
3594 + ": " + e.toString(), e);
3595 }
3596 }
3597 }
3598 return r;
3599 }
3600
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07003601 static final void cleanUpPendingRemoveWindows(ActivityClientRecord r, boolean force) {
3602 if (r.mPreserveWindow && !force) {
3603 return;
3604 }
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08003605 if (r.mPendingRemoveWindow != null) {
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07003606 r.mPendingRemoveWindowManager.removeViewImmediate(
3607 r.mPendingRemoveWindow.getDecorView());
3608 IBinder wtoken = r.mPendingRemoveWindow.getDecorView().getWindowToken();
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08003609 if (wtoken != null) {
Jeff Brown98365d72012-08-19 20:30:52 -07003610 WindowManagerGlobal.getInstance().closeAll(wtoken,
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08003611 r.activity.getClass().getName(), "Activity");
3612 }
3613 }
3614 r.mPendingRemoveWindow = null;
3615 r.mPendingRemoveWindowManager = null;
3616 }
3617
Craig Mautner233ceee2014-05-09 17:05:11 -07003618 final void handleResumeActivity(IBinder token,
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003619 boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) {
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07003620 ActivityClientRecord r = mActivities.get(token);
3621 if (!checkAndUpdateLifecycleSeq(seq, r, "resumeActivity")) {
3622 return;
3623 }
3624
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003625 // If we are getting ready to gc after going to the background, well
3626 // we are back active so skip it.
3627 unscheduleGcIdler();
Dianne Hackborn89ad4562014-08-24 16:45:38 -07003628 mSomeActivitiesChanged = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003629
Adam Powellcfbe9be2013-11-06 14:58:58 -08003630 // TODO Push resumeArgs into the activity for consideration
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003631 r = performResumeActivity(token, clearHide, reason);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003632
3633 if (r != null) {
3634 final Activity a = r.activity;
3635
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003636 if (localLOGV) Slog.v(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003637 TAG, "Resume " + r + " started activity: " +
3638 a.mStartedActivity + ", hideForNow: " + r.hideForNow
3639 + ", finished: " + a.mFinished);
3640
3641 final int forwardBit = isForward ?
3642 WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION : 0;
Bob Leee5408332009-09-04 18:31:17 -07003643
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003644 // If the window hasn't yet been added to the window manager,
3645 // and this guy didn't finish itself or start another activity,
3646 // then go ahead and add the window.
Dianne Hackborn061d58a2010-03-12 15:07:06 -08003647 boolean willBeVisible = !a.mStartedActivity;
3648 if (!willBeVisible) {
3649 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003650 willBeVisible = ActivityManager.getService().willActivityBeVisible(
Dianne Hackborn061d58a2010-03-12 15:07:06 -08003651 a.getActivityToken());
3652 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003653 throw e.rethrowFromSystemServer();
Dianne Hackborn061d58a2010-03-12 15:07:06 -08003654 }
3655 }
3656 if (r.window == null && !a.mFinished && willBeVisible) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003657 r.window = r.activity.getWindow();
3658 View decor = r.window.getDecorView();
3659 decor.setVisibility(View.INVISIBLE);
3660 ViewManager wm = a.getWindowManager();
3661 WindowManager.LayoutParams l = r.window.getAttributes();
3662 a.mDecor = decor;
3663 l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
3664 l.softInputMode |= forwardBit;
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07003665 if (r.mPreserveWindow) {
3666 a.mWindowAdded = true;
3667 r.mPreserveWindow = false;
Robert Carrb2594852016-04-25 16:21:13 -07003668 // Normally the ViewRoot sets up callbacks with the Activity
3669 // in addView->ViewRootImpl#setView. If we are instead reusing
3670 // the decor view we have to notify the view root that the
3671 // callbacks may have changed.
3672 ViewRootImpl impl = decor.getViewRootImpl();
Robert Carr311ecba2016-04-27 12:59:45 -07003673 if (impl != null) {
3674 impl.notifyChildRebuilt();
3675 }
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07003676 }
Bryce Lee4b51b322017-04-07 10:27:19 -07003677 if (a.mVisibleFromClient) {
3678 if (!a.mWindowAdded) {
3679 a.mWindowAdded = true;
3680 wm.addView(decor, l);
3681 } else {
3682 // The activity will get a callback for this {@link LayoutParams} change
3683 // earlier. However, at that time the decor will not be set (this is set
3684 // in this method), so no action will be taken. This call ensures the
3685 // callback occurs with the decor set.
3686 a.onWindowAttributesChanged(l);
3687 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003688 }
3689
3690 // If the window has already been added, but during resume
3691 // we started another activity, then don't yet make the
Dianne Hackborn061d58a2010-03-12 15:07:06 -08003692 // window visible.
3693 } else if (!willBeVisible) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003694 if (localLOGV) Slog.v(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003695 TAG, "Launch " + r + " mStartedActivity set");
3696 r.hideForNow = true;
3697 }
3698
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08003699 // Get rid of anything left hanging around.
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07003700 cleanUpPendingRemoveWindows(r, false /* force */);
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08003701
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003702 // The window is now visible if it has been added, we are not
3703 // simply finishing, and we are not starting another activity.
Dianne Hackborn061d58a2010-03-12 15:07:06 -08003704 if (!r.activity.mFinished && willBeVisible
Dianne Hackbornc1e605e2009-09-25 17:18:15 -07003705 && r.activity.mDecor != null && !r.hideForNow) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003706 if (r.newConfig != null) {
Andrii Kulianb047b8b2017-02-08 18:38:26 -08003707 performConfigurationChangedForActivity(r, r.newConfig);
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003708 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Resuming activity "
Adam Lesinski082614c2016-03-04 14:33:47 -08003709 + r.activityInfo.name + " with newConfig " + r.activity.mCurrentConfig);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003710 r.newConfig = null;
3711 }
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003712 if (localLOGV) Slog.v(TAG, "Resuming " + r + " with isForward="
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003713 + isForward);
3714 WindowManager.LayoutParams l = r.window.getAttributes();
3715 if ((l.softInputMode
3716 & WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION)
3717 != forwardBit) {
3718 l.softInputMode = (l.softInputMode
3719 & (~WindowManager.LayoutParams.SOFT_INPUT_IS_FORWARD_NAVIGATION))
3720 | forwardBit;
Dianne Hackbornc1e605e2009-09-25 17:18:15 -07003721 if (r.activity.mVisibleFromClient) {
3722 ViewManager wm = a.getWindowManager();
3723 View decor = r.window.getDecorView();
3724 wm.updateViewLayout(decor, l);
3725 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003726 }
Bryce Lee4b51b322017-04-07 10:27:19 -07003727
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003728 r.activity.mVisibleFromServer = true;
3729 mNumVisibleActivities++;
3730 if (r.activity.mVisibleFromClient) {
3731 r.activity.makeVisible();
3732 }
3733 }
3734
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08003735 if (!r.onlyLocalRequest) {
3736 r.nextIdle = mNewActivities;
3737 mNewActivities = r;
3738 if (localLOGV) Slog.v(
3739 TAG, "Scheduling idle handler for " + r);
3740 Looper.myQueue().addIdleHandler(new Idler());
3741 }
3742 r.onlyLocalRequest = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003743
Dianne Hackbornad9b32112012-09-17 15:35:01 -07003744 // Tell the activity manager we have resumed.
3745 if (reallyResume) {
3746 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003747 ActivityManager.getService().activityResumed(token);
Dianne Hackbornad9b32112012-09-17 15:35:01 -07003748 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003749 throw ex.rethrowFromSystemServer();
Dianne Hackbornad9b32112012-09-17 15:35:01 -07003750 }
3751 }
3752
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003753 } else {
3754 // If an exception was thrown when trying to resume, then
3755 // just end this activity.
3756 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003757 ActivityManager.getService()
Wale Ogunwaleba7881c2015-08-01 19:28:29 -07003758 .finishActivity(token, Activity.RESULT_CANCELED, null,
3759 Activity.DONT_FINISH_TASK_WITH_ACTIVITY);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003760 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003761 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003762 }
3763 }
3764 }
3765
3766 private int mThumbnailWidth = -1;
3767 private int mThumbnailHeight = -1;
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08003768 private Bitmap mAvailThumbnailBitmap = null;
3769 private Canvas mThumbnailCanvas = null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003770
Romain Guy65b345f2011-07-27 18:51:50 -07003771 private Bitmap createThumbnailBitmap(ActivityClientRecord r) {
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08003772 Bitmap thumbnail = mAvailThumbnailBitmap;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003773 try {
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08003774 if (thumbnail == null) {
3775 int w = mThumbnailWidth;
3776 int h;
3777 if (w < 0) {
3778 Resources res = r.activity.getResources();
Winson Chung6784f1c2014-05-22 11:22:41 -07003779 int wId = com.android.internal.R.dimen.thumbnail_width;
3780 int hId = com.android.internal.R.dimen.thumbnail_height;
Winson Chungfd086222014-05-13 15:49:42 -07003781 mThumbnailWidth = w = res.getDimensionPixelSize(wId);
3782 mThumbnailHeight = h = res.getDimensionPixelSize(hId);
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08003783 } else {
3784 h = mThumbnailHeight;
3785 }
3786
3787 // On platforms where we don't want thumbnails, set dims to (0,0)
3788 if ((w > 0) && (h > 0)) {
Dianne Hackborndde331c2012-08-03 14:01:57 -07003789 thumbnail = Bitmap.createBitmap(r.activity.getResources().getDisplayMetrics(),
3790 w, h, THUMBNAIL_FORMAT);
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08003791 thumbnail.eraseColor(0);
3792 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003793 }
3794
Dianne Hackbornfb3806d2010-12-09 13:14:12 -08003795 if (thumbnail != null) {
3796 Canvas cv = mThumbnailCanvas;
3797 if (cv == null) {
3798 mThumbnailCanvas = cv = new Canvas();
3799 }
Tim Murraye1e6c662015-04-07 13:24:14 -07003800
Dianne Hackbornfb3806d2010-12-09 13:14:12 -08003801 cv.setBitmap(thumbnail);
3802 if (!r.activity.onCreateThumbnail(thumbnail, cv)) {
3803 mAvailThumbnailBitmap = thumbnail;
3804 thumbnail = null;
3805 }
Dianne Hackborn6311d0a2011-08-02 16:37:58 -07003806 cv.setBitmap(null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003807 }
Jim Miller0b2a6d02010-07-13 18:01:29 -07003808
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003809 } catch (Exception e) {
3810 if (!mInstrumentation.onException(r.activity, e)) {
3811 throw new RuntimeException(
3812 "Unable to create thumbnail of "
3813 + r.intent.getComponent().toShortString()
3814 + ": " + e.toString(), e);
3815 }
3816 thumbnail = null;
3817 }
3818
3819 return thumbnail;
3820 }
3821
Romain Guy65b345f2011-07-27 18:51:50 -07003822 private void handlePauseActivity(IBinder token, boolean finished,
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07003823 boolean userLeaving, int configChanges, boolean dontReport, int seq) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07003824 ActivityClientRecord r = mActivities.get(token);
Filip Gruszczynskic3b61792016-01-22 16:43:48 -08003825 if (DEBUG_ORDER) Slog.d(TAG, "handlePauseActivity " + r + ", seq: " + seq);
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07003826 if (!checkAndUpdateLifecycleSeq(seq, r, "pauseActivity")) {
3827 return;
3828 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003829 if (r != null) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003830 //Slog.v(TAG, "userLeaving=" + userLeaving + " handling pause of " + r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003831 if (userLeaving) {
3832 performUserLeavingActivity(r);
3833 }
Bob Leee5408332009-09-04 18:31:17 -07003834
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003835 r.activity.mConfigChangeFlags |= configChanges;
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003836 performPauseActivity(token, finished, r.isPreHoneycomb(), "handlePauseActivity");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003837
Dianne Hackbornaa93bcd2010-10-27 13:57:00 -07003838 // Make sure any pending writes are now committed.
Dianne Hackborn5d9d03a2011-01-24 13:15:09 -08003839 if (r.isPreHoneycomb()) {
3840 QueuedWork.waitToFinish();
3841 }
Dianne Hackbornad9b32112012-09-17 15:35:01 -07003842
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003843 // Tell the activity manager we have paused.
Dianne Hackborna4e102e2014-09-04 22:52:27 -07003844 if (!dontReport) {
3845 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003846 ActivityManager.getService().activityPaused(token);
Dianne Hackborna4e102e2014-09-04 22:52:27 -07003847 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003848 throw ex.rethrowFromSystemServer();
Dianne Hackborna4e102e2014-09-04 22:52:27 -07003849 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003850 }
Dianne Hackborn89ad4562014-08-24 16:45:38 -07003851 mSomeActivitiesChanged = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003852 }
3853 }
3854
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07003855 final void performUserLeavingActivity(ActivityClientRecord r) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003856 mInstrumentation.callActivityOnUserLeaving(r.activity);
3857 }
3858
3859 final Bundle performPauseActivity(IBinder token, boolean finished,
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003860 boolean saveState, String reason) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07003861 ActivityClientRecord r = mActivities.get(token);
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003862 return r != null ? performPauseActivity(r, finished, saveState, reason) : null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003863 }
3864
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07003865 final Bundle performPauseActivity(ActivityClientRecord r, boolean finished,
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003866 boolean saveState, String reason) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003867 if (r.paused) {
3868 if (r.activity.mFinished) {
3869 // If we are finishing, we won't call onResume() in certain cases.
3870 // So here we likewise don't want to call onPause() if the activity
3871 // isn't resumed.
3872 return null;
3873 }
3874 RuntimeException e = new RuntimeException(
3875 "Performing pause of activity that is not resumed: "
3876 + r.intent.getComponent().toShortString());
Dianne Hackbornc9421ba2010-03-11 22:23:46 -08003877 Slog.e(TAG, e.getMessage(), e);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003878 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003879 if (finished) {
3880 r.activity.mFinished = true;
3881 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003882
Wale Ogunwale5dc6d652016-05-04 10:24:33 -07003883 // Next have the activity save its current state and managed dialogs...
3884 if (!r.activity.mFinished && saveState) {
3885 callCallActivityOnSaveInstanceState(r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003886 }
Wale Ogunwale5dc6d652016-05-04 10:24:33 -07003887
3888 performPauseActivityIfNeeded(r, reason);
Jeff Hamilton52d32032011-01-08 15:31:26 -06003889
3890 // Notify any outstanding on paused listeners
3891 ArrayList<OnActivityPausedListener> listeners;
3892 synchronized (mOnPauseListeners) {
3893 listeners = mOnPauseListeners.remove(r.activity);
3894 }
3895 int size = (listeners != null ? listeners.size() : 0);
3896 for (int i = 0; i < size; i++) {
3897 listeners.get(i).onPaused(r.activity);
3898 }
3899
Craig Mautnera0026042014-04-23 11:45:37 -07003900 return !r.activity.mFinished && saveState ? r.state : null;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003901 }
3902
Wale Ogunwale5dc6d652016-05-04 10:24:33 -07003903 private void performPauseActivityIfNeeded(ActivityClientRecord r, String reason) {
3904 if (r.paused) {
3905 // You are already paused silly...
3906 return;
3907 }
3908
3909 try {
3910 r.activity.mCalled = false;
3911 mInstrumentation.callActivityOnPause(r.activity);
3912 EventLog.writeEvent(LOG_AM_ON_PAUSE_CALLED, UserHandle.myUserId(),
3913 r.activity.getComponentName().getClassName(), reason);
3914 if (!r.activity.mCalled) {
3915 throw new SuperNotCalledException("Activity " + safeToComponentShortString(r.intent)
3916 + " did not call through to super.onPause()");
3917 }
3918 } catch (SuperNotCalledException e) {
3919 throw e;
3920 } catch (Exception e) {
3921 if (!mInstrumentation.onException(r.activity, e)) {
3922 throw new RuntimeException("Unable to pause activity "
3923 + safeToComponentShortString(r.intent) + ": " + e.toString(), e);
3924 }
3925 }
3926 r.paused = true;
3927 }
3928
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003929 final void performStopActivity(IBinder token, boolean saveState, String reason) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07003930 ActivityClientRecord r = mActivities.get(token);
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003931 performStopActivityInner(r, null, false, saveState, reason);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003932 }
3933
Dianne Hackborn162bc0e2012-04-09 14:06:16 -07003934 private static class StopInfo implements Runnable {
3935 ActivityClientRecord activity;
3936 Bundle state;
Craig Mautnera0026042014-04-23 11:45:37 -07003937 PersistableBundle persistentState;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003938 CharSequence description;
Dianne Hackborn162bc0e2012-04-09 14:06:16 -07003939
3940 @Override public void run() {
3941 // Tell activity manager we have been stopped.
3942 try {
3943 if (DEBUG_MEMORY_TRIM) Slog.v(TAG, "Reporting activity stopped: " + activity);
Sudheer Shankadc589ac2016-11-10 15:30:17 -08003944 ActivityManager.getService().activityStopped(
Craig Mautnera0026042014-04-23 11:45:37 -07003945 activity.token, state, persistentState, description);
Dianne Hackborn162bc0e2012-04-09 14:06:16 -07003946 } catch (RemoteException ex) {
Jeff Sharkeya6bfeae2017-07-05 16:50:24 -06003947 // Dump statistics about bundle to help developers debug
3948 final LogWriter writer = new LogWriter(Log.WARN, TAG);
3949 final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
3950 pw.println("Bundle stats:");
3951 Bundle.dumpStats(pw, state);
3952 pw.println("PersistableBundle stats:");
3953 Bundle.dumpStats(pw, persistentState);
3954
Jeff Sharkey369f5092016-02-29 11:16:21 -07003955 if (ex instanceof TransactionTooLargeException
Jeff Sharkey9ad86132016-03-01 11:22:59 -07003956 && activity.packageInfo.getTargetSdkVersion() < Build.VERSION_CODES.N) {
Jeff Sharkeyb8e8a912016-03-09 16:27:40 -07003957 Log.e(TAG, "App sent too much data in instance state, so it was ignored", ex);
Jeff Sharkey369f5092016-02-29 11:16:21 -07003958 return;
3959 }
Jeff Sharkeyf8880562016-02-26 13:03:01 -07003960 throw ex.rethrowFromSystemServer();
Dianne Hackborn162bc0e2012-04-09 14:06:16 -07003961 }
3962 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003963 }
3964
Jeff Brownddaa9ac2011-11-11 20:16:14 -08003965 private static final class ProviderRefCount {
Sudheer Shankafc46e9b2016-10-21 17:55:27 -07003966 public final ContentProviderHolder holder;
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07003967 public final ProviderClientRecord client;
3968 public int stableCount;
3969 public int unstableCount;
Jeff Brownddaa9ac2011-11-11 20:16:14 -08003970
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07003971 // When this is set, the stable and unstable ref counts are 0 and
3972 // we have a pending operation scheduled to remove the ref count
3973 // from the activity manager. On the activity manager we are still
3974 // holding an unstable ref, though it is not reflected in the counts
3975 // here.
3976 public boolean removePending;
3977
Sudheer Shankafc46e9b2016-10-21 17:55:27 -07003978 ProviderRefCount(ContentProviderHolder inHolder,
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07003979 ProviderClientRecord inClient, int sCount, int uCount) {
3980 holder = inHolder;
3981 client = inClient;
3982 stableCount = sCount;
3983 unstableCount = uCount;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003984 }
3985 }
3986
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08003987 /**
3988 * Core implementation of stopping an activity. Note this is a little
3989 * tricky because the server's meaning of stop is slightly different
3990 * than our client -- for the server, stop means to save state and give
3991 * it the result when it is done, but the window may still be visible.
3992 * For the client, we want to call onStop()/onStart() to indicate when
Wale Ogunwaleb5066fe2016-09-21 07:33:43 -07003993 * the activity's UI visibility changes.
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08003994 */
Romain Guy65b345f2011-07-27 18:51:50 -07003995 private void performStopActivityInner(ActivityClientRecord r,
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08003996 StopInfo info, boolean keepShown, boolean saveState, String reason) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07003997 if (localLOGV) Slog.v(TAG, "Performing stop of " + r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08003998 if (r != null) {
3999 if (!keepShown && r.stopped) {
4000 if (r.activity.mFinished) {
4001 // If we are finishing, we won't call onResume() in certain
4002 // cases. So here we likewise don't want to call onStop()
4003 // if the activity isn't resumed.
4004 return;
4005 }
4006 RuntimeException e = new RuntimeException(
Andrii Kulian58178f22016-03-16 13:44:56 -07004007 "Performing stop of activity that is already stopped: "
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004008 + r.intent.getComponent().toShortString());
Dianne Hackbornc9421ba2010-03-11 22:23:46 -08004009 Slog.e(TAG, e.getMessage(), e);
Andrii Kulian58178f22016-03-16 13:44:56 -07004010 Slog.e(TAG, r.getStateString());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004011 }
4012
Wale Ogunwale5dc6d652016-05-04 10:24:33 -07004013 // One must first be paused before stopped...
4014 performPauseActivityIfNeeded(r, reason);
4015
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004016 if (info != null) {
4017 try {
4018 // First create a thumbnail for the activity...
Dianne Hackborn0500b3c2011-11-01 15:28:43 -07004019 // For now, don't create the thumbnail here; we are
4020 // doing that by doing a screen snapshot.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004021 info.description = r.activity.onCreateDescription();
4022 } catch (Exception e) {
4023 if (!mInstrumentation.onException(r.activity, e)) {
4024 throw new RuntimeException(
4025 "Unable to save state of activity "
4026 + r.intent.getComponent().toShortString()
4027 + ": " + e.toString(), e);
4028 }
4029 }
4030 }
4031
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08004032 // Next have the activity save its current state and managed dialogs...
4033 if (!r.activity.mFinished && saveState) {
4034 if (r.state == null) {
Craig Mautnera0026042014-04-23 11:45:37 -07004035 callCallActivityOnSaveInstanceState(r);
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08004036 }
4037 }
4038
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004039 if (!keepShown) {
4040 try {
4041 // Now we are idle.
Chong Zhang7687f252016-02-26 12:03:33 -08004042 r.activity.performStop(false /*preserveWindow*/);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004043 } catch (Exception e) {
4044 if (!mInstrumentation.onException(r.activity, e)) {
4045 throw new RuntimeException(
4046 "Unable to stop activity "
4047 + r.intent.getComponent().toShortString()
4048 + ": " + e.toString(), e);
4049 }
4050 }
4051 r.stopped = true;
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08004052 EventLog.writeEvent(LOG_AM_ON_STOP_CALLED, UserHandle.myUserId(),
4053 r.activity.getComponentName().getClassName(), reason);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004054 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004055 }
4056 }
4057
Romain Guy65b345f2011-07-27 18:51:50 -07004058 private void updateVisibility(ActivityClientRecord r, boolean show) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004059 View v = r.activity.mDecor;
4060 if (v != null) {
4061 if (show) {
4062 if (!r.activity.mVisibleFromServer) {
4063 r.activity.mVisibleFromServer = true;
4064 mNumVisibleActivities++;
4065 if (r.activity.mVisibleFromClient) {
4066 r.activity.makeVisible();
4067 }
4068 }
4069 if (r.newConfig != null) {
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004070 performConfigurationChangedForActivity(r, r.newConfig);
Dianne Hackborn399cccb2010-04-13 22:57:49 -07004071 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Updating activity vis "
Adam Lesinski082614c2016-03-04 14:33:47 -08004072 + r.activityInfo.name + " with new config "
4073 + r.activity.mCurrentConfig);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004074 r.newConfig = null;
4075 }
4076 } else {
4077 if (r.activity.mVisibleFromServer) {
4078 r.activity.mVisibleFromServer = false;
4079 mNumVisibleActivities--;
4080 v.setVisibility(View.INVISIBLE);
4081 }
4082 }
4083 }
4084 }
4085
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07004086 private void handleStopActivity(IBinder token, boolean show, int configChanges, int seq) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07004087 ActivityClientRecord r = mActivities.get(token);
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07004088 if (!checkAndUpdateLifecycleSeq(seq, r, "stopActivity")) {
4089 return;
4090 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004091 r.activity.mConfigChangeFlags |= configChanges;
4092
4093 StopInfo info = new StopInfo();
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08004094 performStopActivityInner(r, info, show, true, "handleStopActivity");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004095
Dianne Hackborn399cccb2010-04-13 22:57:49 -07004096 if (localLOGV) Slog.v(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004097 TAG, "Finishing stop of " + r + ": show=" + show
4098 + " win=" + r.window);
4099
4100 updateVisibility(r, show);
Bob Leee5408332009-09-04 18:31:17 -07004101
Dianne Hackborn5d9d03a2011-01-24 13:15:09 -08004102 // Make sure any pending writes are now committed.
4103 if (!r.isPreHoneycomb()) {
4104 QueuedWork.waitToFinish();
4105 }
4106
Dianne Hackborn162bc0e2012-04-09 14:06:16 -07004107 // Schedule the call to tell the activity manager we have
4108 // stopped. We don't do this immediately, because we want to
4109 // have a chance for any other pending work (in particular memory
4110 // trim requests) to complete before you tell the activity
4111 // manager to proceed and allow us to go fully into the background.
4112 info.activity = r;
4113 info.state = r.state;
Craig Mautnera0026042014-04-23 11:45:37 -07004114 info.persistentState = r.persistentState;
Dianne Hackborn162bc0e2012-04-09 14:06:16 -07004115 mH.post(info);
Dianne Hackborn89ad4562014-08-24 16:45:38 -07004116 mSomeActivitiesChanged = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004117 }
4118
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07004119 private static boolean checkAndUpdateLifecycleSeq(int seq, ActivityClientRecord r,
4120 String action) {
4121 if (r == null) {
4122 return true;
4123 }
4124 if (seq < r.lastProcessedSeq) {
4125 if (DEBUG_ORDER) Slog.d(TAG, action + " for " + r + " ignored, because seq=" + seq
4126 + " < mCurrentLifecycleSeq=" + r.lastProcessedSeq);
4127 return false;
4128 }
4129 r.lastProcessedSeq = seq;
4130 return true;
4131 }
4132
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004133 final void performRestartActivity(IBinder token) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07004134 ActivityClientRecord r = mActivities.get(token);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004135 if (r.stopped) {
4136 r.activity.performRestart();
4137 r.stopped = false;
4138 }
4139 }
4140
Romain Guy65b345f2011-07-27 18:51:50 -07004141 private void handleWindowVisibility(IBinder token, boolean show) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07004142 ActivityClientRecord r = mActivities.get(token);
Tim Murraye1e6c662015-04-07 13:24:14 -07004143
Dianne Hackbornbfddc0f2010-12-14 11:28:01 -08004144 if (r == null) {
4145 Log.w(TAG, "handleWindowVisibility: no activity for token " + token);
4146 return;
4147 }
Tim Murraye1e6c662015-04-07 13:24:14 -07004148
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004149 if (!show && !r.stopped) {
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08004150 performStopActivityInner(r, null, show, false, "handleWindowVisibility");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004151 } else if (show && r.stopped) {
4152 // If we are getting ready to gc after going to the background, well
4153 // we are back active so skip it.
4154 unscheduleGcIdler();
4155
4156 r.activity.performRestart();
4157 r.stopped = false;
4158 }
4159 if (r.activity.mDecor != null) {
Joe Onorato43a17652011-04-06 19:22:23 -07004160 if (false) Slog.v(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004161 TAG, "Handle window " + r + " visibility: " + show);
4162 updateVisibility(r, show);
4163 }
Dianne Hackborn89ad4562014-08-24 16:45:38 -07004164 mSomeActivitiesChanged = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004165 }
4166
Wale Ogunwaleb5066fe2016-09-21 07:33:43 -07004167 // TODO: This method should be changed to use {@link #performStopActivityInner} to perform to
4168 // stop operation on the activity to reduce code duplication and the chance of fixing a bug in
4169 // one place and missing the other.
Romain Guy65b345f2011-07-27 18:51:50 -07004170 private void handleSleeping(IBinder token, boolean sleeping) {
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08004171 ActivityClientRecord r = mActivities.get(token);
4172
4173 if (r == null) {
Dianne Hackborn842e04b2011-01-22 13:00:12 -08004174 Log.w(TAG, "handleSleeping: no activity for token " + token);
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08004175 return;
4176 }
4177
4178 if (sleeping) {
Dianne Hackborn842e04b2011-01-22 13:00:12 -08004179 if (!r.stopped && !r.isPreHoneycomb()) {
Wale Ogunwaleb5066fe2016-09-21 07:33:43 -07004180 if (!r.activity.mFinished && r.state == null) {
4181 callCallActivityOnSaveInstanceState(r);
4182 }
4183
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08004184 try {
4185 // Now we are idle.
Chong Zhang7687f252016-02-26 12:03:33 -08004186 r.activity.performStop(false /*preserveWindow*/);
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08004187 } catch (Exception e) {
4188 if (!mInstrumentation.onException(r.activity, e)) {
4189 throw new RuntimeException(
4190 "Unable to stop activity "
4191 + r.intent.getComponent().toShortString()
4192 + ": " + e.toString(), e);
4193 }
4194 }
4195 r.stopped = true;
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08004196 EventLog.writeEvent(LOG_AM_ON_STOP_CALLED, UserHandle.myUserId(),
4197 r.activity.getComponentName().getClassName(), "sleeping");
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08004198 }
Dianne Hackborn5d9d03a2011-01-24 13:15:09 -08004199
4200 // Make sure any pending writes are now committed.
4201 if (!r.isPreHoneycomb()) {
4202 QueuedWork.waitToFinish();
4203 }
4204
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08004205 // Tell activity manager we slept.
4206 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08004207 ActivityManager.getService().activitySlept(r.token);
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08004208 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07004209 throw ex.rethrowFromSystemServer();
Dianne Hackborn4eba96b2011-01-21 13:34:36 -08004210 }
4211 } else {
4212 if (r.stopped && r.activity.mVisibleFromServer) {
4213 r.activity.performRestart();
4214 r.stopped = false;
4215 }
4216 }
4217 }
4218
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08004219 private void handleSetCoreSettings(Bundle coreSettings) {
Craig Mautner88c05892013-06-28 09:47:45 -07004220 synchronized (mResourcesManager) {
Svetoslav Ganov9aa597e2011-03-03 18:17:41 -08004221 mCoreSettings = coreSettings;
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08004222 }
Jon Miranda836c0a82014-08-11 12:32:26 -07004223 onCoreSettingsChange();
4224 }
4225
4226 private void onCoreSettingsChange() {
4227 boolean debugViewAttributes =
4228 mCoreSettings.getInt(Settings.Global.DEBUG_VIEW_ATTRIBUTES, 0) != 0;
4229 if (debugViewAttributes != View.mDebugViewAttributes) {
4230 View.mDebugViewAttributes = debugViewAttributes;
4231
4232 // request all activities to relaunch for the changes to take place
Fyodor Kupolovcb93d6f2017-05-04 17:27:16 -07004233 requestRelaunchAllActivities();
4234 }
4235 }
4236
4237 private void requestRelaunchAllActivities() {
4238 for (Map.Entry<IBinder, ActivityClientRecord> entry : mActivities.entrySet()) {
4239 final Activity activity = entry.getValue().activity;
4240 if (!activity.mFinished) {
4241 try {
4242 ActivityManager.getService().requestActivityRelaunch(entry.getKey());
4243 } catch (RemoteException e) {
4244 throw e.rethrowFromSystemServer();
4245 }
Jon Miranda836c0a82014-08-11 12:32:26 -07004246 }
4247 }
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08004248 }
4249
Dianne Hackborne2515ee2011-04-27 18:52:56 -04004250 private void handleUpdatePackageCompatibilityInfo(UpdateCompatibilityData data) {
4251 LoadedApk apk = peekPackageInfo(data.pkg, false);
4252 if (apk != null) {
Craig Mautner48d0d182013-06-11 07:53:06 -07004253 apk.setCompatibilityInfo(data.info);
Dianne Hackborne2515ee2011-04-27 18:52:56 -04004254 }
4255 apk = peekPackageInfo(data.pkg, true);
4256 if (apk != null) {
Craig Mautner48d0d182013-06-11 07:53:06 -07004257 apk.setCompatibilityInfo(data.info);
Dianne Hackborne2515ee2011-04-27 18:52:56 -04004258 }
4259 handleConfigurationChanged(mConfiguration, data.info);
Jeff Brown98365d72012-08-19 20:30:52 -07004260 WindowManagerGlobal.getInstance().reportNewConfiguration(mConfiguration);
Dianne Hackborne2515ee2011-04-27 18:52:56 -04004261 }
4262
Romain Guy65b345f2011-07-27 18:51:50 -07004263 private void deliverResults(ActivityClientRecord r, List<ResultInfo> results) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004264 final int N = results.size();
4265 for (int i=0; i<N; i++) {
4266 ResultInfo ri = results.get(i);
4267 try {
4268 if (ri.mData != null) {
4269 ri.mData.setExtrasClassLoader(r.activity.getClassLoader());
Nicolas Prevotd1c99b12014-07-04 16:56:17 +01004270 ri.mData.prepareToEnterProcess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004271 }
Dianne Hackborn399cccb2010-04-13 22:57:49 -07004272 if (DEBUG_RESULTS) Slog.v(TAG,
Chris Tate8a7dc172009-03-24 20:11:42 -07004273 "Delivering result to activity " + r + " : " + ri);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004274 r.activity.dispatchActivityResult(ri.mResultWho,
4275 ri.mRequestCode, ri.mResultCode, ri.mData);
4276 } catch (Exception e) {
4277 if (!mInstrumentation.onException(r.activity, e)) {
4278 throw new RuntimeException(
4279 "Failure delivering result " + ri + " to activity "
4280 + r.intent.getComponent().toShortString()
4281 + ": " + e.toString(), e);
4282 }
4283 }
4284 }
4285 }
4286
Romain Guy65b345f2011-07-27 18:51:50 -07004287 private void handleSendResult(ResultData res) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07004288 ActivityClientRecord r = mActivities.get(res.token);
Dianne Hackborn399cccb2010-04-13 22:57:49 -07004289 if (DEBUG_RESULTS) Slog.v(TAG, "Handling send result to " + r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004290 if (r != null) {
4291 final boolean resumed = !r.paused;
4292 if (!r.activity.mFinished && r.activity.mDecor != null
4293 && r.hideForNow && resumed) {
4294 // We had hidden the activity because it started another
4295 // one... we have gotten a result back and we are not
4296 // paused, so make sure our window is visible.
4297 updateVisibility(r, true);
4298 }
4299 if (resumed) {
4300 try {
4301 // Now we are idle.
4302 r.activity.mCalled = false;
Dianne Hackbornfb3cffe2010-10-25 17:08:56 -07004303 r.activity.mTemporaryPause = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004304 mInstrumentation.callActivityOnPause(r.activity);
4305 if (!r.activity.mCalled) {
4306 throw new SuperNotCalledException(
4307 "Activity " + r.intent.getComponent().toShortString()
4308 + " did not call through to super.onPause()");
4309 }
4310 } catch (SuperNotCalledException e) {
4311 throw e;
4312 } catch (Exception e) {
4313 if (!mInstrumentation.onException(r.activity, e)) {
4314 throw new RuntimeException(
4315 "Unable to pause activity "
4316 + r.intent.getComponent().toShortString()
4317 + ": " + e.toString(), e);
4318 }
4319 }
4320 }
Sudheer Shanka43b5ea42017-06-21 11:24:53 -07004321 checkAndBlockForNetworkAccess();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004322 deliverResults(r, res.results);
4323 if (resumed) {
Dianne Hackbornb46ed762011-06-02 18:33:15 -07004324 r.activity.performResume();
Dianne Hackbornfb3cffe2010-10-25 17:08:56 -07004325 r.activity.mTemporaryPause = false;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004326 }
4327 }
4328 }
4329
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07004330 public final ActivityClientRecord performDestroyActivity(IBinder token, boolean finishing) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004331 return performDestroyActivity(token, finishing, 0, false);
4332 }
4333
Romain Guy65b345f2011-07-27 18:51:50 -07004334 private ActivityClientRecord performDestroyActivity(IBinder token, boolean finishing,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004335 int configChanges, boolean getNonConfigInstance) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07004336 ActivityClientRecord r = mActivities.get(token);
Craig Mautner88c05892013-06-28 09:47:45 -07004337 Class<? extends Activity> activityClass = null;
Dianne Hackborn399cccb2010-04-13 22:57:49 -07004338 if (localLOGV) Slog.v(TAG, "Performing finish of " + r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004339 if (r != null) {
Brad Fitzpatrick5f8b5c12011-01-20 15:12:08 -08004340 activityClass = r.activity.getClass();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004341 r.activity.mConfigChangeFlags |= configChanges;
4342 if (finishing) {
4343 r.activity.mFinished = true;
4344 }
Wale Ogunwale5dc6d652016-05-04 10:24:33 -07004345
4346 performPauseActivityIfNeeded(r, "destroy");
4347
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004348 if (!r.stopped) {
4349 try {
Chong Zhang7687f252016-02-26 12:03:33 -08004350 r.activity.performStop(r.mPreserveWindow);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004351 } catch (SuperNotCalledException e) {
4352 throw e;
4353 } catch (Exception e) {
4354 if (!mInstrumentation.onException(r.activity, e)) {
4355 throw new RuntimeException(
4356 "Unable to stop activity "
Mitsuru Oshimad9aef732009-06-16 20:20:50 -07004357 + safeToComponentShortString(r.intent)
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004358 + ": " + e.toString(), e);
4359 }
4360 }
4361 r.stopped = true;
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08004362 EventLog.writeEvent(LOG_AM_ON_STOP_CALLED, UserHandle.myUserId(),
4363 r.activity.getComponentName().getClassName(), "destroy");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004364 }
4365 if (getNonConfigInstance) {
4366 try {
Dianne Hackbornb4bc78b2010-05-12 18:59:50 -07004367 r.lastNonConfigurationInstances
4368 = r.activity.retainNonConfigurationInstances();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004369 } catch (Exception e) {
4370 if (!mInstrumentation.onException(r.activity, e)) {
4371 throw new RuntimeException(
4372 "Unable to retain activity "
4373 + r.intent.getComponent().toShortString()
4374 + ": " + e.toString(), e);
4375 }
4376 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004377 }
4378 try {
4379 r.activity.mCalled = false;
Dianne Hackborn2dedce62010-04-15 14:45:25 -07004380 mInstrumentation.callActivityOnDestroy(r.activity);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004381 if (!r.activity.mCalled) {
4382 throw new SuperNotCalledException(
Mitsuru Oshimad9aef732009-06-16 20:20:50 -07004383 "Activity " + safeToComponentShortString(r.intent) +
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004384 " did not call through to super.onDestroy()");
4385 }
4386 if (r.window != null) {
4387 r.window.closeAllPanels();
4388 }
4389 } catch (SuperNotCalledException e) {
4390 throw e;
4391 } catch (Exception e) {
4392 if (!mInstrumentation.onException(r.activity, e)) {
4393 throw new RuntimeException(
Mitsuru Oshimad9aef732009-06-16 20:20:50 -07004394 "Unable to destroy activity " + safeToComponentShortString(r.intent)
4395 + ": " + e.toString(), e);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004396 }
4397 }
4398 }
4399 mActivities.remove(token);
Brad Fitzpatrick5f8b5c12011-01-20 15:12:08 -08004400 StrictMode.decrementExpectedActivityCount(activityClass);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004401 return r;
4402 }
4403
Mitsuru Oshimad9aef732009-06-16 20:20:50 -07004404 private static String safeToComponentShortString(Intent intent) {
4405 ComponentName component = intent.getComponent();
4406 return component == null ? "[Unknown]" : component.toShortString();
4407 }
4408
Romain Guy65b345f2011-07-27 18:51:50 -07004409 private void handleDestroyActivity(IBinder token, boolean finishing,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004410 int configChanges, boolean getNonConfigInstance) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07004411 ActivityClientRecord r = performDestroyActivity(token, finishing,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004412 configChanges, getNonConfigInstance);
4413 if (r != null) {
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07004414 cleanUpPendingRemoveWindows(r, finishing);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004415 WindowManager wm = r.activity.getWindowManager();
4416 View v = r.activity.mDecor;
4417 if (v != null) {
4418 if (r.activity.mVisibleFromServer) {
4419 mNumVisibleActivities--;
4420 }
4421 IBinder wtoken = v.getWindowToken();
4422 if (r.activity.mWindowAdded) {
Robert Carr77bdfb52016-05-02 18:18:31 -07004423 if (r.mPreserveWindow) {
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004424 // Hold off on removing this until the new activity's
4425 // window is being added.
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07004426 r.mPendingRemoveWindow = r.window;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004427 r.mPendingRemoveWindowManager = wm;
Andrii Kulianeac0ea52016-05-11 15:50:24 -07004428 // We can only keep the part of the view hierarchy that we control,
4429 // everything else must be removed, because it might not be able to
4430 // behave properly when activity is relaunching.
4431 r.window.clearContentView();
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004432 } else {
4433 wm.removeViewImmediate(v);
4434 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004435 }
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004436 if (wtoken != null && r.mPendingRemoveWindow == null) {
Jeff Brown98365d72012-08-19 20:30:52 -07004437 WindowManagerGlobal.getInstance().closeAll(wtoken,
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004438 r.activity.getClass().getName(), "Activity");
Andrii Kulianeac0ea52016-05-11 15:50:24 -07004439 } else if (r.mPendingRemoveWindow != null) {
4440 // We're preserving only one window, others should be closed so app views
4441 // will be detached before the final tear down. It should be done now because
4442 // some components (e.g. WebView) rely on detach callbacks to perform receiver
4443 // unregister and other cleanup.
4444 WindowManagerGlobal.getInstance().closeAllExceptView(token, v,
4445 r.activity.getClass().getName(), "Activity");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004446 }
4447 r.activity.mDecor = null;
4448 }
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004449 if (r.mPendingRemoveWindow == null) {
4450 // If we are delaying the removal of the activity window, then
4451 // we can't clean up all windows here. Note that we can't do
4452 // so later either, which means any windows that aren't closed
4453 // by the app will leak. Well we try to warning them a lot
4454 // about leaking windows, because that is a bug, so if they are
4455 // using this recreate facility then they get to live with leaks.
Jeff Brown98365d72012-08-19 20:30:52 -07004456 WindowManagerGlobal.getInstance().closeAll(token,
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004457 r.activity.getClass().getName(), "Activity");
4458 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004459
4460 // Mocked out contexts won't be participating in the normal
4461 // process lifecycle, but if we're running with a proper
4462 // ApplicationContext we need to have it tear down things
4463 // cleanly.
4464 Context c = r.activity.getBaseContext();
Dianne Hackborn21556372010-02-04 16:34:40 -08004465 if (c instanceof ContextImpl) {
4466 ((ContextImpl) c).scheduleFinalCleanup(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004467 r.activity.getClass().getName(), "Activity");
4468 }
4469 }
4470 if (finishing) {
4471 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08004472 ActivityManager.getService().activityDestroyed(token);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004473 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07004474 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004475 }
4476 }
Dianne Hackborn89ad4562014-08-24 16:45:38 -07004477 mSomeActivitiesChanged = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004478 }
4479
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07004480 /**
4481 * @param preserveWindow Whether the activity should try to reuse the window it created,
4482 * including the decor view after the relaunch.
4483 */
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004484 public final void requestRelaunchActivity(IBinder token,
Dianne Hackborn85d558c2014-11-04 10:31:54 -08004485 List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004486 int configChanges, boolean notResumed, Configuration config,
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07004487 Configuration overrideConfig, boolean fromServer, boolean preserveWindow) {
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004488 ActivityClientRecord target = null;
4489
Craig Mautner88c05892013-06-28 09:47:45 -07004490 synchronized (mResourcesManager) {
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004491 for (int i=0; i<mRelaunchingActivities.size(); i++) {
4492 ActivityClientRecord r = mRelaunchingActivities.get(i);
Filip Gruszczynskic3b61792016-01-22 16:43:48 -08004493 if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: " + this + ", trying: " + r);
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004494 if (r.token == token) {
4495 target = r;
4496 if (pendingResults != null) {
4497 if (r.pendingResults != null) {
4498 r.pendingResults.addAll(pendingResults);
4499 } else {
4500 r.pendingResults = pendingResults;
4501 }
4502 }
4503 if (pendingNewIntents != null) {
4504 if (r.pendingIntents != null) {
4505 r.pendingIntents.addAll(pendingNewIntents);
4506 } else {
4507 r.pendingIntents = pendingNewIntents;
4508 }
4509 }
Jorim Jaggife89d122015-12-22 16:28:44 +01004510
4511 // For each relaunch request, activity manager expects an answer
4512 if (!r.onlyLocalRequest && fromServer) {
4513 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08004514 ActivityManager.getService().activityRelaunched(token);
Jorim Jaggife89d122015-12-22 16:28:44 +01004515 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07004516 throw e.rethrowFromSystemServer();
Jorim Jaggife89d122015-12-22 16:28:44 +01004517 }
4518 }
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004519 break;
4520 }
4521 }
4522
4523 if (target == null) {
Filip Gruszczynskic3b61792016-01-22 16:43:48 -08004524 if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: target is null, fromServer:"
4525 + fromServer);
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004526 target = new ActivityClientRecord();
4527 target.token = token;
4528 target.pendingResults = pendingResults;
4529 target.pendingIntents = pendingNewIntents;
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07004530 target.mPreserveWindow = preserveWindow;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004531 if (!fromServer) {
Filip Gruszczynskic3b61792016-01-22 16:43:48 -08004532 final ActivityClientRecord existing = mActivities.get(token);
4533 if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: " + existing);
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004534 if (existing != null) {
Filip Gruszczynskic3b61792016-01-22 16:43:48 -08004535 if (DEBUG_ORDER) Slog.d(TAG, "requestRelaunchActivity: paused= "
4536 + existing.paused);;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004537 target.startsNotResumed = existing.paused;
Wale Ogunwale93f543c2015-02-17 16:55:03 -08004538 target.overrideConfig = existing.overrideConfig;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004539 }
4540 target.onlyLocalRequest = true;
4541 }
4542 mRelaunchingActivities.add(target);
Jeff Brown9ef09972013-10-15 20:49:59 -07004543 sendMessage(H.RELAUNCH_ACTIVITY, target);
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004544 }
4545
4546 if (fromServer) {
4547 target.startsNotResumed = notResumed;
4548 target.onlyLocalRequest = false;
4549 }
4550 if (config != null) {
4551 target.createdConfig = config;
4552 }
Wale Ogunwale60454db2015-01-23 16:05:07 -08004553 if (overrideConfig != null) {
4554 target.overrideConfig = overrideConfig;
4555 }
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004556 target.pendingConfigChanges |= configChanges;
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07004557 target.relaunchSeq = getLifecycleSeq();
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004558 }
Filip Gruszczynskic3b61792016-01-22 16:43:48 -08004559 if (DEBUG_ORDER) Slog.d(TAG, "relaunchActivity " + ActivityThread.this + ", target "
4560 + target + " operation received seq: " + target.relaunchSeq);
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004561 }
4562
Romain Guy65b345f2011-07-27 18:51:50 -07004563 private void handleRelaunchActivity(ActivityClientRecord tmp) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004564 // If we are getting ready to gc after going to the background, well
4565 // we are back active so skip it.
4566 unscheduleGcIdler();
Dianne Hackborn89ad4562014-08-24 16:45:38 -07004567 mSomeActivitiesChanged = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004568
4569 Configuration changedConfig = null;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004570 int configChanges = 0;
Bob Leee5408332009-09-04 18:31:17 -07004571
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004572 // First: make sure we have the most recent configuration and most
4573 // recent version of the activity, or skip it if some previous call
4574 // had taken a more recent version.
Craig Mautner88c05892013-06-28 09:47:45 -07004575 synchronized (mResourcesManager) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004576 int N = mRelaunchingActivities.size();
4577 IBinder token = tmp.token;
4578 tmp = null;
4579 for (int i=0; i<N; i++) {
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07004580 ActivityClientRecord r = mRelaunchingActivities.get(i);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004581 if (r.token == token) {
4582 tmp = r;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004583 configChanges |= tmp.pendingConfigChanges;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004584 mRelaunchingActivities.remove(i);
4585 i--;
4586 N--;
4587 }
4588 }
Bob Leee5408332009-09-04 18:31:17 -07004589
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004590 if (tmp == null) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07004591 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Abort, activity not relaunching!");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004592 return;
4593 }
Bob Leee5408332009-09-04 18:31:17 -07004594
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004595 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Relaunching activity "
4596 + tmp.token + " with configChanges=0x"
4597 + Integer.toHexString(configChanges));
4598
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004599 if (mPendingConfiguration != null) {
4600 changedConfig = mPendingConfiguration;
4601 mPendingConfiguration = null;
4602 }
4603 }
Bob Leee5408332009-09-04 18:31:17 -07004604
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07004605 if (tmp.lastProcessedSeq > tmp.relaunchSeq) {
4606 Slog.wtf(TAG, "For some reason target: " + tmp + " has lower sequence: "
4607 + tmp.relaunchSeq + " than current sequence: " + tmp.lastProcessedSeq);
4608 } else {
4609 tmp.lastProcessedSeq = tmp.relaunchSeq;
4610 }
Dianne Hackborn871ecdc2009-12-11 15:24:33 -08004611 if (tmp.createdConfig != null) {
4612 // If the activity manager is passing us its current config,
4613 // assume that is really what we want regardless of what we
4614 // may have pending.
4615 if (mConfiguration == null
Dianne Hackborne36d6e22010-02-17 19:46:25 -08004616 || (tmp.createdConfig.isOtherSeqNewer(mConfiguration)
4617 && mConfiguration.diff(tmp.createdConfig) != 0)) {
4618 if (changedConfig == null
4619 || tmp.createdConfig.isOtherSeqNewer(changedConfig)) {
4620 changedConfig = tmp.createdConfig;
4621 }
Dianne Hackborn871ecdc2009-12-11 15:24:33 -08004622 }
4623 }
Tim Murraye1e6c662015-04-07 13:24:14 -07004624
Dianne Hackborn399cccb2010-04-13 22:57:49 -07004625 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Relaunching activity "
Dianne Hackborndc6b6352009-09-30 14:20:09 -07004626 + tmp.token + ": changedConfig=" + changedConfig);
Tim Murraye1e6c662015-04-07 13:24:14 -07004627
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004628 // If there was a pending configuration change, execute it first.
4629 if (changedConfig != null) {
Dianne Hackborn908aecc2012-07-31 16:37:34 -07004630 mCurDefaultDisplayDpi = changedConfig.densityDpi;
Dianne Hackborndde331c2012-08-03 14:01:57 -07004631 updateDefaultDensity();
Dianne Hackborne2515ee2011-04-27 18:52:56 -04004632 handleConfigurationChanged(changedConfig, null);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004633 }
Bob Leee5408332009-09-04 18:31:17 -07004634
Dianne Hackborn01e4cfc2010-06-24 15:07:24 -07004635 ActivityClientRecord r = mActivities.get(tmp.token);
Dianne Hackborn399cccb2010-04-13 22:57:49 -07004636 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handling relaunch of " + r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004637 if (r == null) {
Jorim Jaggife89d122015-12-22 16:28:44 +01004638 if (!tmp.onlyLocalRequest) {
4639 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08004640 ActivityManager.getService().activityRelaunched(tmp.token);
Jorim Jaggife89d122015-12-22 16:28:44 +01004641 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07004642 throw e.rethrowFromSystemServer();
Jorim Jaggife89d122015-12-22 16:28:44 +01004643 }
4644 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004645 return;
4646 }
Bob Leee5408332009-09-04 18:31:17 -07004647
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004648 r.activity.mConfigChangeFlags |= configChanges;
Dianne Hackborn30c9bd82010-12-01 16:07:40 -08004649 r.onlyLocalRequest = tmp.onlyLocalRequest;
Filip Gruszczynskia59ac9c2015-09-10 18:28:48 -07004650 r.mPreserveWindow = tmp.mPreserveWindow;
Filip Gruszczynskidb5dec22015-10-11 15:17:48 -07004651 r.lastProcessedSeq = tmp.lastProcessedSeq;
4652 r.relaunchSeq = tmp.relaunchSeq;
Christopher Tateb70f3df2009-04-07 16:07:59 -07004653 Intent currentIntent = r.activity.mIntent;
Bob Leee5408332009-09-04 18:31:17 -07004654
Dianne Hackborn0aae2d42010-12-07 23:51:29 -08004655 r.activity.mChangingConfigurations = true;
4656
Robert Carr23fa16b2016-01-13 13:19:58 -08004657 // If we are preserving the main window across relaunches we would also like to preserve
4658 // the children. However the client side view system does not support preserving
4659 // the child views so we notify the window manager to expect these windows to
4660 // be replaced and defer requests to destroy or hide them. This way we can achieve
4661 // visual continuity. It's important that we do this here prior to pause and destroy
4662 // as that is when we may hide or remove the child views.
Robert Carr77bdfb52016-05-02 18:18:31 -07004663 //
4664 // There is another scenario, if we have decided locally to relaunch the app from a
4665 // call to recreate, then none of the windows will be prepared for replacement or
4666 // preserved by the server, so we want to notify it that we are preparing to replace
4667 // everything
Robert Carr23fa16b2016-01-13 13:19:58 -08004668 try {
Robert Carr77bdfb52016-05-02 18:18:31 -07004669 if (r.mPreserveWindow || r.onlyLocalRequest) {
4670 WindowManagerGlobal.getWindowSession().prepareToReplaceWindows(
4671 r.token, !r.onlyLocalRequest);
Robert Carr23fa16b2016-01-13 13:19:58 -08004672 }
4673 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07004674 throw e.rethrowFromSystemServer();
Robert Carr23fa16b2016-01-13 13:19:58 -08004675 }
4676
Dianne Hackborne2b04802010-12-09 09:24:55 -08004677 // Need to ensure state is saved.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004678 if (!r.paused) {
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08004679 performPauseActivity(r.token, false, r.isPreHoneycomb(), "handleRelaunchActivity");
Dianne Hackborne2b04802010-12-09 09:24:55 -08004680 }
4681 if (r.state == null && !r.stopped && !r.isPreHoneycomb()) {
Craig Mautnera0026042014-04-23 11:45:37 -07004682 callCallActivityOnSaveInstanceState(r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004683 }
Bob Leee5408332009-09-04 18:31:17 -07004684
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004685 handleDestroyActivity(r.token, false, configChanges, true);
Bob Leee5408332009-09-04 18:31:17 -07004686
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004687 r.activity = null;
4688 r.window = null;
4689 r.hideForNow = false;
4690 r.nextIdle = null;
The Android Open Source Project10592532009-03-18 17:39:46 -07004691 // Merge any pending results and pending intents; don't just replace them
4692 if (tmp.pendingResults != null) {
4693 if (r.pendingResults == null) {
4694 r.pendingResults = tmp.pendingResults;
4695 } else {
4696 r.pendingResults.addAll(tmp.pendingResults);
4697 }
4698 }
4699 if (tmp.pendingIntents != null) {
4700 if (r.pendingIntents == null) {
4701 r.pendingIntents = tmp.pendingIntents;
4702 } else {
4703 r.pendingIntents.addAll(tmp.pendingIntents);
4704 }
4705 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004706 r.startsNotResumed = tmp.startsNotResumed;
Wale Ogunwale60454db2015-01-23 16:05:07 -08004707 r.overrideConfig = tmp.overrideConfig;
Bob Leee5408332009-09-04 18:31:17 -07004708
Wale Ogunwalecd7043e2016-02-27 17:37:46 -08004709 handleLaunchActivity(r, currentIntent, "handleRelaunchActivity");
Jorim Jaggife89d122015-12-22 16:28:44 +01004710
4711 if (!tmp.onlyLocalRequest) {
4712 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08004713 ActivityManager.getService().activityRelaunched(r.token);
Jorim Jaggi4846ee32016-01-07 17:39:12 +01004714 if (r.window != null) {
4715 r.window.reportActivityRelaunched();
4716 }
Jorim Jaggife89d122015-12-22 16:28:44 +01004717 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07004718 throw e.rethrowFromSystemServer();
Jorim Jaggife89d122015-12-22 16:28:44 +01004719 }
4720 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004721 }
4722
Craig Mautnera0026042014-04-23 11:45:37 -07004723 private void callCallActivityOnSaveInstanceState(ActivityClientRecord r) {
4724 r.state = new Bundle();
4725 r.state.setAllowFds(false);
4726 if (r.isPersistable()) {
4727 r.persistentState = new PersistableBundle();
4728 mInstrumentation.callActivityOnSaveInstanceState(r.activity, r.state,
4729 r.persistentState);
4730 } else {
4731 mInstrumentation.callActivityOnSaveInstanceState(r.activity, r.state);
4732 }
4733 }
4734
Dianne Hackborn73c14162012-09-19 15:45:06 -07004735 ArrayList<ComponentCallbacks2> collectComponentCallbacks(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004736 boolean allActivities, Configuration newConfig) {
Dianne Hackbornc68c9132011-07-29 01:25:18 -07004737 ArrayList<ComponentCallbacks2> callbacks
4738 = new ArrayList<ComponentCallbacks2>();
Bob Leee5408332009-09-04 18:31:17 -07004739
Craig Mautner88c05892013-06-28 09:47:45 -07004740 synchronized (mResourcesManager) {
Dianne Hackbornadd005c2013-07-17 18:43:12 -07004741 final int NAPP = mAllApplications.size();
4742 for (int i=0; i<NAPP; i++) {
Dianne Hackborn73c14162012-09-19 15:45:06 -07004743 callbacks.add(mAllApplications.get(i));
4744 }
Dianne Hackbornadd005c2013-07-17 18:43:12 -07004745 final int NACT = mActivities.size();
4746 for (int i=0; i<NACT; i++) {
4747 ActivityClientRecord ar = mActivities.valueAt(i);
4748 Activity a = ar.activity;
4749 if (a != null) {
4750 Configuration thisConfig = applyConfigCompatMainThread(
4751 mCurDefaultDisplayDpi, newConfig,
4752 ar.packageInfo.getCompatibilityInfo());
4753 if (!ar.activity.mFinished && (allActivities || !ar.paused)) {
4754 // If the activity is currently resumed, its configuration
4755 // needs to change right now.
4756 callbacks.add(a);
4757 } else if (thisConfig != null) {
4758 // Otherwise, we will tell it about the change
4759 // the next time it is resumed or shown. Note that
4760 // the activity manager may, before then, decide the
4761 // activity needs to be destroyed to handle its new
4762 // configuration.
4763 if (DEBUG_CONFIGURATION) {
4764 Slog.v(TAG, "Setting activity "
4765 + ar.activityInfo.name + " newConfig=" + thisConfig);
Romain Guya998dff2012-03-23 18:58:36 -07004766 }
Dianne Hackbornadd005c2013-07-17 18:43:12 -07004767 ar.newConfig = thisConfig;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004768 }
4769 }
4770 }
Dianne Hackbornadd005c2013-07-17 18:43:12 -07004771 final int NSVC = mServices.size();
4772 for (int i=0; i<NSVC; i++) {
4773 callbacks.add(mServices.valueAt(i));
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004774 }
4775 }
4776 synchronized (mProviderMap) {
Dianne Hackbornadd005c2013-07-17 18:43:12 -07004777 final int NPRV = mLocalProviders.size();
4778 for (int i=0; i<NPRV; i++) {
4779 callbacks.add(mLocalProviders.valueAt(i).mLocalProvider);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004780 }
4781 }
Bob Leee5408332009-09-04 18:31:17 -07004782
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004783 return callbacks;
4784 }
Bob Leee5408332009-09-04 18:31:17 -07004785
Adam Lesinski082614c2016-03-04 14:33:47 -08004786 /**
4787 * Updates the configuration for an Activity. The ActivityClientRecord's
4788 * {@link ActivityClientRecord#overrideConfig} is used to compute the final Configuration for
4789 * that Activity. {@link ActivityClientRecord#tmpConfig} is used as a temporary for delivering
4790 * the updated Configuration.
4791 * @param r ActivityClientRecord representing the Activity.
4792 * @param newBaseConfig The new configuration to use. This may be augmented with
4793 * {@link ActivityClientRecord#overrideConfig}.
Adam Lesinski082614c2016-03-04 14:33:47 -08004794 */
4795 private void performConfigurationChangedForActivity(ActivityClientRecord r,
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004796 Configuration newBaseConfig) {
4797 performConfigurationChangedForActivity(r, newBaseConfig,
4798 r.activity.getDisplay().getDisplayId(), false /* movedToDifferentDisplay */);
4799 }
4800
4801 /**
4802 * Updates the configuration for an Activity. The ActivityClientRecord's
4803 * {@link ActivityClientRecord#overrideConfig} is used to compute the final Configuration for
4804 * that Activity. {@link ActivityClientRecord#tmpConfig} is used as a temporary for delivering
4805 * the updated Configuration.
4806 * @param r ActivityClientRecord representing the Activity.
4807 * @param newBaseConfig The new configuration to use. This may be augmented with
4808 * {@link ActivityClientRecord#overrideConfig}.
4809 * @param displayId The id of the display where the Activity currently resides.
4810 * @param movedToDifferentDisplay Indicates if the activity was moved to different display.
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004811 * @return {@link Configuration} instance sent to client, null if not sent.
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004812 */
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004813 private Configuration performConfigurationChangedForActivity(ActivityClientRecord r,
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004814 Configuration newBaseConfig, int displayId, boolean movedToDifferentDisplay) {
Adam Lesinski082614c2016-03-04 14:33:47 -08004815 r.tmpConfig.setTo(newBaseConfig);
4816 if (r.overrideConfig != null) {
4817 r.tmpConfig.updateFrom(r.overrideConfig);
4818 }
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004819 final Configuration reportedConfig = performActivityConfigurationChanged(r.activity,
4820 r.tmpConfig, r.overrideConfig, displayId, movedToDifferentDisplay);
Adam Lesinski082614c2016-03-04 14:33:47 -08004821 freeTextLayoutCachesIfNeeded(r.activity.mCurrentConfig.diff(r.tmpConfig));
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004822 return reportedConfig;
Adam Lesinski082614c2016-03-04 14:33:47 -08004823 }
4824
4825 /**
Adam Lesinskic1b0ebf2016-06-09 11:17:10 -07004826 * Creates a new Configuration only if override would modify base. Otherwise returns base.
4827 * @param base The base configuration.
4828 * @param override The update to apply to the base configuration. Can be null.
4829 * @return A Configuration representing base with override applied.
4830 */
4831 private static Configuration createNewConfigAndUpdateIfNotNull(@NonNull Configuration base,
4832 @Nullable Configuration override) {
4833 if (override == null) {
4834 return base;
4835 }
4836 Configuration newConfig = new Configuration(base);
4837 newConfig.updateFrom(override);
4838 return newConfig;
4839 }
4840
4841 /**
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004842 * Decides whether to update a component's configuration and whether to inform it.
Adam Lesinski082614c2016-03-04 14:33:47 -08004843 * @param cb The component callback to notify of configuration change.
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004844 * @param newConfig The new configuration.
4845 */
4846 private void performConfigurationChanged(ComponentCallbacks2 cb, Configuration newConfig) {
4847 if (!REPORT_TO_ACTIVITY) {
4848 return;
4849 }
4850
4851 // ContextThemeWrappers may override the configuration for that context. We must check and
4852 // apply any overrides defined.
4853 Configuration contextThemeWrapperOverrideConfig = null;
4854 if (cb instanceof ContextThemeWrapper) {
4855 final ContextThemeWrapper contextThemeWrapper = (ContextThemeWrapper) cb;
4856 contextThemeWrapperOverrideConfig = contextThemeWrapper.getOverrideConfiguration();
4857 }
4858
4859 // Apply the ContextThemeWrapper override if necessary.
4860 // NOTE: Make sure the configurations are not modified, as they are treated as immutable
4861 // in many places.
4862 final Configuration configToReport = createNewConfigAndUpdateIfNotNull(
4863 newConfig, contextThemeWrapperOverrideConfig);
4864 cb.onConfigurationChanged(configToReport);
4865 }
4866
4867 /**
4868 * Decides whether to update an Activity's configuration and whether to inform it.
4869 * @param activity The activity to notify of configuration change.
Adam Lesinski082614c2016-03-04 14:33:47 -08004870 * @param newConfig The new configuration.
Adam Lesinskic1b0ebf2016-06-09 11:17:10 -07004871 * @param amOverrideConfig The override config that differentiates the Activity's configuration
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004872 * from the base global configuration. This is supplied by
4873 * ActivityManager.
4874 * @param displayId Id of the display where activity currently resides.
4875 * @param movedToDifferentDisplay Indicates if the activity was moved to different display.
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004876 * @return Configuration sent to client, null if no changes and not moved to different display.
Adam Lesinski082614c2016-03-04 14:33:47 -08004877 */
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004878 private Configuration performActivityConfigurationChanged(Activity activity,
4879 Configuration newConfig, Configuration amOverrideConfig, int displayId,
4880 boolean movedToDifferentDisplay) {
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004881 if (activity == null) {
4882 throw new IllegalArgumentException("No activity provided.");
4883 }
4884 final IBinder activityToken = activity.getActivityToken();
4885 if (activityToken == null) {
4886 throw new IllegalArgumentException("Activity token not set. Is the activity attached?");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004887 }
Bob Leee5408332009-09-04 18:31:17 -07004888
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004889 boolean shouldChangeConfig = false;
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004890 if (activity.mCurrentConfig == null) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004891 shouldChangeConfig = true;
4892 } else {
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004893 // If the new config is the same as the config this Activity is already running with and
4894 // the override config also didn't change, then don't bother calling
4895 // onConfigurationChanged.
Bryce Lee658d9842017-07-28 08:33:36 -07004896 final int diff = activity.mCurrentConfig.diffPublicOnly(newConfig);
4897
Andrii Kulian3b3c9142016-07-18 19:15:56 -07004898 if (diff != 0 || !mResourcesManager.isSameResourcesOverrideConfig(activityToken,
4899 amOverrideConfig)) {
Chong Zhang4951f9d2016-06-23 13:15:08 -07004900 // Always send the task-level config changes. For system-level configuration, if
4901 // this activity doesn't handle any of the config changes, then don't bother
4902 // calling onConfigurationChanged as we're going to destroy it.
4903 if (!mUpdatingSystemConfig
4904 || (~activity.mActivityInfo.getRealConfigChanged() & diff) == 0
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004905 || !REPORT_TO_ACTIVITY) {
Chong Zhang4951f9d2016-06-23 13:15:08 -07004906 shouldChangeConfig = true;
4907 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004908 }
4909 }
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004910 if (!shouldChangeConfig && !movedToDifferentDisplay) {
4911 // Nothing significant, don't proceed with updating and reporting.
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004912 return null;
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004913 }
4914
4915 // Propagate the configuration change to ResourcesManager and Activity.
4916
4917 // ContextThemeWrappers may override the configuration for that context. We must check and
4918 // apply any overrides defined.
4919 Configuration contextThemeWrapperOverrideConfig = activity.getOverrideConfiguration();
4920
4921 // We only update an Activity's configuration if this is not a global configuration change.
4922 // This must also be done before the callback, or else we violate the contract that the new
4923 // resources are available in ComponentCallbacks2#onConfigurationChanged(Configuration).
4924 // Also apply the ContextThemeWrapper override if necessary.
4925 // NOTE: Make sure the configurations are not modified, as they are treated as immutable in
4926 // many places.
4927 final Configuration finalOverrideConfig = createNewConfigAndUpdateIfNotNull(
4928 amOverrideConfig, contextThemeWrapperOverrideConfig);
4929 mResourcesManager.updateResourcesForActivity(activityToken, finalOverrideConfig,
4930 displayId, movedToDifferentDisplay);
4931
4932 activity.mConfigChangeFlags = 0;
4933 activity.mCurrentConfig = new Configuration(newConfig);
4934
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004935 // Apply the ContextThemeWrapper override if necessary.
4936 // NOTE: Make sure the configurations are not modified, as they are treated as immutable
4937 // in many places.
4938 final Configuration configToReport = createNewConfigAndUpdateIfNotNull(newConfig,
4939 contextThemeWrapperOverrideConfig);
4940
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004941 if (!REPORT_TO_ACTIVITY) {
4942 // Not configured to report to activity.
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004943 return configToReport;
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004944 }
4945
4946 if (movedToDifferentDisplay) {
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004947 activity.dispatchMovedToDisplay(displayId, configToReport);
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004948 }
Bob Leee5408332009-09-04 18:31:17 -07004949
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004950 if (shouldChangeConfig) {
Andrii Kulianb047b8b2017-02-08 18:38:26 -08004951 activity.mCalled = false;
4952 activity.onConfigurationChanged(configToReport);
4953 if (!activity.mCalled) {
4954 throw new SuperNotCalledException("Activity " + activity.getLocalClassName() +
4955 " did not call through to super.onConfigurationChanged()");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004956 }
4957 }
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07004958
4959 return configToReport;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08004960 }
4961
Dianne Hackborn2f0b1752011-05-31 17:59:49 -07004962 public final void applyConfigurationToResources(Configuration config) {
Craig Mautner88c05892013-06-28 09:47:45 -07004963 synchronized (mResourcesManager) {
4964 mResourcesManager.applyConfigurationToResourcesLocked(config, null);
Dianne Hackborn2f0b1752011-05-31 17:59:49 -07004965 }
4966 }
4967
Dianne Hackborn908aecc2012-07-31 16:37:34 -07004968 final Configuration applyCompatConfiguration(int displayDensity) {
Dianne Hackborn836e2622011-10-04 18:32:39 -07004969 Configuration config = mConfiguration;
4970 if (mCompatConfiguration == null) {
4971 mCompatConfiguration = new Configuration();
4972 }
4973 mCompatConfiguration.setTo(mConfiguration);
Adam Lesinski082614c2016-03-04 14:33:47 -08004974 if (mResourcesManager.applyCompatConfigurationLocked(displayDensity,
4975 mCompatConfiguration)) {
Dianne Hackborn836e2622011-10-04 18:32:39 -07004976 config = mCompatConfiguration;
4977 }
4978 return config;
4979 }
4980
Dianne Hackborne2515ee2011-04-27 18:52:56 -04004981 final void handleConfigurationChanged(Configuration config, CompatibilityInfo compat) {
Dianne Hackborne36d6e22010-02-17 19:46:25 -08004982
Fabrice Di Meglio30ca5cd2012-05-07 17:45:44 -07004983 int configDiff = 0;
Dianne Hackborne36d6e22010-02-17 19:46:25 -08004984
Bryce Lee658d9842017-07-28 08:33:36 -07004985 // This flag tracks whether the new configuration is fundamentally equivalent to the
4986 // existing configuration. This is necessary to determine whether non-activity
4987 // callbacks should receive notice when the only changes are related to non-public fields.
4988 // We do not gate calling {@link #performActivityConfigurationChanged} based on this flag
4989 // as that method uses the same check on the activity config override as well.
4990 final boolean equivalent = config != null && mConfiguration != null
4991 && (0 == mConfiguration.diffPublicOnly(config));
4992
Craig Mautner88c05892013-06-28 09:47:45 -07004993 synchronized (mResourcesManager) {
Dianne Hackborne36d6e22010-02-17 19:46:25 -08004994 if (mPendingConfiguration != null) {
4995 if (!mPendingConfiguration.isOtherSeqNewer(config)) {
4996 config = mPendingConfiguration;
Dianne Hackborn908aecc2012-07-31 16:37:34 -07004997 mCurDefaultDisplayDpi = config.densityDpi;
Dianne Hackborndde331c2012-08-03 14:01:57 -07004998 updateDefaultDensity();
Dianne Hackborne36d6e22010-02-17 19:46:25 -08004999 }
5000 mPendingConfiguration = null;
5001 }
5002
5003 if (config == null) {
5004 return;
5005 }
Tim Murraye1e6c662015-04-07 13:24:14 -07005006
Dianne Hackborn399cccb2010-04-13 22:57:49 -07005007 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle configuration changed: "
Dianne Hackborne36d6e22010-02-17 19:46:25 -08005008 + config);
Craig Mautner88c05892013-06-28 09:47:45 -07005009
5010 mResourcesManager.applyConfigurationToResourcesLocked(config, compat);
Adam Lesinskib61e4052016-05-19 18:23:05 -07005011 updateLocaleListFromAppContext(mInitialApplication.getApplicationContext(),
5012 mResourcesManager.getConfiguration().getLocales());
Craig Mautner88c05892013-06-28 09:47:45 -07005013
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005014 if (mConfiguration == null) {
5015 mConfiguration = new Configuration();
5016 }
Dianne Hackborne2515ee2011-04-27 18:52:56 -04005017 if (!mConfiguration.isOtherSeqNewer(config) && compat == null) {
Dianne Hackborne36d6e22010-02-17 19:46:25 -08005018 return;
5019 }
Alan Viverettee54d2452015-05-06 10:41:43 -07005020
5021 configDiff = mConfiguration.updateFrom(config);
Dianne Hackborn908aecc2012-07-31 16:37:34 -07005022 config = applyCompatConfiguration(mCurDefaultDisplayDpi);
Alan Viverette395cd012015-08-11 17:27:04 -04005023
5024 final Theme systemTheme = getSystemContext().getTheme();
5025 if ((systemTheme.getChangingConfigurations() & configDiff) != 0) {
5026 systemTheme.rebase();
5027 }
Adam Lesinskia82b6262017-03-21 16:56:17 -07005028
5029 final Theme systemUiTheme = getSystemUiContext().getTheme();
5030 if ((systemUiTheme.getChangingConfigurations() & configDiff) != 0) {
5031 systemUiTheme.rebase();
5032 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005033 }
Dianne Hackborn73c14162012-09-19 15:45:06 -07005034
5035 ArrayList<ComponentCallbacks2> callbacks = collectComponentCallbacks(false, config);
5036
Fabrice Di Meglio30ca5cd2012-05-07 17:45:44 -07005037 freeTextLayoutCachesIfNeeded(configDiff);
5038
Dianne Hackborne36d6e22010-02-17 19:46:25 -08005039 if (callbacks != null) {
5040 final int N = callbacks.size();
5041 for (int i=0; i<N; i++) {
Andrii Kulian701214b2016-04-07 09:36:33 -07005042 ComponentCallbacks2 cb = callbacks.get(i);
5043 if (cb instanceof Activity) {
5044 // If callback is an Activity - call corresponding method to consider override
5045 // config and avoid onConfigurationChanged if it hasn't changed.
5046 Activity a = (Activity) cb;
5047 performConfigurationChangedForActivity(mActivities.get(a.getActivityToken()),
Andrii Kulianb047b8b2017-02-08 18:38:26 -08005048 config);
Bryce Lee658d9842017-07-28 08:33:36 -07005049 } else if (!equivalent) {
Andrii Kulianb047b8b2017-02-08 18:38:26 -08005050 performConfigurationChanged(cb, config);
Andrii Kulian701214b2016-04-07 09:36:33 -07005051 }
Dianne Hackborne36d6e22010-02-17 19:46:25 -08005052 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005053 }
5054 }
5055
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01005056 void handleApplicationInfoChanged(@NonNull final ApplicationInfo ai) {
Adam Lesinskid33ef562017-01-19 14:49:59 -08005057 // Updates triggered by package installation go through a package update
5058 // receiver. Here we try to capture ApplicationInfo changes that are
5059 // caused by other sources, such as overlays. That means we want to be as conservative
5060 // about code changes as possible. Take the diff of the old ApplicationInfo and the new
5061 // to see if anything needs to change.
Fyodor Kupolovb7865ce2017-05-05 15:08:03 -07005062 LoadedApk apk;
5063 LoadedApk resApk;
5064 // Update all affected loaded packages with new package information
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01005065 synchronized (mResourcesManager) {
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01005066 WeakReference<LoadedApk> ref = mPackages.get(ai.packageName);
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01005067 apk = ref != null ? ref.get() : null;
Fyodor Kupolovb7865ce2017-05-05 15:08:03 -07005068 ref = mResourcePackages.get(ai.packageName);
5069 resApk = ref != null ? ref.get() : null;
5070 }
5071 if (apk != null) {
5072 final ArrayList<String> oldPaths = new ArrayList<>();
5073 LoadedApk.makePaths(this, apk.getApplicationInfo(), oldPaths);
5074 apk.updateApplicationInfo(ai, oldPaths);
5075 }
5076 if (resApk != null) {
5077 final ArrayList<String> oldPaths = new ArrayList<>();
5078 LoadedApk.makePaths(this, resApk.getApplicationInfo(), oldPaths);
5079 resApk.updateApplicationInfo(ai, oldPaths);
5080 }
5081 synchronized (mResourcesManager) {
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01005082 // Update all affected Resources objects to use new ResourcesImpl
5083 mResourcesManager.applyNewResourceDirsLocked(ai.sourceDir, ai.resourceDirs);
5084 }
5085
5086 ApplicationPackageManager.configurationChanged();
5087
5088 // Trigger a regular Configuration change event, only with a different assetsSeq number
5089 // so that we actually call through to all components.
Adam Lesinskia82b6262017-03-21 16:56:17 -07005090 // TODO(adamlesinski): Change this to make use of ActivityManager's upcoming ability to
5091 // store configurations per-process.
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01005092 Configuration newConfig = new Configuration();
Adam Lesinskia82b6262017-03-21 16:56:17 -07005093 newConfig.assetsSeq = (mConfiguration != null ? mConfiguration.assetsSeq : 0) + 1;
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01005094 handleConfigurationChanged(newConfig, null);
5095
Fyodor Kupolovcb93d6f2017-05-04 17:27:16 -07005096 requestRelaunchAllActivities();
MÃ¥rten Kongstad49a4a1d2017-01-12 08:36:37 +01005097 }
5098
Romain Guy46bfc482013-08-16 18:38:29 -07005099 static void freeTextLayoutCachesIfNeeded(int configDiff) {
Fabrice Di Meglio30ca5cd2012-05-07 17:45:44 -07005100 if (configDiff != 0) {
5101 // Ask text layout engine to free its caches if there is a locale change
5102 boolean hasLocaleConfigChange = ((configDiff & ActivityInfo.CONFIG_LOCALE) != 0);
5103 if (hasLocaleConfigChange) {
5104 Canvas.freeTextLayoutCaches();
5105 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Cleared TextLayout Caches");
5106 }
5107 }
5108 }
5109
Andrii Kulianb047b8b2017-02-08 18:38:26 -08005110 /**
5111 * Handle new activity configuration and/or move to a different display.
5112 * @param data Configuration update data.
5113 * @param displayId Id of the display where activity was moved to, -1 if there was no move and
5114 * value didn't change.
5115 */
Andrii Kulian44607962017-03-16 11:06:24 -07005116 void handleActivityConfigurationChanged(ActivityConfigChangeData data, int displayId) {
Wale Ogunwalec2607b42015-02-07 16:16:59 -08005117 ActivityClientRecord r = mActivities.get(data.activityToken);
Andrii Kulianb047b8b2017-02-08 18:38:26 -08005118 // Check input params.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005119 if (r == null || r.activity == null) {
Andrii Kulianb047b8b2017-02-08 18:38:26 -08005120 if (DEBUG_CONFIGURATION) Slog.w(TAG, "Not found target activity to report to: " + r);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005121 return;
5122 }
Andrii Kulian51c1b672017-04-07 18:39:32 -07005123 final boolean movedToDifferentDisplay = displayId != INVALID_DISPLAY
5124 && displayId != r.activity.getDisplay().getDisplayId();
Bob Leee5408332009-09-04 18:31:17 -07005125
Andrii Kulianb047b8b2017-02-08 18:38:26 -08005126 // Perform updates.
Adam Lesinski082614c2016-03-04 14:33:47 -08005127 r.overrideConfig = data.overrideConfig;
Stephen Kiazykf903b732017-03-20 16:23:45 -07005128 final ViewRootImpl viewRoot = r.activity.mDecor != null
5129 ? r.activity.mDecor.getViewRootImpl() : null;
5130
Andrii Kulianb047b8b2017-02-08 18:38:26 -08005131 if (movedToDifferentDisplay) {
5132 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle activity moved to display, activity:"
5133 + r.activityInfo.name + ", displayId=" + displayId
5134 + ", config=" + data.overrideConfig);
5135
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07005136 final Configuration reportedConfig = performConfigurationChangedForActivity(r,
5137 mCompatConfiguration, displayId, true /* movedToDifferentDisplay */);
Andrii Kuliance1ecf12017-03-17 14:58:36 -07005138 if (viewRoot != null) {
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07005139 viewRoot.onMovedToDisplay(displayId, reportedConfig);
Andrii Kuliance1ecf12017-03-17 14:58:36 -07005140 }
Andrii Kulianb047b8b2017-02-08 18:38:26 -08005141 } else {
5142 if (DEBUG_CONFIGURATION) Slog.v(TAG, "Handle activity config changed: "
5143 + r.activityInfo.name + ", config=" + data.overrideConfig);
5144 performConfigurationChangedForActivity(r, mCompatConfiguration);
5145 }
Andrii Kulian44607962017-03-16 11:06:24 -07005146 // Notify the ViewRootImpl instance about configuration changes. It may have initiated this
5147 // update to make sure that resources are updated before updating itself.
Andrii Kuliance1ecf12017-03-17 14:58:36 -07005148 if (viewRoot != null) {
Andrii Kuliane5c58ee2017-03-27 19:25:24 -07005149 viewRoot.updateConfiguration(displayId);
Andrii Kuliance1ecf12017-03-17 14:58:36 -07005150 }
Dianne Hackborn89ad4562014-08-24 16:45:38 -07005151 mSomeActivitiesChanged = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005152 }
5153
Jeff Hao1b012d32014-08-20 10:35:34 -07005154 final void handleProfilerControl(boolean start, ProfilerInfo profilerInfo, int profileType) {
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08005155 if (start) {
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08005156 try {
Romain Guy7eabe552011-07-21 14:56:34 -07005157 switch (profileType) {
Jeff Hao1b012d32014-08-20 10:35:34 -07005158 default:
5159 mProfiler.setProfiler(profilerInfo);
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07005160 mProfiler.startProfiling();
Romain Guy7eabe552011-07-21 14:56:34 -07005161 break;
5162 }
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08005163 } catch (RuntimeException e) {
Jeff Hao1b012d32014-08-20 10:35:34 -07005164 Slog.w(TAG, "Profiling failed on path " + profilerInfo.profileFile
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08005165 + " -- can the process access this path?");
Dianne Hackborn9c8dd552009-06-23 19:22:52 -07005166 } finally {
Andreas Gampe2b073a02017-06-22 17:28:57 -07005167 profilerInfo.closeFd();
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08005168 }
5169 } else {
Romain Guy7eabe552011-07-21 14:56:34 -07005170 switch (profileType) {
Romain Guy7eabe552011-07-21 14:56:34 -07005171 default:
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07005172 mProfiler.stopProfiling();
Romain Guy7eabe552011-07-21 14:56:34 -07005173 break;
Romain Guy7eabe552011-07-21 14:56:34 -07005174 }
The Android Open Source Projectf5b4b982009-03-05 20:00:43 -08005175 }
5176 }
Bob Leee5408332009-09-04 18:31:17 -07005177
Andreas Gampe4c79fea2016-01-28 20:11:41 -08005178 /**
5179 * Public entrypoint to stop profiling. This is required to end profiling when the app crashes,
5180 * so that profiler data won't be lost.
5181 *
5182 * @hide
5183 */
5184 public void stopProfiling() {
Amith Yamasanib1684432017-01-26 14:57:20 -08005185 if (mProfiler != null) {
5186 mProfiler.stopProfiling();
5187 }
Andreas Gampe4c79fea2016-01-28 20:11:41 -08005188 }
5189
Christopher Ferris8d652f82017-04-11 16:29:18 -07005190 static void handleDumpHeap(DumpHeapData dhd) {
Makoto Onuki4556b7b2017-07-07 14:58:58 -07005191 if (dhd.runGc) {
5192 System.gc();
5193 System.runFinalization();
5194 System.gc();
5195 }
Christopher Ferris8d652f82017-04-11 16:29:18 -07005196 if (dhd.managed) {
Andy McFadden824c5102010-07-09 16:26:57 -07005197 try {
5198 Debug.dumpHprofData(dhd.path, dhd.fd.getFileDescriptor());
5199 } catch (IOException e) {
5200 Slog.w(TAG, "Managed heap dump failed on path " + dhd.path
5201 + " -- can the process access this path?");
5202 } finally {
5203 try {
5204 dhd.fd.close();
5205 } catch (IOException e) {
5206 Slog.w(TAG, "Failure closing profile fd", e);
5207 }
5208 }
Christopher Ferris8d652f82017-04-11 16:29:18 -07005209 } else if (dhd.mallocInfo) {
5210 Debug.dumpNativeMallocInfo(dhd.fd.getFileDescriptor());
Andy McFadden824c5102010-07-09 16:26:57 -07005211 } else {
Andy McFadden06a6b552010-07-13 16:28:09 -07005212 Debug.dumpNativeHeap(dhd.fd.getFileDescriptor());
Andy McFadden824c5102010-07-09 16:26:57 -07005213 }
Dianne Hackbornb9a5e4a2015-03-03 17:04:12 -08005214 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08005215 ActivityManager.getService().dumpHeapFinished(dhd.path);
Dianne Hackbornb9a5e4a2015-03-03 17:04:12 -08005216 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07005217 throw e.rethrowFromSystemServer();
Dianne Hackbornb9a5e4a2015-03-03 17:04:12 -08005218 }
Andy McFadden824c5102010-07-09 16:26:57 -07005219 }
5220
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07005221 final void handleDispatchPackageBroadcast(int cmd, String[] packages) {
5222 boolean hasPkgInfo = false;
Todd Kennedy39bfee52016-02-24 10:28:21 -08005223 switch (cmd) {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07005224 case ApplicationThreadConstants.PACKAGE_REMOVED:
5225 case ApplicationThreadConstants.PACKAGE_REMOVED_DONT_KILL:
Todd Kennedy39bfee52016-02-24 10:28:21 -08005226 {
Sudheer Shankacc6418f2016-10-13 12:03:44 -07005227 final boolean killApp = cmd == ApplicationThreadConstants.PACKAGE_REMOVED;
Todd Kennedy39bfee52016-02-24 10:28:21 -08005228 if (packages == null) {
5229 break;
5230 }
5231 synchronized (mResourcesManager) {
5232 for (int i = packages.length - 1; i >= 0; i--) {
5233 if (!hasPkgInfo) {
5234 WeakReference<LoadedApk> ref = mPackages.get(packages[i]);
5235 if (ref != null && ref.get() != null) {
5236 hasPkgInfo = true;
5237 } else {
5238 ref = mResourcePackages.get(packages[i]);
5239 if (ref != null && ref.get() != null) {
5240 hasPkgInfo = true;
5241 }
5242 }
5243 }
5244 if (killApp) {
5245 mPackages.remove(packages[i]);
5246 mResourcePackages.remove(packages[i]);
5247 }
5248 }
5249 }
5250 break;
5251 }
Sudheer Shankacc6418f2016-10-13 12:03:44 -07005252 case ApplicationThreadConstants.PACKAGE_REPLACED:
Todd Kennedy39bfee52016-02-24 10:28:21 -08005253 {
5254 if (packages == null) {
5255 break;
5256 }
5257 synchronized (mResourcesManager) {
5258 for (int i = packages.length - 1; i >= 0; i--) {
5259 WeakReference<LoadedApk> ref = mPackages.get(packages[i]);
5260 LoadedApk pkgInfo = ref != null ? ref.get() : null;
5261 if (pkgInfo != null) {
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07005262 hasPkgInfo = true;
mark_chen89764e32014-12-12 15:38:48 +08005263 } else {
5264 ref = mResourcePackages.get(packages[i]);
Todd Kennedy39bfee52016-02-24 10:28:21 -08005265 pkgInfo = ref != null ? ref.get() : null;
5266 if (pkgInfo != null) {
mark_chen89764e32014-12-12 15:38:48 +08005267 hasPkgInfo = true;
5268 }
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07005269 }
Todd Kennedy39bfee52016-02-24 10:28:21 -08005270 // If the package is being replaced, yet it still has a valid
5271 // LoadedApk object, the package was updated with _DONT_KILL.
5272 // Adjust it's internal references to the application info and
5273 // resources.
5274 if (pkgInfo != null) {
5275 try {
5276 final String packageName = packages[i];
5277 final ApplicationInfo aInfo =
5278 sPackageManager.getApplicationInfo(
5279 packageName,
5280 0 /*flags*/,
5281 UserHandle.myUserId());
5282
5283 if (mActivities.size() > 0) {
5284 for (ActivityClientRecord ar : mActivities.values()) {
5285 if (ar.activityInfo.applicationInfo.packageName
5286 .equals(packageName)) {
5287 ar.activityInfo.applicationInfo = aInfo;
5288 ar.packageInfo = pkgInfo;
5289 }
5290 }
5291 }
5292 final List<String> oldPaths =
5293 sPackageManager.getPreviousCodePaths(packageName);
5294 pkgInfo.updateApplicationInfo(aInfo, oldPaths);
5295 } catch (RemoteException e) {
5296 }
5297 }
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07005298 }
5299 }
Todd Kennedy39bfee52016-02-24 10:28:21 -08005300 break;
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07005301 }
5302 }
Todd Kennedy39bfee52016-02-24 10:28:21 -08005303 ApplicationPackageManager.handlePackageBroadcast(cmd, packages, hasPkgInfo);
Dianne Hackborn4416c3d2010-05-04 17:22:49 -07005304 }
Tim Murraye1e6c662015-04-07 13:24:14 -07005305
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005306 final void handleLowMemory() {
Dianne Hackborn73c14162012-09-19 15:45:06 -07005307 ArrayList<ComponentCallbacks2> callbacks = collectComponentCallbacks(true, null);
Bob Leee5408332009-09-04 18:31:17 -07005308
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005309 final int N = callbacks.size();
5310 for (int i=0; i<N; i++) {
5311 callbacks.get(i).onLowMemory();
5312 }
5313
Chris Tatece229052009-03-25 16:44:52 -07005314 // Ask SQLite to free up as much memory as it can, mostly from its page caches.
5315 if (Process.myUid() != Process.SYSTEM_UID) {
5316 int sqliteReleased = SQLiteDatabase.releaseMemory();
5317 EventLog.writeEvent(SQLITE_MEM_RELEASED_EVENT_LOG_TAG, sqliteReleased);
5318 }
Bob Leee5408332009-09-04 18:31:17 -07005319
Mike Reedcaf0df12009-04-27 14:32:05 -04005320 // Ask graphics to free up as much as possible (font/image caches)
5321 Canvas.freeCaches();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005322
Fabrice Di Meglio30ca5cd2012-05-07 17:45:44 -07005323 // Ask text layout engine to free also as much as possible
5324 Canvas.freeTextLayoutCaches();
5325
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005326 BinderInternal.forceGc("mem");
5327 }
5328
Dianne Hackbornce86ba82011-07-13 19:33:41 -07005329 final void handleTrimMemory(int level) {
Dianne Hackborn162bc0e2012-04-09 14:06:16 -07005330 if (DEBUG_MEMORY_TRIM) Slog.v(TAG, "Trimming memory to level: " + level);
Dianne Hackbornc68c9132011-07-29 01:25:18 -07005331
Dianne Hackborn73c14162012-09-19 15:45:06 -07005332 ArrayList<ComponentCallbacks2> callbacks = collectComponentCallbacks(true, null);
Dianne Hackbornc68c9132011-07-29 01:25:18 -07005333
5334 final int N = callbacks.size();
Romain Guya998dff2012-03-23 18:58:36 -07005335 for (int i = 0; i < N; i++) {
Dianne Hackbornc68c9132011-07-29 01:25:18 -07005336 callbacks.get(i).onTrimMemory(level);
5337 }
Romain Guy19f86e82012-04-23 15:19:07 -07005338
John Reckf47a5942014-06-30 16:20:04 -07005339 WindowManagerGlobal.getInstance().trimMemory(level);
Dianne Hackbornce86ba82011-07-13 19:33:41 -07005340 }
5341
Jesse Hall317fa5a2017-05-23 15:46:55 -07005342 private void setupGraphicsSupport(Context context) {
Andreas Gampe4c8e5422016-05-18 11:58:47 -07005343 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setupGraphicsSupport");
Romain Guya9582652011-11-10 14:20:10 -08005344
Jesse Hall317fa5a2017-05-23 15:46:55 -07005345 // The system package doesn't have real data directories, so don't set up cache paths.
5346 if (!"android".equals(context.getPackageName())) {
5347 // This cache location probably points at credential-encrypted
5348 // storage which may not be accessible yet; assign it anyway instead
5349 // of pointing at device-encrypted storage.
5350 final File cacheDir = context.getCacheDir();
5351 if (cacheDir != null) {
5352 // Provide a usable directory for temporary files
5353 System.setProperty("java.io.tmpdir", cacheDir.getAbsolutePath());
5354 } else {
5355 Log.v(TAG, "Unable to initialize \"java.io.tmpdir\" property "
5356 + "due to missing cache directory");
Romain Guya9582652011-11-10 14:20:10 -08005357 }
Jesse Hall317fa5a2017-05-23 15:46:55 -07005358
5359 // Setup a location to store generated/compiled graphics code.
5360 final Context deviceContext = context.createDeviceProtectedStorageContext();
5361 final File codeCacheDir = deviceContext.getCodeCacheDir();
5362 if (codeCacheDir != null) {
5363 try {
5364 int uid = Process.myUid();
5365 String[] packages = getPackageManager().getPackagesForUid(uid);
5366 if (packages != null) {
Romain Guycecbe072017-07-18 15:42:06 -07005367 ThreadedRenderer.setupDiskCache(codeCacheDir);
5368 RenderScriptCacheDir.setupDiskCache(codeCacheDir);
Jesse Hall317fa5a2017-05-23 15:46:55 -07005369 }
5370 } catch (RemoteException e) {
5371 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
5372 throw e.rethrowFromSystemServer();
5373 }
5374 } else {
5375 Log.w(TAG, "Unable to use shader/script cache: missing code-cache directory");
5376 }
Romain Guya9582652011-11-10 14:20:10 -08005377 }
Jesse Hall317fa5a2017-05-23 15:46:55 -07005378
Jesse Hallc37984f2017-05-23 16:55:08 -07005379 GraphicsEnvironment.chooseDriver(context);
Jesse Hall317fa5a2017-05-23 15:46:55 -07005380 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Dianne Hackborndde331c2012-08-03 14:01:57 -07005381 }
5382
5383 private void updateDefaultDensity() {
Alan Viverette2ac46f12016-02-04 16:58:14 -05005384 final int densityDpi = mCurDefaultDisplayDpi;
5385 if (!mDensityCompatMode
5386 && densityDpi != Configuration.DENSITY_DPI_UNDEFINED
5387 && densityDpi != DisplayMetrics.DENSITY_DEVICE) {
5388 DisplayMetrics.DENSITY_DEVICE = densityDpi;
5389 Bitmap.setDefaultDensity(densityDpi);
Dianne Hackborndde331c2012-08-03 14:01:57 -07005390 }
5391 }
5392
Todd Kennedye713efc2016-05-10 13:45:40 -07005393 /**
5394 * Returns the correct library directory for the current ABI.
5395 * <p>
5396 * If we're dealing with a multi-arch application that has both 32 and 64 bit shared
5397 * libraries, we might need to choose the secondary depending on what the current
5398 * runtime's instruction set is.
5399 */
5400 private String getInstrumentationLibrary(ApplicationInfo appInfo, InstrumentationInfo insInfo) {
5401 if (appInfo.primaryCpuAbi != null && appInfo.secondaryCpuAbi != null) {
5402 // Get the instruction set supported by the secondary ABI. In the presence
5403 // of a native bridge this might be different than the one secondary ABI used.
5404 String secondaryIsa =
5405 VMRuntime.getInstructionSet(appInfo.secondaryCpuAbi);
5406 final String secondaryDexCodeIsa =
5407 SystemProperties.get("ro.dalvik.vm.isa." + secondaryIsa);
5408 secondaryIsa = secondaryDexCodeIsa.isEmpty() ? secondaryIsa : secondaryDexCodeIsa;
5409
5410 final String runtimeIsa = VMRuntime.getRuntime().vmInstructionSet();
5411 if (runtimeIsa.equals(secondaryIsa)) {
5412 return insInfo.secondaryNativeLibraryDir;
5413 }
5414 }
5415 return insInfo.nativeLibraryDir;
5416 }
5417
Adam Lesinskib61e4052016-05-19 18:23:05 -07005418 /**
5419 * The LocaleList set for the app's resources may have been shuffled so that the preferred
5420 * Locale is at position 0. We must find the index of this preferred Locale in the
5421 * original LocaleList.
5422 */
5423 private void updateLocaleListFromAppContext(Context context, LocaleList newLocaleList) {
5424 final Locale bestLocale = context.getResources().getConfiguration().getLocales().get(0);
5425 final int newLocaleListSize = newLocaleList.size();
5426 for (int i = 0; i < newLocaleListSize; i++) {
5427 if (bestLocale.equals(newLocaleList.get(i))) {
5428 LocaleList.setDefault(newLocaleList, i);
5429 return;
5430 }
5431 }
Adam Lesinski27d30162016-05-25 16:45:14 -07005432
5433 // The app may have overridden the LocaleList with its own Locale
5434 // (not present in the available list). Push the chosen Locale
5435 // to the front of the list.
5436 LocaleList.setDefault(new LocaleList(bestLocale, newLocaleList));
Adam Lesinskib61e4052016-05-19 18:23:05 -07005437 }
5438
Romain Guy65b345f2011-07-27 18:51:50 -07005439 private void handleBindApplication(AppBindData data) {
Calin Juravle8f5770d2016-04-12 14:12:04 +01005440 // Register the UI Thread as a sensitive thread to the runtime.
5441 VMRuntime.registerSensitiveThread();
Man Caocfa78b22015-06-11 20:14:34 -07005442 if (data.trackAllocation) {
5443 DdmVmInternal.enableRecentAllocations(true);
5444 }
5445
Dianne Hackbornd98885c2016-03-01 17:13:03 -08005446 // Note when this process has started.
5447 Process.setStartTimes(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis());
5448
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005449 mBoundApplication = data;
5450 mConfiguration = new Configuration(data.config);
Dianne Hackborn5fd21692011-06-07 14:09:47 -07005451 mCompatConfiguration = new Configuration(data.config);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005452
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07005453 mProfiler = new Profiler();
Jeff Hao1b012d32014-08-20 10:35:34 -07005454 if (data.initProfilerInfo != null) {
5455 mProfiler.profileFile = data.initProfilerInfo.profileFile;
5456 mProfiler.profileFd = data.initProfilerInfo.profileFd;
5457 mProfiler.samplingInterval = data.initProfilerInfo.samplingInterval;
5458 mProfiler.autoStopProfiler = data.initProfilerInfo.autoStopProfiler;
Shukang Zhou6ffd4f92017-01-25 16:07:57 -08005459 mProfiler.streamingOutput = data.initProfilerInfo.streamingOutput;
Jeff Hao1b012d32014-08-20 10:35:34 -07005460 }
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07005461
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005462 // send up app name; do this *before* waiting for debugger
Christopher Tate8ee038d2009-11-06 11:30:20 -08005463 Process.setArgV0(data.processName);
Siva Velusamyd693dfa2012-09-10 14:36:58 -07005464 android.ddm.DdmHandleAppName.setAppName(data.processName,
5465 UserHandle.myUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005466
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07005467 if (mProfiler.profileFd != null) {
5468 mProfiler.startProfiling();
Dianne Hackborn62f20ec2011-08-15 17:40:28 -07005469 }
5470
Joe Onoratod630f102011-03-17 18:42:26 -07005471 // If the app is Honeycomb MR1 or earlier, switch its AsyncTask
5472 // implementation to use the pool executor. Normally, we use the
5473 // serialized executor as the default. This has to happen in the
5474 // main thread so the main looper is set right.
Dianne Hackborn81e92762011-10-09 16:00:21 -07005475 if (data.appInfo.targetSdkVersion <= android.os.Build.VERSION_CODES.HONEYCOMB_MR1) {
Joe Onoratod630f102011-03-17 18:42:26 -07005476 AsyncTask.setDefaultExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
5477 }
5478
Dianne Hackborn7895bc22014-09-05 15:09:03 -07005479 Message.updateCheckRecycle(data.appInfo.targetSdkVersion);
5480
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005481 /*
5482 * Before spawning a new process, reset the time zone to be the system time zone.
5483 * This needs to be done because the system time zone could have changed after the
5484 * the spawning of this process. Without doing this this process would have the incorrect
5485 * system time zone.
5486 */
5487 TimeZone.setDefault(null);
5488
Adam Lesinskib61e4052016-05-19 18:23:05 -07005489 /*
5490 * Set the LocaleList. This may change once we create the App Context.
5491 */
5492 LocaleList.setDefault(data.config.getLocales());
5493
5494 synchronized (mResourcesManager) {
5495 /*
5496 * Update the system configuration since its preloaded and might not
5497 * reflect configuration changes. The configuration object passed
5498 * in AppBindData can be safely assumed to be up to date
5499 */
5500 mResourcesManager.applyConfigurationToResourcesLocked(data.config, data.compatInfo);
5501 mCurDefaultDisplayDpi = data.config.densityDpi;
5502
5503 // This calls mResourcesManager so keep it within the synchronized block.
5504 applyCompatConfiguration(mCurDefaultDisplayDpi);
5505 }
5506
Dianne Hackborne2515ee2011-04-27 18:52:56 -04005507 data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005508
Dianne Hackborndde331c2012-08-03 14:01:57 -07005509 /**
5510 * Switch this process to density compatibility mode if needed.
5511 */
5512 if ((data.appInfo.flags&ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES)
5513 == 0) {
5514 mDensityCompatMode = true;
5515 Bitmap.setDefaultDensity(DisplayMetrics.DENSITY_DEFAULT);
5516 }
5517 updateDefaultDensity();
5518
Neil Fullerc66ec402016-11-14 16:06:42 +00005519 final String use24HourSetting = mCoreSettings.getString(Settings.System.TIME_12_24);
5520 Boolean is24Hr = null;
5521 if (use24HourSetting != null) {
5522 is24Hr = "24".equals(use24HourSetting) ? Boolean.TRUE : Boolean.FALSE;
5523 }
5524 // null : use locale default for 12/24 hour formatting,
5525 // false : use 12 hour format,
5526 // true : use 24 hour format.
Narayan Kamathccb2a0862013-12-19 14:49:36 +00005527 DateFormat.set24HourTimePref(is24Hr);
5528
Jon Miranda836c0a82014-08-11 12:32:26 -07005529 View.mDebugViewAttributes =
5530 mCoreSettings.getInt(Settings.Global.DEBUG_VIEW_ATTRIBUTES, 0) != 0;
5531
Dianne Hackborn96e240f2009-07-26 17:42:30 -07005532 /**
Brad Fitzpatrick438d0592010-06-10 12:19:19 -07005533 * For system applications on userdebug/eng builds, log stack
5534 * traces of disk and network access to dropbox for analysis.
5535 */
Brad Fitzpatrickad13b982010-07-14 12:35:53 -07005536 if ((data.appInfo.flags &
5537 (ApplicationInfo.FLAG_SYSTEM |
Brad Fitzpatrick50d66f92010-09-13 21:29:05 -07005538 ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)) != 0) {
5539 StrictMode.conditionallyEnableDebugLogging();
Brad Fitzpatrick438d0592010-06-10 12:19:19 -07005540 }
5541
5542 /**
Jeff Sharkey344744b2016-01-28 19:03:30 -07005543 * For apps targetting Honeycomb or later, we don't allow network usage
5544 * on the main event loop / UI thread. This is what ultimately throws
5545 * {@link NetworkOnMainThreadException}.
Brad Fitzpatrickb6e18412010-10-28 14:50:05 -07005546 */
Jeff Sharkey344744b2016-01-28 19:03:30 -07005547 if (data.appInfo.targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB) {
Brad Fitzpatrickb6e18412010-10-28 14:50:05 -07005548 StrictMode.enableDeathOnNetwork();
5549 }
5550
Jeff Sharkey344744b2016-01-28 19:03:30 -07005551 /**
5552 * For apps targetting N or later, we don't allow file:// Uri exposure.
5553 * This is what ultimately throws {@link FileUriExposedException}.
5554 */
5555 if (data.appInfo.targetSdkVersion >= Build.VERSION_CODES.N) {
Thierry Strudele60b28d2016-02-25 02:14:16 +00005556 StrictMode.enableDeathOnFileUriExposure();
Jeff Sharkey344744b2016-01-28 19:03:30 -07005557 }
5558
Svet Ganov37e43272016-09-09 16:01:32 -07005559 // We deprecated Build.SERIAL and only apps that target pre NMR1
5560 // SDK can see it. Since access to the serial is now behind a
5561 // permission we push down the value and here we fix it up
5562 // before any app code has been loaded.
5563 try {
5564 Field field = Build.class.getDeclaredField("SERIAL");
5565 field.setAccessible(true);
5566 field.set(Build.class, data.buildSerial);
5567 } catch (NoSuchFieldException | IllegalAccessException e) {
5568 /* ignore */
5569 }
5570
Sudheer Shankacc6418f2016-10-13 12:03:44 -07005571 if (data.debugMode != ApplicationThreadConstants.DEBUG_OFF) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005572 // XXX should have option to change the port.
5573 Debug.changeDebugPort(8100);
Sudheer Shankacc6418f2016-10-13 12:03:44 -07005574 if (data.debugMode == ApplicationThreadConstants.DEBUG_WAIT) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07005575 Slog.w(TAG, "Application " + data.info.getPackageName()
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005576 + " is waiting for the debugger on port 8100...");
5577
Sudheer Shankadc589ac2016-11-10 15:30:17 -08005578 IActivityManager mgr = ActivityManager.getService();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005579 try {
5580 mgr.showWaitingForDebugger(mAppThread, true);
5581 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07005582 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005583 }
5584
5585 Debug.waitForDebugger();
5586
5587 try {
5588 mgr.showWaitingForDebugger(mAppThread, false);
5589 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07005590 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005591 }
5592
5593 } else {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07005594 Slog.w(TAG, "Application " + data.info.getPackageName()
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005595 + " can be debugged on port 8100...");
5596 }
5597 }
5598
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -07005599 // Allow application-generated systrace messages if we're debuggable.
Rahul Chaturvedi52613f92015-06-17 23:54:08 -04005600 boolean isAppDebuggable = (data.appInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
5601 Trace.setAppTracingAllowed(isAppDebuggable);
5602 if (isAppDebuggable && data.enableBinderTracking) {
5603 Binder.enableTracing();
5604 }
Jamie Gennisf9c7d6b2013-03-25 14:18:25 -07005605
Robert Greenwalt434203a2010-10-11 16:00:27 -07005606 /**
5607 * Initialize the default http proxy in this process for the reasons we set the time zone.
5608 */
Andreas Gampe4c8e5422016-05-18 11:58:47 -07005609 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Setup proxies");
Alan Viverettebe64eae2015-09-03 14:56:04 -04005610 final IBinder b = ServiceManager.getService(Context.CONNECTIVITY_SERVICE);
Dianne Hackbornd4d32c52011-11-08 17:33:59 -08005611 if (b != null) {
5612 // In pre-boot mode (doing initial launch to collect password), not
5613 // all system is up. This includes the connectivity service, so don't
5614 // crash if we can't get it.
Alan Viverettebe64eae2015-09-03 14:56:04 -04005615 final IConnectivityManager service = IConnectivityManager.Stub.asInterface(b);
Dianne Hackbornd4d32c52011-11-08 17:33:59 -08005616 try {
Paul Jensencee9b512015-05-06 07:32:40 -04005617 final ProxyInfo proxyInfo = service.getProxyForNetwork(null);
Jason Monk207900c2014-04-25 15:00:09 -04005618 Proxy.setHttpProxySystemProperty(proxyInfo);
Jeff Sharkeyf8880562016-02-26 13:03:01 -07005619 } catch (RemoteException e) {
Andreas Gampe4c8e5422016-05-18 11:58:47 -07005620 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Jeff Sharkeyf8880562016-02-26 13:03:01 -07005621 throw e.rethrowFromSystemServer();
5622 }
Dianne Hackbornd4d32c52011-11-08 17:33:59 -08005623 }
Andreas Gampe4c8e5422016-05-18 11:58:47 -07005624 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Robert Greenwalt434203a2010-10-11 16:00:27 -07005625
Alan Viverette2107d692015-09-03 14:55:27 -04005626 // Instrumentation info affects the class loader, so load it before
5627 // setting up the app context.
5628 final InstrumentationInfo ii;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005629 if (data.instrumentationName != null) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005630 try {
Alan Viverette2107d692015-09-03 14:55:27 -04005631 ii = new ApplicationPackageManager(null, getPackageManager())
5632 .getInstrumentationInfo(data.instrumentationName, 0);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005633 } catch (PackageManager.NameNotFoundException e) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005634 throw new RuntimeException(
Alan Viverette2107d692015-09-03 14:55:27 -04005635 "Unable to find instrumentation info for: " + data.instrumentationName);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005636 }
5637
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07005638 mInstrumentationPackageName = ii.packageName;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005639 mInstrumentationAppDir = ii.sourceDir;
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07005640 mInstrumentationSplitAppDirs = ii.splitSourceDirs;
Todd Kennedye713efc2016-05-10 13:45:40 -07005641 mInstrumentationLibDir = getInstrumentationLibrary(data.appInfo, ii);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005642 mInstrumentedAppDir = data.info.getAppDir();
Jeff Sharkey8a4c9722014-06-16 13:48:42 -07005643 mInstrumentedSplitAppDirs = data.info.getSplitAppDirs();
5644 mInstrumentedLibDir = data.info.getLibDir();
Alan Viverette2107d692015-09-03 14:55:27 -04005645 } else {
5646 ii = null;
5647 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005648
Alan Viverette2107d692015-09-03 14:55:27 -04005649 final ContextImpl appContext = ContextImpl.createAppContext(this, data.info);
Adam Lesinskib61e4052016-05-19 18:23:05 -07005650 updateLocaleListFromAppContext(appContext,
5651 mResourcesManager.getConfiguration().getLocales());
Seigo Nonakac14dd782016-03-30 23:09:16 +09005652
Jesse Hall317fa5a2017-05-23 15:46:55 -07005653 if (!Process.isIsolated()) {
5654 setupGraphicsSupport(appContext);
Michael Lentine2ba303f2016-02-01 20:44:34 -06005655 }
Michael Lentine03d8f7682016-01-31 15:37:11 -06005656
Calin Juravle37dfc8e2017-03-13 19:02:32 -07005657 // If we use profiles, setup the dex reporter to notify package manager
5658 // of any relevant dex loads. The idle maintenance job will use the information
5659 // reported to optimize the loaded dex files.
5660 // Note that we only need one global reporter per app.
5661 // Make sure we do this before calling onCreate so that we can capture the
5662 // complete application startup.
5663 if (SystemProperties.getBoolean("dalvik.vm.usejitprofiles", false)) {
Calin Juravlef5a7bfc2017-03-13 23:30:30 -07005664 BaseDexClassLoader.setReporter(DexLoadReporter.getInstance());
Calin Juravle37dfc8e2017-03-13 19:02:32 -07005665 }
5666
Chad Brubaker78d47122015-11-17 22:26:58 -08005667 // Install the Network Security Config Provider. This must happen before the application
5668 // code is loaded to prevent issues with instances of TLS objects being created before
5669 // the provider is installed.
Andreas Gampe4c8e5422016-05-18 11:58:47 -07005670 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "NetworkSecurityConfigProvider.install");
Chad Brubaker276ee962016-06-08 12:57:46 -07005671 NetworkSecurityConfigProvider.install(appContext);
Andreas Gampe4c8e5422016-05-18 11:58:47 -07005672 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Chad Brubaker78d47122015-11-17 22:26:58 -08005673
Alan Viverette2107d692015-09-03 14:55:27 -04005674 // Continue loading instrumentation.
5675 if (ii != null) {
Alan Viverette346296b2015-09-01 13:08:05 -04005676 final ApplicationInfo instrApp = new ApplicationInfo();
Jeff Sharkey15447792015-11-05 16:18:51 -08005677 ii.copyTo(instrApp);
Fyodor Kupolovaf38b8e2015-12-02 16:16:07 -08005678 instrApp.initForUser(UserHandle.myUserId());
Alan Viverettebe64eae2015-09-03 14:56:04 -04005679 final LoadedApk pi = getPackageInfo(instrApp, data.compatInfo,
Dianne Hackbornfee756f2014-07-16 17:31:10 -07005680 appContext.getClassLoader(), false, true, false);
Alan Viverettebe64eae2015-09-03 14:56:04 -04005681 final ContextImpl instrContext = ContextImpl.createAppContext(this, pi);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005682
5683 try {
Alan Viverettebe64eae2015-09-03 14:56:04 -04005684 final ClassLoader cl = instrContext.getClassLoader();
Jason Monk69457102017-06-06 18:01:31 -04005685 mInstrumentation = instantiate(cl, data.instrumentationName.getClassName(),
5686 instrContext, Application::instantiateInstrumentation);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005687 } catch (Exception e) {
5688 throw new RuntimeException(
5689 "Unable to instantiate instrumentation "
5690 + data.instrumentationName + ": " + e.toString(), e);
5691 }
5692
Alan Viverettebe64eae2015-09-03 14:56:04 -04005693 final ComponentName component = new ComponentName(ii.packageName, ii.name);
5694 mInstrumentation.init(this, instrContext, appContext, component,
5695 data.instrumentationWatcher, data.instrumentationUiAutomationConnection);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005696
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07005697 if (mProfiler.profileFile != null && !ii.handleProfiling
5698 && mProfiler.profileFd == null) {
5699 mProfiler.handlingProfiling = true;
Alan Viverettebe64eae2015-09-03 14:56:04 -04005700 final File file = new File(mProfiler.profileFile);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005701 file.getParentFile().mkdirs();
5702 Debug.startMethodTracing(file.toString(), 8 * 1024 * 1024);
5703 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005704 } else {
5705 mInstrumentation = new Instrumentation();
5706 }
5707
Dianne Hackborn3b81bc12011-01-15 11:50:52 -08005708 if ((data.appInfo.flags&ApplicationInfo.FLAG_LARGE_HEAP) != 0) {
Dianne Hackbornde398512011-01-18 18:45:21 -08005709 dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();
Mathieu Chartier24cee072015-01-08 14:42:20 -08005710 } else {
5711 // Small heap, clamp to the current growth limit and let the heap release
5712 // pages after the growth limit to the non growth limit capacity. b/18387825
5713 dalvik.system.VMRuntime.getRuntime().clampGrowthLimit();
Dianne Hackborn3b81bc12011-01-15 11:50:52 -08005714 }
5715
Jeff Sharkey6bff62c2012-02-29 12:26:36 -08005716 // Allow disk access during application and provider setup. This could
Jeff Sharkey7c501672012-02-28 12:08:37 -08005717 // block processing ordered broadcasts, but later processing would
Jeff Sharkey6bff62c2012-02-29 12:26:36 -08005718 // probably end up doing the same disk access.
Kurt Nelson5e154362017-06-29 17:20:56 -07005719 Application app;
Jeff Sharkey7c501672012-02-28 12:08:37 -08005720 final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskWrites();
Kurt Nelson571c3f62017-07-10 11:09:04 -07005721 final StrictMode.ThreadPolicy writesAllowedPolicy = StrictMode.getThreadPolicy();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005722 try {
Jeff Sharkey6bff62c2012-02-29 12:26:36 -08005723 // If the app is being launched for full backup or restore, bring it up in
5724 // a restricted environment with the base application class.
Kurt Nelson5e154362017-06-29 17:20:56 -07005725 app = data.info.makeApplication(data.restrictedBackupMode, null);
Jeff Sharkey6bff62c2012-02-29 12:26:36 -08005726 mInitialApplication = app;
Jeff Sharkey7c501672012-02-28 12:08:37 -08005727
Jeff Sharkey6bff62c2012-02-29 12:26:36 -08005728 // don't bring up providers in restricted mode; they may depend on the
5729 // app's custom Application class
5730 if (!data.restrictedBackupMode) {
Jeff Sharkey3e195892016-03-05 19:48:59 -07005731 if (!ArrayUtils.isEmpty(data.providers)) {
5732 installContentProviders(app, data.providers);
Jeff Sharkey6bff62c2012-02-29 12:26:36 -08005733 // For process that contains content providers, we want to
5734 // ensure that the JIT is enabled "at some point".
5735 mH.sendEmptyMessageDelayed(H.ENABLE_JIT, 10*1000);
5736 }
5737 }
5738
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005739 // Do this after providers, since instrumentation tests generally start their
5740 // test thread at this point, and we don't want that racing.
5741 try {
5742 mInstrumentation.onCreate(data.instrumentationArgs);
5743 }
5744 catch (Exception e) {
5745 throw new RuntimeException(
5746 "Exception thrown in onCreate() of "
5747 + data.instrumentationName + ": " + e.toString(), e);
5748 }
Kurt Nelson571c3f62017-07-10 11:09:04 -07005749 try {
5750 mInstrumentation.callApplicationOnCreate(app);
5751 } catch (Exception e) {
5752 if (!mInstrumentation.onException(app, e)) {
5753 throw new RuntimeException(
5754 "Unable to create application " + app.getClass().getName()
5755 + ": " + e.toString(), e);
5756 }
5757 }
Jeff Sharkey6bff62c2012-02-29 12:26:36 -08005758 } finally {
Kurt Nelson571c3f62017-07-10 11:09:04 -07005759 // If the app targets < O-MR1, or doesn't change the thread policy
5760 // during startup, clobber the policy to maintain behavior of b/36951662
5761 if (data.appInfo.targetSdkVersion <= Build.VERSION_CODES.O
5762 || StrictMode.getThreadPolicy().equals(writesAllowedPolicy)) {
5763 StrictMode.setThreadPolicy(savedPolicy);
Kurt Nelson5e154362017-06-29 17:20:56 -07005764 }
5765 }
5766
Clara Bayarri4b5a4d22017-01-27 20:15:45 +00005767 // Preload fonts resources
Seigo Nonaka54084b62017-04-24 14:46:23 -07005768 FontsContract.setApplicationContextForResources(appContext);
Clara Bayarri4b5a4d22017-01-27 20:15:45 +00005769 try {
5770 final ApplicationInfo info =
Amith Yamasani336d29d2017-02-14 15:14:09 -08005771 getPackageManager().getApplicationInfo(
Clara Bayarri4b5a4d22017-01-27 20:15:45 +00005772 data.appInfo.packageName,
5773 PackageManager.GET_META_DATA /*flags*/,
5774 UserHandle.myUserId());
5775 if (info.metaData != null) {
5776 final int preloadedFontsResource = info.metaData.getInt(
5777 ApplicationInfo.METADATA_PRELOADED_FONTS, 0);
5778 if (preloadedFontsResource != 0) {
5779 data.info.mResources.preloadFonts(preloadedFontsResource);
5780 }
5781 }
5782 } catch (RemoteException e) {
5783 throw e.rethrowFromSystemServer();
5784 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005785 }
5786
5787 /*package*/ final void finishInstrumentation(int resultCode, Bundle results) {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08005788 IActivityManager am = ActivityManager.getService();
Jeff Sharkey3ad9d002011-09-15 15:51:54 -07005789 if (mProfiler.profileFile != null && mProfiler.handlingProfiling
5790 && mProfiler.profileFd == null) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005791 Debug.stopMethodTracing();
5792 }
Sudheer Shankadc589ac2016-11-10 15:30:17 -08005793 //Slog.i(TAG, "am: " + ActivityManager.getService()
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005794 // + ", app thr: " + mAppThread);
5795 try {
5796 am.finishInstrumentation(mAppThread, resultCode, results);
5797 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07005798 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005799 }
5800 }
5801
Romain Guy65b345f2011-07-27 18:51:50 -07005802 private void installContentProviders(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005803 Context context, List<ProviderInfo> providers) {
Sudheer Shankafc46e9b2016-10-21 17:55:27 -07005804 final ArrayList<ContentProviderHolder> results = new ArrayList<>();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005805
Romain Guya998dff2012-03-23 18:58:36 -07005806 for (ProviderInfo cpi : providers) {
Dianne Hackborn40e9f292012-11-27 19:12:23 -08005807 if (DEBUG_PROVIDER) {
5808 StringBuilder buf = new StringBuilder(128);
5809 buf.append("Pub ");
5810 buf.append(cpi.authority);
5811 buf.append(": ");
5812 buf.append(cpi.name);
5813 Log.i(TAG, buf.toString());
5814 }
Sudheer Shankafc46e9b2016-10-21 17:55:27 -07005815 ContentProviderHolder cph = installProvider(context, null, cpi,
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005816 false /*noisy*/, true /*noReleaseNeeded*/, true /*stable*/);
5817 if (cph != null) {
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005818 cph.noReleaseNeeded = true;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005819 results.add(cph);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005820 }
5821 }
5822
5823 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08005824 ActivityManager.getService().publishContentProviders(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005825 getApplicationThread(), results);
5826 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07005827 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005828 }
5829 }
5830
Jeff Sharkey6d515712012-09-20 16:06:08 -07005831 public final IContentProvider acquireProvider(
5832 Context c, String auth, int userId, boolean stable) {
Wale Ogunwale1d646122015-04-24 14:45:14 -07005833 final IContentProvider provider = acquireExistingProvider(c, auth, userId, stable);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005834 if (provider != null) {
5835 return provider;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005836 }
5837
Wale Ogunwale1d646122015-04-24 14:45:14 -07005838 // There is a possible race here. Another thread may try to acquire
5839 // the same provider at the same time. When this happens, we want to ensure
5840 // that the first one wins.
5841 // Note that we cannot hold the lock while acquiring and installing the
5842 // provider since it might take a long time to run and it could also potentially
5843 // be re-entrant in the case where the provider is in the same process.
Sudheer Shankafc46e9b2016-10-21 17:55:27 -07005844 ContentProviderHolder holder = null;
Wale Ogunwale1d646122015-04-24 14:45:14 -07005845 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08005846 holder = ActivityManager.getService().getContentProvider(
Wale Ogunwale1d646122015-04-24 14:45:14 -07005847 getApplicationThread(), auth, userId, stable);
5848 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07005849 throw ex.rethrowFromSystemServer();
Wale Ogunwale67fe0a42015-04-24 14:44:54 -07005850 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005851 if (holder == null) {
Jeff Sharkey6d515712012-09-20 16:06:08 -07005852 Slog.e(TAG, "Failed to find provider info for " + auth);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005853 return null;
5854 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005855
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005856 // Install provider will increment the reference count for us, and break
5857 // any ties in the race.
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005858 holder = installProvider(c, holder, holder.info,
5859 true /*noisy*/, holder.noReleaseNeeded, stable);
5860 return holder.provider;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005861 }
5862
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005863 private final void incProviderRefLocked(ProviderRefCount prc, boolean stable) {
5864 if (stable) {
5865 prc.stableCount += 1;
5866 if (prc.stableCount == 1) {
5867 // We are acquiring a new stable reference on the provider.
5868 int unstableDelta;
5869 if (prc.removePending) {
5870 // We have a pending remove operation, which is holding the
5871 // last unstable reference. At this point we are converting
5872 // that unstable reference to our new stable reference.
5873 unstableDelta = -1;
5874 // Cancel the removal of the provider.
5875 if (DEBUG_PROVIDER) {
5876 Slog.v(TAG, "incProviderRef: stable "
5877 + "snatched provider from the jaws of death");
5878 }
5879 prc.removePending = false;
Guobin Zhang9e3e52662013-03-21 13:57:11 +08005880 // There is a race! It fails to remove the message, which
5881 // will be handled in completeRemoveProvider().
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005882 mH.removeMessages(H.REMOVE_PROVIDER, prc);
5883 } else {
5884 unstableDelta = 0;
5885 }
5886 try {
5887 if (DEBUG_PROVIDER) {
5888 Slog.v(TAG, "incProviderRef Now stable - "
5889 + prc.holder.info.name + ": unstableDelta="
5890 + unstableDelta);
5891 }
Sudheer Shankadc589ac2016-11-10 15:30:17 -08005892 ActivityManager.getService().refContentProvider(
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005893 prc.holder.connection, 1, unstableDelta);
5894 } catch (RemoteException e) {
5895 //do nothing content provider object is dead any way
5896 }
5897 }
5898 } else {
5899 prc.unstableCount += 1;
5900 if (prc.unstableCount == 1) {
5901 // We are acquiring a new unstable reference on the provider.
5902 if (prc.removePending) {
5903 // Oh look, we actually have a remove pending for the
5904 // provider, which is still holding the last unstable
5905 // reference. We just need to cancel that to take new
5906 // ownership of the reference.
5907 if (DEBUG_PROVIDER) {
5908 Slog.v(TAG, "incProviderRef: unstable "
5909 + "snatched provider from the jaws of death");
5910 }
5911 prc.removePending = false;
5912 mH.removeMessages(H.REMOVE_PROVIDER, prc);
5913 } else {
5914 // First unstable ref, increment our count in the
5915 // activity manager.
5916 try {
5917 if (DEBUG_PROVIDER) {
5918 Slog.v(TAG, "incProviderRef: Now unstable - "
5919 + prc.holder.info.name);
5920 }
Sudheer Shankadc589ac2016-11-10 15:30:17 -08005921 ActivityManager.getService().refContentProvider(
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005922 prc.holder.connection, 0, 1);
5923 } catch (RemoteException e) {
5924 //do nothing content provider object is dead any way
5925 }
5926 }
5927 }
5928 }
5929 }
5930
Jeff Sharkey6d515712012-09-20 16:06:08 -07005931 public final IContentProvider acquireExistingProvider(
5932 Context c, String auth, int userId, boolean stable) {
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005933 synchronized (mProviderMap) {
Wale Ogunwale1d646122015-04-24 14:45:14 -07005934 final ProviderKey key = new ProviderKey(auth, userId);
Jeff Sharkey6d515712012-09-20 16:06:08 -07005935 final ProviderClientRecord pr = mProviderMap.get(key);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005936 if (pr == null) {
5937 return null;
5938 }
5939
5940 IContentProvider provider = pr.mProvider;
5941 IBinder jBinder = provider.asBinder();
Dianne Hackbornc428aae2012-10-03 16:38:22 -07005942 if (!jBinder.isBinderAlive()) {
5943 // The hosting process of the provider has died; we can't
5944 // use this one.
Wale Ogunwale1d646122015-04-24 14:45:14 -07005945 Log.i(TAG, "Acquiring provider " + auth + " for user " + userId
Dianne Hackbornc428aae2012-10-03 16:38:22 -07005946 + ": existing object's process dead");
5947 handleUnstableProviderDiedLocked(jBinder, true);
5948 return null;
5949 }
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005950
5951 // Only increment the ref count if we have one. If we don't then the
5952 // provider is not reference counted and never needs to be released.
Dianne Hackborncca1f0e2010-09-26 18:34:53 -07005953 ProviderRefCount prc = mProviderRefCountMap.get(jBinder);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005954 if (prc != null) {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005955 incProviderRefLocked(prc, stable);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005956 }
5957 return provider;
5958 }
Dianne Hackborncca1f0e2010-09-26 18:34:53 -07005959 }
5960
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005961 public final boolean releaseProvider(IContentProvider provider, boolean stable) {
5962 if (provider == null) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005963 return false;
5964 }
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005965
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005966 IBinder jBinder = provider.asBinder();
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005967 synchronized (mProviderMap) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005968 ProviderRefCount prc = mProviderRefCountMap.get(jBinder);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005969 if (prc == null) {
5970 // The provider has no ref count, no release is needed.
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08005971 return false;
Jeff Brownddaa9ac2011-11-11 20:16:14 -08005972 }
5973
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005974 boolean lastRef = false;
5975 if (stable) {
5976 if (prc.stableCount == 0) {
5977 if (DEBUG_PROVIDER) Slog.v(TAG,
5978 "releaseProvider: stable ref count already 0, how?");
5979 return false;
5980 }
5981 prc.stableCount -= 1;
5982 if (prc.stableCount == 0) {
5983 // What we do at this point depends on whether there are
5984 // any unstable refs left: if there are, we just tell the
5985 // activity manager to decrement its stable count; if there
5986 // aren't, we need to enqueue this provider to be removed,
5987 // and convert to holding a single unstable ref while
5988 // doing so.
5989 lastRef = prc.unstableCount == 0;
5990 try {
5991 if (DEBUG_PROVIDER) {
5992 Slog.v(TAG, "releaseProvider: No longer stable w/lastRef="
5993 + lastRef + " - " + prc.holder.info.name);
5994 }
Sudheer Shankadc589ac2016-11-10 15:30:17 -08005995 ActivityManager.getService().refContentProvider(
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07005996 prc.holder.connection, -1, lastRef ? 1 : 0);
5997 } catch (RemoteException e) {
5998 //do nothing content provider object is dead any way
5999 }
6000 }
6001 } else {
6002 if (prc.unstableCount == 0) {
6003 if (DEBUG_PROVIDER) Slog.v(TAG,
6004 "releaseProvider: unstable ref count already 0, how?");
6005 return false;
6006 }
6007 prc.unstableCount -= 1;
6008 if (prc.unstableCount == 0) {
6009 // If this is the last reference, we need to enqueue
6010 // this provider to be removed instead of telling the
6011 // activity manager to remove it at this point.
6012 lastRef = prc.stableCount == 0;
6013 if (!lastRef) {
6014 try {
6015 if (DEBUG_PROVIDER) {
6016 Slog.v(TAG, "releaseProvider: No longer unstable - "
6017 + prc.holder.info.name);
6018 }
Sudheer Shankadc589ac2016-11-10 15:30:17 -08006019 ActivityManager.getService().refContentProvider(
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006020 prc.holder.connection, 0, -1);
6021 } catch (RemoteException e) {
6022 //do nothing content provider object is dead any way
6023 }
6024 }
6025 }
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006026 }
6027
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006028 if (lastRef) {
6029 if (!prc.removePending) {
6030 // Schedule the actual remove asynchronously, since we don't know the context
6031 // this will be called in.
6032 // TODO: it would be nice to post a delayed message, so
6033 // if we come back and need the same provider quickly
6034 // we will still have it available.
6035 if (DEBUG_PROVIDER) {
6036 Slog.v(TAG, "releaseProvider: Enqueueing pending removal - "
6037 + prc.holder.info.name);
6038 }
6039 prc.removePending = true;
6040 Message msg = mH.obtainMessage(H.REMOVE_PROVIDER, prc);
6041 mH.sendMessage(msg);
6042 } else {
6043 Slog.w(TAG, "Duplicate remove pending of provider " + prc.holder.info.name);
6044 }
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006045 }
6046 return true;
6047 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006048 }
6049
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006050 final void completeRemoveProvider(ProviderRefCount prc) {
6051 synchronized (mProviderMap) {
6052 if (!prc.removePending) {
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006053 // There was a race! Some other client managed to acquire
6054 // the provider before the removal was completed.
6055 // Abort the removal. We will do it later.
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006056 if (DEBUG_PROVIDER) Slog.v(TAG, "completeRemoveProvider: lost the race, "
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006057 + "provider still in use");
6058 return;
6059 }
6060
Guobin Zhang9e3e52662013-03-21 13:57:11 +08006061 // More complicated race!! Some client managed to acquire the
6062 // provider and release it before the removal was completed.
6063 // Continue the removal, and abort the next remove message.
6064 prc.removePending = false;
6065
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006066 final IBinder jBinder = prc.holder.provider.asBinder();
6067 ProviderRefCount existingPrc = mProviderRefCountMap.get(jBinder);
6068 if (existingPrc == prc) {
6069 mProviderRefCountMap.remove(jBinder);
6070 }
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006071
Dianne Hackbornadd005c2013-07-17 18:43:12 -07006072 for (int i=mProviderMap.size()-1; i>=0; i--) {
6073 ProviderClientRecord pr = mProviderMap.valueAt(i);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006074 IBinder myBinder = pr.mProvider.asBinder();
6075 if (myBinder == jBinder) {
Dianne Hackbornadd005c2013-07-17 18:43:12 -07006076 mProviderMap.removeAt(i);
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006077 }
6078 }
6079 }
6080
6081 try {
6082 if (DEBUG_PROVIDER) {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08006083 Slog.v(TAG, "removeProvider: Invoking ActivityManagerService."
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006084 + "removeContentProvider(" + prc.holder.info.name + ")");
6085 }
Sudheer Shankadc589ac2016-11-10 15:30:17 -08006086 ActivityManager.getService().removeContentProvider(
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006087 prc.holder.connection, false);
6088 } catch (RemoteException e) {
6089 //do nothing content provider object is dead any way
6090 }
6091 }
6092
6093 final void handleUnstableProviderDied(IBinder provider, boolean fromClient) {
Dianne Hackbornc428aae2012-10-03 16:38:22 -07006094 synchronized (mProviderMap) {
6095 handleUnstableProviderDiedLocked(provider, fromClient);
6096 }
6097 }
6098
6099 final void handleUnstableProviderDiedLocked(IBinder provider, boolean fromClient) {
6100 ProviderRefCount prc = mProviderRefCountMap.get(provider);
6101 if (prc != null) {
6102 if (DEBUG_PROVIDER) Slog.v(TAG, "Cleaning up dead provider "
6103 + provider + " " + prc.holder.info.name);
6104 mProviderRefCountMap.remove(provider);
You Kimbc74de62013-10-01 00:13:26 +09006105 for (int i=mProviderMap.size()-1; i>=0; i--) {
6106 ProviderClientRecord pr = mProviderMap.valueAt(i);
6107 if (pr != null && pr.mProvider.asBinder() == provider) {
6108 Slog.i(TAG, "Removing dead content provider:" + pr.mProvider.toString());
6109 mProviderMap.removeAt(i);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006110 }
Dianne Hackbornc428aae2012-10-03 16:38:22 -07006111 }
You Kimbc74de62013-10-01 00:13:26 +09006112
Dianne Hackbornc428aae2012-10-03 16:38:22 -07006113 if (fromClient) {
6114 // We found out about this due to execution in our client
6115 // code. Tell the activity manager about it now, to ensure
6116 // that the next time we go to do anything with the provider
6117 // it knows it is dead (so we don't race with its death
6118 // notification).
6119 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08006120 ActivityManager.getService().unstableProviderDied(
Dianne Hackbornc428aae2012-10-03 16:38:22 -07006121 prc.holder.connection);
6122 } catch (RemoteException e) {
6123 //do nothing content provider object is dead any way
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006124 }
Dianne Hackborn9bfb7072009-09-22 11:37:40 -07006125 }
6126 }
6127 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006128
Jeff Sharkey7aa76012013-09-30 14:26:27 -07006129 final void appNotRespondingViaProvider(IBinder provider) {
6130 synchronized (mProviderMap) {
6131 ProviderRefCount prc = mProviderRefCountMap.get(provider);
6132 if (prc != null) {
6133 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08006134 ActivityManager.getService()
Jeff Sharkey7aa76012013-09-30 14:26:27 -07006135 .appNotRespondingViaProvider(prc.holder.connection);
6136 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07006137 throw e.rethrowFromSystemServer();
Jeff Sharkey7aa76012013-09-30 14:26:27 -07006138 }
6139 }
6140 }
6141 }
6142
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006143 private ProviderClientRecord installProviderAuthoritiesLocked(IContentProvider provider,
Sudheer Shankafc46e9b2016-10-21 17:55:27 -07006144 ContentProvider localProvider, ContentProviderHolder holder) {
Andreas Gampe18e99c12015-03-06 15:29:06 -08006145 final String auths[] = holder.info.authority.split(";");
Jeff Sharkey6d515712012-09-20 16:06:08 -07006146 final int userId = UserHandle.getUserId(holder.info.applicationInfo.uid);
6147
Jeff Sharkey0a17db12016-11-04 11:23:46 -06006148 if (provider != null) {
6149 // If this provider is hosted by the core OS and cannot be upgraded,
6150 // then I guess we're okay doing blocking calls to it.
6151 for (String auth : auths) {
6152 switch (auth) {
6153 case ContactsContract.AUTHORITY:
6154 case CallLog.AUTHORITY:
6155 case CallLog.SHADOW_AUTHORITY:
6156 case BlockedNumberContract.AUTHORITY:
6157 case CalendarContract.AUTHORITY:
6158 case Downloads.Impl.AUTHORITY:
Jeff Sharkeycb621622016-11-11 14:04:32 -07006159 case "telephony":
Jeff Sharkey0a17db12016-11-04 11:23:46 -06006160 Binder.allowBlocking(provider.asBinder());
6161 }
6162 }
6163 }
6164
Jeff Sharkey6d515712012-09-20 16:06:08 -07006165 final ProviderClientRecord pcr = new ProviderClientRecord(
6166 auths, provider, localProvider, holder);
6167 for (String auth : auths) {
6168 final ProviderKey key = new ProviderKey(auth, userId);
6169 final ProviderClientRecord existing = mProviderMap.get(key);
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006170 if (existing != null) {
6171 Slog.w(TAG, "Content provider " + pcr.mHolder.info.name
Jeff Sharkey6d515712012-09-20 16:06:08 -07006172 + " already published as " + auth);
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006173 } else {
Jeff Sharkey6d515712012-09-20 16:06:08 -07006174 mProviderMap.put(key, pcr);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006175 }
6176 }
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006177 return pcr;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006178 }
6179
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006180 /**
6181 * Installs the provider.
6182 *
6183 * Providers that are local to the process or that come from the system server
6184 * may be installed permanently which is indicated by setting noReleaseNeeded to true.
6185 * Other remote providers are reference counted. The initial reference count
6186 * for all reference counted providers is one. Providers that are not reference
6187 * counted do not have a reference count (at all).
6188 *
6189 * This method detects when a provider has already been installed. When this happens,
6190 * it increments the reference count of the existing provider (if appropriate)
6191 * and returns the existing provider. This can happen due to concurrent
6192 * attempts to acquire the same provider.
6193 */
Sudheer Shankafc46e9b2016-10-21 17:55:27 -07006194 private ContentProviderHolder installProvider(Context context,
6195 ContentProviderHolder holder, ProviderInfo info,
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006196 boolean noisy, boolean noReleaseNeeded, boolean stable) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006197 ContentProvider localProvider = null;
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006198 IContentProvider provider;
Dianne Hackborn5f48fca2012-05-30 11:06:31 -07006199 if (holder == null || holder.provider == null) {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006200 if (DEBUG_PROVIDER || noisy) {
Dianne Hackborn399cccb2010-04-13 22:57:49 -07006201 Slog.d(TAG, "Loading provider " + info.authority + ": "
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006202 + info.name);
6203 }
6204 Context c = null;
6205 ApplicationInfo ai = info.applicationInfo;
6206 if (context.getPackageName().equals(ai.packageName)) {
6207 c = context;
6208 } else if (mInitialApplication != null &&
6209 mInitialApplication.getPackageName().equals(ai.packageName)) {
6210 c = mInitialApplication;
6211 } else {
6212 try {
6213 c = context.createPackageContext(ai.packageName,
6214 Context.CONTEXT_INCLUDE_CODE);
6215 } catch (PackageManager.NameNotFoundException e) {
Romain Guy65b345f2011-07-27 18:51:50 -07006216 // Ignore
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006217 }
6218 }
6219 if (c == null) {
Dianne Hackbornc9421ba2010-03-11 22:23:46 -08006220 Slog.w(TAG, "Unable to get context for package " +
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006221 ai.packageName +
6222 " while loading content provider " +
6223 info.name);
6224 return null;
6225 }
Adam Lesinski4e862812016-11-21 16:02:24 -08006226
6227 if (info.splitName != null) {
6228 try {
6229 c = c.createContextForSplit(info.splitName);
6230 } catch (NameNotFoundException e) {
6231 throw new RuntimeException(e);
6232 }
6233 }
6234
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006235 try {
6236 final java.lang.ClassLoader cl = c.getClassLoader();
Jason Monk69457102017-06-06 18:01:31 -04006237 localProvider = instantiate(cl, info.name, context,
6238 Application::instantiateProvider);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006239 provider = localProvider.getIContentProvider();
6240 if (provider == null) {
Dianne Hackbornc9421ba2010-03-11 22:23:46 -08006241 Slog.e(TAG, "Failed to instantiate class " +
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006242 info.name + " from sourceDir " +
6243 info.applicationInfo.sourceDir);
6244 return null;
6245 }
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006246 if (DEBUG_PROVIDER) Slog.v(
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006247 TAG, "Instantiating local provider " + info.name);
6248 // XXX Need to create the correct context for this provider.
6249 localProvider.attachInfo(c, info);
6250 } catch (java.lang.Exception e) {
6251 if (!mInstrumentation.onException(null, e)) {
6252 throw new RuntimeException(
6253 "Unable to get provider " + info.name
6254 + ": " + e.toString(), e);
6255 }
6256 return null;
6257 }
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006258 } else {
6259 provider = holder.provider;
6260 if (DEBUG_PROVIDER) Slog.v(TAG, "Installing external provider " + info.authority + ": "
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006261 + info.name);
6262 }
6263
Sudheer Shankafc46e9b2016-10-21 17:55:27 -07006264 ContentProviderHolder retHolder;
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006265
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006266 synchronized (mProviderMap) {
6267 if (DEBUG_PROVIDER) Slog.v(TAG, "Checking to add " + provider
6268 + " / " + info.name);
6269 IBinder jBinder = provider.asBinder();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006270 if (localProvider != null) {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006271 ComponentName cname = new ComponentName(info.packageName, info.name);
6272 ProviderClientRecord pr = mLocalProvidersByName.get(cname);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006273 if (pr != null) {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006274 if (DEBUG_PROVIDER) {
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006275 Slog.v(TAG, "installProvider: lost the race, "
6276 + "using existing local provider");
6277 }
6278 provider = pr.mProvider;
6279 } else {
Sudheer Shankafc46e9b2016-10-21 17:55:27 -07006280 holder = new ContentProviderHolder(info);
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006281 holder.provider = provider;
6282 holder.noReleaseNeeded = true;
6283 pr = installProviderAuthoritiesLocked(provider, localProvider, holder);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006284 mLocalProviders.put(jBinder, pr);
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006285 mLocalProvidersByName.put(cname, pr);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006286 }
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006287 retHolder = pr.mHolder;
6288 } else {
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006289 ProviderRefCount prc = mProviderRefCountMap.get(jBinder);
6290 if (prc != null) {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006291 if (DEBUG_PROVIDER) {
6292 Slog.v(TAG, "installProvider: lost the race, updating ref count");
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006293 }
Wale Ogunwale1d646122015-04-24 14:45:14 -07006294 // We need to transfer our new reference to the existing
6295 // ref count, releasing the old one... but only if
6296 // release is needed (that is, it is not running in the
6297 // system process).
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006298 if (!noReleaseNeeded) {
6299 incProviderRefLocked(prc, stable);
Wale Ogunwale1d646122015-04-24 14:45:14 -07006300 try {
Sudheer Shankadc589ac2016-11-10 15:30:17 -08006301 ActivityManager.getService().removeContentProvider(
Wale Ogunwale1d646122015-04-24 14:45:14 -07006302 holder.connection, stable);
6303 } catch (RemoteException e) {
6304 //do nothing content provider object is dead any way
6305 }
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006306 }
6307 } else {
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006308 ProviderClientRecord client = installProviderAuthoritiesLocked(
6309 provider, localProvider, holder);
6310 if (noReleaseNeeded) {
6311 prc = new ProviderRefCount(holder, client, 1000, 1000);
6312 } else {
6313 prc = stable
6314 ? new ProviderRefCount(holder, client, 1, 0)
6315 : new ProviderRefCount(holder, client, 0, 1);
6316 }
6317 mProviderRefCountMap.put(jBinder, prc);
Jeff Brownddaa9ac2011-11-11 20:16:14 -08006318 }
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006319 retHolder = prc.holder;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006320 }
6321 }
Dianne Hackborn6ae8d182012-05-23 13:12:42 -07006322 return retHolder;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006323 }
6324
Romain Guy65b345f2011-07-27 18:51:50 -07006325 private void attach(boolean system) {
Jeff Sharkey66a017b2013-01-17 18:18:22 -08006326 sCurrentActivityThread = this;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006327 mSystemThread = system;
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006328 if (!system) {
Dianne Hackborn6dd005b2011-07-18 13:22:50 -07006329 ViewRootImpl.addFirstDrawHandler(new Runnable() {
Craig Mautner88c05892013-06-28 09:47:45 -07006330 @Override
Dianne Hackborn2a9094d2010-02-03 19:20:09 -08006331 public void run() {
6332 ensureJitEnabled();
6333 }
6334 });
Siva Velusamyd693dfa2012-09-10 14:36:58 -07006335 android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
6336 UserHandle.myUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006337 RuntimeInit.setApplicationObject(mAppThread.asBinder());
Sudheer Shankadc589ac2016-11-10 15:30:17 -08006338 final IActivityManager mgr = ActivityManager.getService();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006339 try {
6340 mgr.attachApplication(mAppThread);
6341 } catch (RemoteException ex) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07006342 throw ex.rethrowFromSystemServer();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006343 }
Dianne Hackborn89ad4562014-08-24 16:45:38 -07006344 // Watch for getting close to heap limit.
6345 BinderInternal.addGcWatcher(new Runnable() {
6346 @Override public void run() {
6347 if (!mSomeActivitiesChanged) {
6348 return;
6349 }
6350 Runtime runtime = Runtime.getRuntime();
6351 long dalvikMax = runtime.maxMemory();
6352 long dalvikUsed = runtime.totalMemory() - runtime.freeMemory();
6353 if (dalvikUsed > ((3*dalvikMax)/4)) {
6354 if (DEBUG_MEMORY_TRIM) Slog.d(TAG, "Dalvik max=" + (dalvikMax/1024)
6355 + " total=" + (runtime.totalMemory()/1024)
6356 + " used=" + (dalvikUsed/1024));
6357 mSomeActivitiesChanged = false;
6358 try {
6359 mgr.releaseSomeActivities(mAppThread);
6360 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07006361 throw e.rethrowFromSystemServer();
Dianne Hackborn89ad4562014-08-24 16:45:38 -07006362 }
6363 }
6364 }
6365 });
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006366 } else {
6367 // Don't set application object here -- if the system crashes,
6368 // we can't display an alert, we just want to die die die.
Siva Velusamyd693dfa2012-09-10 14:36:58 -07006369 android.ddm.DdmHandleAppName.setAppName("system_process",
Dianne Hackborn89ad4562014-08-24 16:45:38 -07006370 UserHandle.myUserId());
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006371 try {
6372 mInstrumentation = new Instrumentation();
Jeff Browndefd4a62014-03-10 21:24:37 -07006373 ContextImpl context = ContextImpl.createAppContext(
6374 this, getSystemContext().mPackageInfo);
Jeff Brown7fc8e352014-09-16 18:06:47 -07006375 mInitialApplication = context.mPackageInfo.makeApplication(true, null);
6376 mInitialApplication.onCreate();
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006377 } catch (Exception e) {
6378 throw new RuntimeException(
6379 "Unable to instantiate Application():" + e.toString(), e);
6380 }
6381 }
Geremy Condrab7faaf42012-09-19 18:07:42 -07006382
6383 // add dropbox logging to libcore
6384 DropBox.setReporter(new DropBoxReporter());
6385
Andrii Kulian44607962017-03-16 11:06:24 -07006386 ViewRootImpl.ConfigChangedCallback configChangedCallback
6387 = (Configuration globalConfig) -> {
6388 synchronized (mResourcesManager) {
6389 // We need to apply this change to the resources immediately, because upon returning
6390 // the view hierarchy will be informed about it.
6391 if (mResourcesManager.applyConfigurationToResourcesLocked(globalConfig,
6392 null /* compat */)) {
6393 updateLocaleListFromAppContext(mInitialApplication.getApplicationContext(),
6394 mResourcesManager.getConfiguration().getLocales());
Adam Lesinskib61e4052016-05-19 18:23:05 -07006395
Andrii Kulian44607962017-03-16 11:06:24 -07006396 // This actually changed the resources! Tell everyone about it.
6397 if (mPendingConfiguration == null
6398 || mPendingConfiguration.isOtherSeqNewer(globalConfig)) {
6399 mPendingConfiguration = globalConfig;
6400 sendMessage(H.CONFIGURATION_CHANGED, globalConfig);
Dianne Hackborne36d6e22010-02-17 19:46:25 -08006401 }
6402 }
Dianne Hackborne36d6e22010-02-17 19:46:25 -08006403 }
Andrii Kulian44607962017-03-16 11:06:24 -07006404 };
6405 ViewRootImpl.addConfigCallback(configChangedCallback);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006406 }
6407
Romain Guy5e9120d2012-01-30 12:17:22 -08006408 public static ActivityThread systemMain() {
Alan Viverette5e1565e2014-07-29 16:14:25 -07006409 // The system process on low-memory devices do not get to use hardware
6410 // accelerated drawing, since this can add too much overhead to the
6411 // process.
6412 if (!ActivityManager.isHighEndGfx()) {
John Reck51aaf902015-12-02 15:08:07 -08006413 ThreadedRenderer.disable(true);
John Reck73840ea2014-09-22 07:39:18 -07006414 } else {
John Reck51aaf902015-12-02 15:08:07 -08006415 ThreadedRenderer.enableForegroundTrimming();
Alan Viverette5e1565e2014-07-29 16:14:25 -07006416 }
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006417 ActivityThread thread = new ActivityThread();
6418 thread.attach(true);
6419 return thread;
6420 }
6421
Jeff Brown10e89712011-07-08 18:52:57 -07006422 public final void installSystemProviders(List<ProviderInfo> providers) {
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006423 if (providers != null) {
Jeff Brown10e89712011-07-08 18:52:57 -07006424 installContentProviders(mInitialApplication, providers);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006425 }
6426 }
6427
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08006428 public int getIntCoreSetting(String key, int defaultValue) {
Craig Mautner88c05892013-06-28 09:47:45 -07006429 synchronized (mResourcesManager) {
Svetoslav Ganov9aa597e2011-03-03 18:17:41 -08006430 if (mCoreSettings != null) {
6431 return mCoreSettings.getInt(key, defaultValue);
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08006432 }
Craig Mautner88c05892013-06-28 09:47:45 -07006433 return defaultValue;
Svetoslav Ganov54d068e2011-03-02 12:58:40 -08006434 }
6435 }
6436
Jason Monk69457102017-06-06 18:01:31 -04006437 private <T> T instantiate(ClassLoader cl, String className, Context c,
6438 Instantiator<T> instantiator)
6439 throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Jason Monk0b06d4e2017-07-14 10:22:36 -04006440 Application app = getApp(c);
6441 if (app != null) {
6442 T a = instantiator.instantiate(app, cl, className);
Jason Monk69457102017-06-06 18:01:31 -04006443 if (a != null) return a;
6444 }
6445 return (T) cl.loadClass(className).newInstance();
6446 }
6447
6448 private <T> T instantiate(ClassLoader cl, String className, Intent intent, Context c,
6449 IntentInstantiator<T> instantiator)
6450 throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Jason Monk0b06d4e2017-07-14 10:22:36 -04006451 Application app = getApp(c);
6452 if (app != null) {
6453 T a = instantiator.instantiate(app, cl, className, intent);
Jason Monk69457102017-06-06 18:01:31 -04006454 if (a != null) return a;
6455 }
6456 return (T) cl.loadClass(className).newInstance();
6457 }
6458
Jason Monk0b06d4e2017-07-14 10:22:36 -04006459 private Application getApp(Context c) {
6460 // We need this shortcut to avoid actually calling getApplicationContext() on an Application
6461 // because the Application may not return itself for getApplicationContext() because the
6462 // API doesn't enforce it.
6463 if (c instanceof Application) return (Application) c;
6464 if (c.getApplicationContext() instanceof Application) {
6465 return (Application) c.getApplicationContext();
6466 }
6467 return null;
6468 }
6469
Jason Monk69457102017-06-06 18:01:31 -04006470 private interface Instantiator<T> {
6471 T instantiate(Application app, ClassLoader cl, String className)
6472 throws ClassNotFoundException, IllegalAccessException, InstantiationException;
6473 }
6474
6475 private interface IntentInstantiator<T> {
6476 T instantiate(Application app, ClassLoader cl, String className, Intent intent)
6477 throws ClassNotFoundException, IllegalAccessException, InstantiationException;
6478 }
6479
Geremy Condra69689a72012-09-11 16:57:17 -07006480 private static class EventLoggingReporter implements EventLogger.Reporter {
6481 @Override
6482 public void report (int code, Object... list) {
6483 EventLog.writeEvent(code, list);
6484 }
6485 }
6486
Geremy Condrab7faaf42012-09-19 18:07:42 -07006487 private class DropBoxReporter implements DropBox.Reporter {
6488
6489 private DropBoxManager dropBox;
6490
Narayan Kamath7f062242015-04-08 13:24:13 +01006491 public DropBoxReporter() {}
Geremy Condrab7faaf42012-09-19 18:07:42 -07006492
6493 @Override
6494 public void addData(String tag, byte[] data, int flags) {
Narayan Kamath7f062242015-04-08 13:24:13 +01006495 ensureInitialized();
Geremy Condrab7faaf42012-09-19 18:07:42 -07006496 dropBox.addData(tag, data, flags);
6497 }
6498
6499 @Override
6500 public void addText(String tag, String data) {
Narayan Kamath7f062242015-04-08 13:24:13 +01006501 ensureInitialized();
Geremy Condrab7faaf42012-09-19 18:07:42 -07006502 dropBox.addText(tag, data);
6503 }
Narayan Kamath7f062242015-04-08 13:24:13 +01006504
6505 private synchronized void ensureInitialized() {
6506 if (dropBox == null) {
6507 dropBox = (DropBoxManager) getSystemContext().getSystemService(Context.DROPBOX_SERVICE);
6508 }
6509 }
Geremy Condrab7faaf42012-09-19 18:07:42 -07006510 }
6511
Romain Guy65b345f2011-07-27 18:51:50 -07006512 public static void main(String[] args) {
Narayan Kamathfbb32f62015-06-12 15:34:35 +01006513 Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
Bob Leee5408332009-09-04 18:31:17 -07006514
Brad Fitzpatrick4d9e6d22010-11-15 08:49:51 -08006515 // CloseGuard defaults to true and can be quite spammy. We
6516 // disable it here, but selectively enable it later (via
6517 // StrictMode) on debug builds, but using DropBox, not logs.
6518 CloseGuard.setEnabled(false);
6519
Andreas Gamped281b422016-07-08 03:50:27 +00006520 Environment.initForCurrentUser();
Jeff Sharkeyb049e212012-09-07 23:16:01 -07006521
Geremy Condra69689a72012-09-11 16:57:17 -07006522 // Set the reporter for event logging in libcore
6523 EventLogger.setReporter(new EventLoggingReporter());
6524
Robin Lee3d076af2014-04-25 14:57:49 +01006525 // Make sure TrustedCertificateStore looks in the right place for CA certificates
6526 final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
6527 TrustedCertificateStore.setDefaultUserDirectory(configDir);
6528
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006529 Process.setArgV0("<pre-initialized>");
6530
6531 Looper.prepareMainLooper();
6532
6533 ActivityThread thread = new ActivityThread();
6534 thread.attach(false);
6535
Vairavan Srinivasan7335cfd2012-08-18 18:36:03 -07006536 if (sMainThreadHandler == null) {
6537 sMainThreadHandler = thread.getHandler();
6538 }
6539
Dianne Hackborn287952c2010-09-22 22:34:31 -07006540 if (false) {
6541 Looper.myLooper().setMessageLogging(new
6542 LogPrinter(Log.DEBUG, "ActivityThread"));
6543 }
6544
Narayan Kamathfbb32f62015-06-12 15:34:35 +01006545 // End of event ActivityThreadMain.
6546 Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006547 Looper.loop();
6548
Jeff Brown10e89712011-07-08 18:52:57 -07006549 throw new RuntimeException("Main thread loop unexpectedly exited");
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006550 }
Chris Craikfc294242016-12-13 18:10:46 -08006551
6552 // ------------------ Regular JNI ------------------------
6553
6554 private native void nDumpGraphicsInfo(FileDescriptor fd);
The Android Open Source Project9066cfe2009-03-03 19:31:44 -08006555}