diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index 447b1136caa0c..1ce004fd1a862 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -82,6 +82,7 @@ package android.content { } public abstract class Context { + method @NonNull public android.content.Context createContextForSdkInSandbox(@NonNull android.content.pm.ApplicationInfo, int) throws android.content.pm.PackageManager.NameNotFoundException; method @NonNull public android.os.IBinder getIApplicationThreadBinder(); method @NonNull public android.os.UserHandle getUser(); field public static final String PAC_PROXY_SERVICE = "pac_proxy"; diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index afd8a52d43cea..e558b82ba108e 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -2640,7 +2640,7 @@ public final class ActivityThread extends ClientTransactionHandler ClassLoader baseLoader, boolean securityViolation, boolean includeCode, boolean registerPackage) { return getPackageInfo(aInfo, compatInfo, baseLoader, securityViolation, includeCode, - registerPackage, /*isSdkSandbox=*/false); + registerPackage, Process.isSdkSandbox()); } private LoadedApk getPackageInfo(ApplicationInfo aInfo, CompatibilityInfo compatInfo, diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java index 240dbe1eea248..d39b9af3dc612 100644 --- a/core/java/android/app/ContextImpl.java +++ b/core/java/android/app/ContextImpl.java @@ -2583,6 +2583,22 @@ class ContextImpl extends Context { "Application package " + application.packageName + " not found"); } + @Override + public Context createContextForSdkInSandbox(ApplicationInfo sdkInfo, int flags) + throws NameNotFoundException { + if (!Process.isSdkSandbox()) { + throw new SecurityException("API can only be called from SdkSandbox process"); + } + + ContextImpl ctx = (ContextImpl) createApplicationContext(sdkInfo, flags); + + // Set sandbox app's context as the application context for sdk context + ctx.mPackageInfo.makeApplicationInner(/*forceDefaultAppClass=*/false, + /*instrumentation=*/null); + + return ctx; + } + @Override public Context createPackageContext(String packageName, int flags) throws NameNotFoundException { diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index 20b06265a211b..4faa83b8802c8 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -6852,6 +6852,26 @@ public abstract class Context { public abstract Context createApplicationContext(ApplicationInfo application, @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException; + /** + * Creates a context given an {@link android.content.pm.ApplicationInfo}. + * + * Context created is for an sdk library that is being loaded in sdk sandbox. + * + * @param sdkInfo information regarding the sdk library being loaded. + * + * @throws PackageManager.NameNotFoundException if there is no application with + * the given package name. + * @throws SecurityException if caller is not a SdkSandbox process. + * + * @hide + */ + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + @NonNull + public Context createContextForSdkInSandbox(@NonNull ApplicationInfo sdkInfo, + @CreatePackageOptions int flags) throws PackageManager.NameNotFoundException { + throw new RuntimeException("Not implemented. Must override in a subclass."); + } + /** * Return a new Context object for the given split name. The new Context has a ClassLoader and * Resources object that can access the split's and all of its dependencies' code/resources. diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index 0dc4adc79f307..e65e91c45396e 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -1071,6 +1071,15 @@ public class ContextWrapper extends Context { return mBase.createApplicationContext(application, flags); } + /** @hide */ + @Override + @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES) + @NonNull + public Context createContextForSdkInSandbox(@NonNull ApplicationInfo sdkInfo, int flags) + throws PackageManager.NameNotFoundException { + return mBase.createContextForSdkInSandbox(sdkInfo, flags); + } + /** @hide */ @Override public Context createContextForSplit(String splitName)