diff options
| author | David Brazdil <dbrazdil@google.com> | 2019-02-27 23:56:03 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2019-02-27 23:56:03 +0000 |
| commit | 42ef8a164ece795b8c410440db922208322dc526 (patch) | |
| tree | ccc66b3e691c3ddaa15b979fd89af8a89478e0a9 /core/java/android | |
| parent | 6dabb47132d6ce169a8592a209556a5791eb84d3 (diff) | |
| parent | 33bd343596d6272913c47213e1a7d896ba42db00 (diff) | |
Merge "Move ApplicationInfo to params in AppComponentFactory"
Diffstat (limited to 'core/java/android')
| -rw-r--r-- | core/java/android/app/AppComponentFactory.java | 18 | ||||
| -rw-r--r-- | core/java/android/app/LoadedApk.java | 26 |
2 files changed, 17 insertions, 27 deletions
diff --git a/core/java/android/app/AppComponentFactory.java b/core/java/android/app/AppComponentFactory.java index ae632915dd2d..2cec7f0fc323 100644 --- a/core/java/android/app/AppComponentFactory.java +++ b/core/java/android/app/AppComponentFactory.java @@ -27,6 +27,7 @@ import android.content.pm.ApplicationInfo; * * @see #instantiateApplication * @see #instantiateActivity + * @see #instantiateClassLoader * @see #instantiateService * @see #instantiateReceiver * @see #instantiateProvider @@ -39,8 +40,10 @@ public class AppComponentFactory { * a custom class loader hierarchy. * * @param cl The default classloader instantiated by platform. + * @param aInfo Information about the application being loaded. */ - public @NonNull ClassLoader instantiateClassLoader(@NonNull ClassLoader cl) { + public @NonNull ClassLoader instantiateClassLoader(@NonNull ClassLoader cl, + @NonNull ApplicationInfo aInfo) { return cl; } @@ -133,19 +136,6 @@ public class AppComponentFactory { return (ContentProvider) cl.loadClass(className).newInstance(); } - private ApplicationInfo mApplicationInfo = null; - - void setApplicationInfo(ApplicationInfo info) { - mApplicationInfo = info; - } - - /** - * Returns the ApplicationInfo associated with this package. - */ - public ApplicationInfo getApplicationInfo() { - return mApplicationInfo; - } - /** * @hide */ diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index 5c4c0052cfbb..5d186a25596f 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -232,7 +232,8 @@ public final class LoadedApk { mResources = Resources.getSystem(); mDefaultClassLoader = ClassLoader.getSystemClassLoader(); mAppComponentFactory = createAppFactory(mApplicationInfo, mDefaultClassLoader); - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); } /** @@ -243,19 +244,15 @@ public final class LoadedApk { mApplicationInfo = info; mDefaultClassLoader = classLoader; mAppComponentFactory = createAppFactory(info, mDefaultClassLoader); - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); } private AppComponentFactory createAppFactory(ApplicationInfo appInfo, ClassLoader cl) { if (appInfo.appComponentFactory != null && cl != null) { try { - AppComponentFactory factory = (AppComponentFactory) cl.loadClass( - appInfo.appComponentFactory).newInstance(); - // Pass a copy of ApplicationInfo to the factory. Copying protects the framework - // from apps which would override the factory and change ApplicationInfo contents. - // ApplicationInfo is used to set up the default class loader. - factory.setApplicationInfo(new ApplicationInfo(appInfo)); - return factory; + return (AppComponentFactory) + cl.loadClass(appInfo.appComponentFactory).newInstance(); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { Slog.e(TAG, "Unable to instantiate appComponentFactory", e); } @@ -729,8 +726,8 @@ public final class LoadedApk { mDefaultClassLoader = ClassLoader.getSystemClassLoader(); } mAppComponentFactory = createAppFactory(mApplicationInfo, mDefaultClassLoader); - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); - + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); return; } @@ -821,7 +818,8 @@ public final class LoadedApk { } if (mClassLoader == null) { - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); } return; @@ -935,8 +933,10 @@ public final class LoadedApk { // Call AppComponentFactory to select/create the main class loader of this app. // Since this may call code in the app, mDefaultClassLoader must be fully set up // before invoking the factory. + // Invoke with a copy of ApplicationInfo to protect against the app changing it. if (mClassLoader == null) { - mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader); + mClassLoader = mAppComponentFactory.instantiateClassLoader(mDefaultClassLoader, + new ApplicationInfo(mApplicationInfo)); } } |
