diff options
| author | 2022-02-24 21:57:08 +0000 | |
|---|---|---|
| committer | 2022-02-24 21:57:08 +0000 | |
| commit | eebb589d99f49cca95da1bbfa93d2eddfddafb24 (patch) | |
| tree | df4f33eca7392bfbe0ffcdc19cef1107e38eedf4 | |
| parent | c19e7239314353a405ce07bc7abc9865cc78c316 (diff) | |
| parent | e214eee46f232e83e91d699f8754574dff1a865a (diff) | |
Merge "Update duplicate-app WTF" into tm-dev
| -rw-r--r-- | core/java/android/app/Application.java | 42 |
1 files changed, 14 insertions, 28 deletions
diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java index 9eb3e8fb0160..7c337a4319ca 100644 --- a/core/java/android/app/Application.java +++ b/core/java/android/app/Application.java @@ -29,14 +29,12 @@ import android.content.Intent; import android.content.res.Configuration; import android.os.Build; import android.os.Bundle; -import android.util.ArrayMap; import android.util.Log; import android.util.Slog; import android.view.autofill.AutofillManager; -import com.android.internal.annotations.GuardedBy; - import java.util.ArrayList; +import java.util.concurrent.atomic.AtomicReference; /** * Base class for maintaining global application state. You can provide your own @@ -74,12 +72,8 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { @UnsupportedAppUsage public LoadedApk mLoadedApk; - @GuardedBy("sInstances") - private static final ArrayMap<Class<?>, Application> sInstances = - DEBUG_DUP_APP_INSTANCES ? new ArrayMap<>(1) : null; - - // Only set when DEBUG_DUP_APP_INSTANCES is true. - private StackTrace mConstructorStackTrace; + private static final AtomicReference<StackTrace> sConstructorStackTrace = + new AtomicReference<>(); public interface ActivityLifecycleCallbacks { @@ -252,28 +246,20 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } private void checkDuplicateInstances() { - final Class<?> myClass = this.getClass(); - - // We only activate this check for custom application classes. - // Otherwise, it'd misfire if multiple apps share the same process, if all of them use - // the same Application class (on the same classloader). - if (myClass == Application.class) { + // STOPSHIP: Delete this check b/221248960 + // Only run this check for gms-core. + if (!"com.google.android.gms".equals(ActivityThread.currentOpPackageName())) { return; } - synchronized (sInstances) { - final Application firstInstance = sInstances.get(myClass); - if (firstInstance == null) { - this.mConstructorStackTrace = new StackTrace("First ctor was called here"); - sInstances.put(myClass, this); - return; - } - final StackTrace currentStackTrace = new StackTrace("Current ctor was called here", - firstInstance.mConstructorStackTrace); - this.mConstructorStackTrace = currentStackTrace; - Slog.wtf(TAG, "Application ctor called twice for " + myClass - + " first LoadedApk=" + firstInstance.getLoadedApkInfo(), - currentStackTrace); + + final StackTrace previousStackTrace = sConstructorStackTrace.getAndSet( + new StackTrace("Previous stack trace")); + if (previousStackTrace == null) { + // This is the first call. + return; } + Slog.wtf(TAG, "Application ctor called twice for " + this.getClass(), + new StackTrace("Current stack trace", previousStackTrace)); } private String getLoadedApkInfo() { |