From 07fe63e5de3cbc36a213178faede137cf648170a Mon Sep 17 00:00:00 2001 From: Dan Sandler Date: Tue, 15 Aug 2017 16:41:11 -0400 Subject: [PATCH] Revert "Add API to allow apps more control over instantiation" This reverts commit 6945710e124ae22dac90f53e9183ab67c6eab258. Bug: 64345190 Test: n/a Change-Id: Id0aa0f3c9fca64476d163ea8b42a74182050b3ae --- api/current.txt | 6 --- api/system-current.txt | 6 --- api/test-current.txt | 6 --- core/java/android/app/ActivityThread.java | 75 +++++------------------------- core/java/android/app/Application.java | 76 +------------------------------ 5 files changed, 13 insertions(+), 156 deletions(-) diff --git a/api/current.txt b/api/current.txt index 4f117ee00ae9..ec81e7959302 100644 --- a/api/current.txt +++ b/api/current.txt @@ -4214,12 +4214,6 @@ package android.app { public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 { ctor public Application(); - method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String); - method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String); - method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String); - method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent); method public void onConfigurationChanged(android.content.res.Configuration); method public void onCreate(); method public void onLowMemory(); diff --git a/api/system-current.txt b/api/system-current.txt index cca933ec2fe4..a072605b3caa 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -4377,12 +4377,6 @@ package android.app { public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 { ctor public Application(); - method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String); - method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String); - method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String); - method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent); method public void onConfigurationChanged(android.content.res.Configuration); method public void onCreate(); method public void onLowMemory(); diff --git a/api/test-current.txt b/api/test-current.txt index 56308b0f9ff0..df7df812c5e0 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -4227,12 +4227,6 @@ package android.app { public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 { ctor public Application(); - method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String); - method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String); - method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String); - method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent); - method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent); method public void onConfigurationChanged(android.content.res.Configuration); method public void onCreate(); method public void onLowMemory(); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 43693e1983b7..2e4ce1886fd6 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -2666,14 +2666,8 @@ public final class ActivityThread { Activity activity = null; try { java.lang.ClassLoader cl = appContext.getClassLoader(); - if (appContext.getApplicationContext() instanceof Application) { - activity = ((Application) appContext.getApplicationContext()) - .instantiateActivity(cl, component.getClassName(), r.intent); - } - if (activity == null) { - activity = mInstrumentation.newActivity( - cl, component.getClassName(), r.intent); - } + activity = mInstrumentation.newActivity( + cl, component.getClassName(), r.intent); StrictMode.incrementExpectedActivityCount(activity.getClass()); r.intent.setExtrasClassLoader(cl); r.intent.prepareToEnterProcess(); @@ -3169,8 +3163,7 @@ public final class ActivityThread { data.intent.setExtrasClassLoader(cl); data.intent.prepareToEnterProcess(); data.setExtrasClassLoader(cl); - receiver = instantiate(cl, component, data.intent, app, - Application::instantiateReceiver); + receiver = (BroadcastReceiver)cl.loadClass(component).newInstance(); } catch (Exception e) { if (DEBUG_BROADCAST) Slog.i(TAG, "Finishing failed broadcast to " + data.intent.getComponent()); @@ -3258,13 +3251,12 @@ public final class ActivityThread { } else { try { if (DEBUG_BACKUP) Slog.v(TAG, "Initializing agent class " + classname); - ContextImpl context = ContextImpl.createAppContext(this, packageInfo); java.lang.ClassLoader cl = packageInfo.getClassLoader(); - agent = instantiate(cl, classname, context, - Application::instantiateBackupAgent); + agent = (BackupAgent) cl.loadClass(classname).newInstance(); // set up the agent's context + ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(agent); agent.attach(context); @@ -3324,12 +3316,9 @@ public final class ActivityThread { LoadedApk packageInfo = getPackageInfoNoCheck( data.info.applicationInfo, data.compatInfo); Service service = null; - Application app = null; try { - app = packageInfo.makeApplication(false, mInstrumentation); java.lang.ClassLoader cl = packageInfo.getClassLoader(); - service = instantiate(cl, data.info.name, data.intent, app, - Application::instantiateService); + service = (Service) cl.loadClass(data.info.name).newInstance(); } catch (Exception e) { if (!mInstrumentation.onException(service, e)) { throw new RuntimeException( @@ -3344,6 +3333,7 @@ public final class ActivityThread { ContextImpl context = ContextImpl.createAppContext(this, packageInfo); context.setOuterContext(service); + Application app = packageInfo.makeApplication(false, mInstrumentation); service.attach(context, this, data.info.name, data.token, app, ActivityManager.getService()); service.onCreate(); @@ -5682,8 +5672,8 @@ public final class ActivityThread { try { final ClassLoader cl = instrContext.getClassLoader(); - mInstrumentation = instantiate(cl, data.instrumentationName.getClassName(), - instrContext, Application::instantiateInstrumentation); + mInstrumentation = (Instrumentation) + cl.loadClass(data.instrumentationName.getClassName()).newInstance(); } catch (Exception e) { throw new RuntimeException( "Unable to instantiate instrumentation " @@ -6234,8 +6224,8 @@ public final class ActivityThread { try { final java.lang.ClassLoader cl = c.getClassLoader(); - localProvider = instantiate(cl, info.name, context, - Application::instantiateProvider); + localProvider = (ContentProvider)cl. + loadClass(info.name).newInstance(); provider = localProvider.getIContentProvider(); if (provider == null) { Slog.e(TAG, "Failed to instantiate class " + @@ -6434,49 +6424,6 @@ public final class ActivityThread { } } - private T instantiate(ClassLoader cl, String className, Context c, - Instantiator instantiator) - throws ClassNotFoundException, IllegalAccessException, InstantiationException { - Application app = getApp(c); - if (app != null) { - T a = instantiator.instantiate(app, cl, className); - if (a != null) return a; - } - return (T) cl.loadClass(className).newInstance(); - } - - private T instantiate(ClassLoader cl, String className, Intent intent, Context c, - IntentInstantiator instantiator) - throws ClassNotFoundException, IllegalAccessException, InstantiationException { - Application app = getApp(c); - if (app != null) { - T a = instantiator.instantiate(app, cl, className, intent); - if (a != null) return a; - } - return (T) cl.loadClass(className).newInstance(); - } - - private Application getApp(Context c) { - // We need this shortcut to avoid actually calling getApplicationContext() on an Application - // because the Application may not return itself for getApplicationContext() because the - // API doesn't enforce it. - if (c instanceof Application) return (Application) c; - if (c.getApplicationContext() instanceof Application) { - return (Application) c.getApplicationContext(); - } - return null; - } - - private interface Instantiator { - T instantiate(Application app, ClassLoader cl, String className) - throws ClassNotFoundException, IllegalAccessException, InstantiationException; - } - - private interface IntentInstantiator { - T instantiate(Application app, ClassLoader cl, String className, Intent intent) - throws ClassNotFoundException, IllegalAccessException, InstantiationException; - } - private static class EventLoggingReporter implements EventLogger.Reporter { @Override public void report (int code, Object... list) { diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java index cc23ec9023b6..156df36a600c 100644 --- a/core/java/android/app/Application.java +++ b/core/java/android/app/Application.java @@ -16,20 +16,17 @@ package android.app; +import java.util.ArrayList; + import android.annotation.CallSuper; -import android.app.backup.BackupAgent; -import android.content.BroadcastReceiver; import android.content.ComponentCallbacks; import android.content.ComponentCallbacks2; -import android.content.ContentProvider; import android.content.Context; import android.content.ContextWrapper; import android.content.Intent; import android.content.res.Configuration; import android.os.Bundle; -import java.util.ArrayList; - /** * Base class for maintaining global application state. You can provide your own * implementation by creating a subclass and specifying the fully-qualified name @@ -292,73 +289,4 @@ public class Application extends ContextWrapper implements ComponentCallbacks2 { } } } - - /** - * Allows application to override the creation of activities. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - * @param intent Intent creating the class. - */ - public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) { - return null; - } - - /** - * Allows application to override the creation of receivers. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - * @param intent Intent creating the class. - */ - public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, Intent intent) { - return null; - } - - /** - * Allows application to override the creation of services. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - * @param intent Intent creating the class. - */ - public Service instantiateService(ClassLoader cl, String className, Intent intent) { - return null; - } - - /** - * Allows application to override the creation of providers. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - */ - public ContentProvider instantiateProvider(ClassLoader cl, String className) { - return null; - } - - /** - * Allows application to override the creation of backup agents. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - */ - public BackupAgent instantiateBackupAgent(ClassLoader cl, String className) { - return null; - } - - /** - * Allows application to override the creation of instrumentation. This can be used to - * perform things such as dependency injection or class loader changes to these - * classes. Return null to use the default creation flow. - * @param cl The default classloader to use for instantiation. - * @param className The class to be instantiated. - */ - public Instrumentation instantiateInstrumentation(ClassLoader cl, String className) { - return null; - } } \ No newline at end of file -- 2.11.0