Merge "Set correct volume storage path for SDK sandbox"
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 19e0fc0..69868ab 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -872,6 +872,7 @@
String processName;
@UnsupportedAppUsage
ApplicationInfo appInfo;
+ String sdkSandboxClientAppVolumeUuid;
String sdkSandboxClientAppPackage;
@UnsupportedAppUsage
List<ProviderInfo> providers;
@@ -1118,9 +1119,10 @@
@Override
public final void bindApplication(String processName, ApplicationInfo appInfo,
- String sdkSandboxClientAppPackage, ProviderInfoList providerList,
- ComponentName instrumentationName, ProfilerInfo profilerInfo,
- Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher,
+ String sdkSandboxClientAppVolumeUuid, String sdkSandboxClientAppPackage,
+ ProviderInfoList providerList, ComponentName instrumentationName,
+ ProfilerInfo profilerInfo, Bundle instrumentationArgs,
+ IInstrumentationWatcher instrumentationWatcher,
IUiAutomationConnection instrumentationUiConnection, int debugMode,
boolean enableBinderTracking, boolean trackAllocation,
boolean isRestrictedBackupMode, boolean persistent, Configuration config,
@@ -1160,6 +1162,7 @@
AppBindData data = new AppBindData();
data.processName = processName;
data.appInfo = appInfo;
+ data.sdkSandboxClientAppVolumeUuid = sdkSandboxClientAppVolumeUuid;
data.sdkSandboxClientAppPackage = sdkSandboxClientAppPackage;
data.providers = providerList.getList();
data.instrumentationName = instrumentationName;
@@ -2564,6 +2567,11 @@
return getPackageInfo(ai, compatInfo, null, false, true, false);
}
+ private LoadedApk getPackageInfoNoCheck(ApplicationInfo ai, CompatibilityInfo compatInfo,
+ boolean isSdkSandbox) {
+ return getPackageInfo(ai, compatInfo, null, false, true, false, isSdkSandbox);
+ }
+
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
public final LoadedApk peekPackageInfo(String packageName, boolean includeCode) {
synchronized (mResourcesManager) {
@@ -2580,11 +2588,18 @@
private LoadedApk getPackageInfo(ApplicationInfo aInfo, CompatibilityInfo compatInfo,
ClassLoader baseLoader, boolean securityViolation, boolean includeCode,
boolean registerPackage) {
+ return getPackageInfo(aInfo, compatInfo, baseLoader, securityViolation, includeCode,
+ registerPackage, /*isSdkSandbox=*/false);
+ }
+
+ private LoadedApk getPackageInfo(ApplicationInfo aInfo, CompatibilityInfo compatInfo,
+ ClassLoader baseLoader, boolean securityViolation, boolean includeCode,
+ boolean registerPackage, boolean isSdkSandbox) {
final boolean differentUser = (UserHandle.myUserId() != UserHandle.getUserId(aInfo.uid));
synchronized (mResourcesManager) {
WeakReference<LoadedApk> ref;
- if (differentUser) {
- // Caching not supported across users
+ if (differentUser || isSdkSandbox) {
+ // Caching not supported across users and for sdk sandboxes
ref = null;
} else if (includeCode) {
ref = mPackages.get(aInfo.packageName);
@@ -2631,8 +2646,8 @@
getSystemContext().mPackageInfo.getClassLoader());
}
- if (differentUser) {
- // Caching not supported across users
+ if (differentUser || isSdkSandbox) {
+ // Caching not supported across users and for sdk sandboxes
} else if (includeCode) {
mPackages.put(aInfo.packageName,
new WeakReference<LoadedApk>(packageInfo));
@@ -6548,9 +6563,11 @@
mConfigurationController.applyCompatConfiguration();
}
- data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo);
- if (data.sdkSandboxClientAppPackage != null) {
- data.info.setSdkSandboxStorage(data.sdkSandboxClientAppPackage);
+ final boolean isSdkSandbox = data.sdkSandboxClientAppPackage != null;
+ data.info = getPackageInfoNoCheck(data.appInfo, data.compatInfo, isSdkSandbox);
+ if (isSdkSandbox) {
+ data.info.setSdkSandboxStorage(data.sdkSandboxClientAppVolumeUuid,
+ data.sdkSandboxClientAppPackage);
}
if (agent != null) {
diff --git a/core/java/android/app/IApplicationThread.aidl b/core/java/android/app/IApplicationThread.aidl
index f4fbcce..75ad363 100644
--- a/core/java/android/app/IApplicationThread.aidl
+++ b/core/java/android/app/IApplicationThread.aidl
@@ -72,7 +72,7 @@
@UnsupportedAppUsage
void scheduleStopService(IBinder token);
void bindApplication(in String packageName, in ApplicationInfo info,
- in String sdkSandboxClientAppPackage,
+ in String sdkSandboxClientAppVolumeUuid, in String sdkSandboxClientAppPackage,
in ProviderInfoList providerList, in ComponentName testName,
in ProfilerInfo profilerInfo, in Bundle testArguments,
IInstrumentationWatcher testWatcher, IUiAutomationConnection uiAutomationConnection,
diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java
index deefea8..0849a6f 100644
--- a/core/java/android/app/LoadedApk.java
+++ b/core/java/android/app/LoadedApk.java
@@ -400,7 +400,8 @@
mLibDir = aInfo.nativeLibraryDir;
mDataDirFile = FileUtils.newFileOrNull(aInfo.dataDir);
mDeviceProtectedDataDirFile = FileUtils.newFileOrNull(aInfo.deviceProtectedDataDir);
- mCredentialProtectedDataDirFile = FileUtils.newFileOrNull(aInfo.credentialProtectedDataDir);
+ mCredentialProtectedDataDirFile = FileUtils.newFileOrNull(
+ aInfo.credentialProtectedDataDir);
mSplitNames = aInfo.splitNames;
mSplitAppDirs = aInfo.splitSourceDirs;
@@ -412,14 +413,16 @@
}
}
- /** @hide */
- void setSdkSandboxStorage(String sdkSandboxClientAppPackage) {
+ void setSdkSandboxStorage(@Nullable String sdkSandboxClientAppVolumeUuid,
+ String sdkSandboxClientAppPackage) {
int userId = UserHandle.myUserId();
mDeviceProtectedDataDirFile = Environment
- .getDataMiscDeSharedSdkSandboxDirectory(userId, sdkSandboxClientAppPackage)
+ .getDataMiscDeSharedSdkSandboxDirectory(sdkSandboxClientAppVolumeUuid, userId,
+ sdkSandboxClientAppPackage)
.getAbsoluteFile();
mCredentialProtectedDataDirFile = Environment
- .getDataMiscCeSharedSdkSandboxDirectory(userId, sdkSandboxClientAppPackage)
+ .getDataMiscCeSharedSdkSandboxDirectory(sdkSandboxClientAppVolumeUuid, userId,
+ sdkSandboxClientAppPackage)
.getAbsoluteFile();
if ((mApplicationInfo.privateFlags
diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java
index 022d213..5177cb4 100644
--- a/core/java/android/os/Environment.java
+++ b/core/java/android/os/Environment.java
@@ -478,8 +478,15 @@
}
/** {@hide} */
- public static File getDataMiscCeSharedSdkSandboxDirectory(int userId, String packageName) {
- return buildPath(getDataMiscCeDirectory(userId), "sdksandbox", packageName, "shared");
+ private static File getDataMiscCeDirectory(String volumeUuid, int userId) {
+ return buildPath(getDataDirectory(volumeUuid), "misc_ce", String.valueOf(userId));
+ }
+
+ /** {@hide} */
+ public static File getDataMiscCeSharedSdkSandboxDirectory(String volumeUuid, int userId,
+ String packageName) {
+ return buildPath(getDataMiscCeDirectory(volumeUuid, userId), "sdksandbox",
+ packageName, "shared");
}
/** {@hide} */
@@ -488,8 +495,15 @@
}
/** {@hide} */
- public static File getDataMiscDeSharedSdkSandboxDirectory(int userId, String packageName) {
- return buildPath(getDataMiscDeDirectory(userId), "sdksandbox", packageName, "shared");
+ private static File getDataMiscDeDirectory(String volumeUuid, int userId) {
+ return buildPath(getDataDirectory(volumeUuid), "misc_de", String.valueOf(userId));
+ }
+
+ /** {@hide} */
+ public static File getDataMiscDeSharedSdkSandboxDirectory(String volumeUuid, int userId,
+ String packageName) {
+ return buildPath(getDataMiscDeDirectory(volumeUuid, userId), "sdksandbox",
+ packageName, "shared");
}
private static File getDataProfilesDeDirectory(int userId) {
diff --git a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
index 8276d10..0eca0a8 100644
--- a/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
+++ b/core/tests/coretests/src/android/app/servertransaction/TransactionParcelTests.java
@@ -425,7 +425,7 @@
@Override
public void bindApplication(String s, ApplicationInfo applicationInfo,
- String sdkSandboxClientAppPackage,
+ String sdkSandboxClientAppVolumeUuid, String sdkSandboxClientAppPackage,
ProviderInfoList list, ComponentName componentName, ProfilerInfo profilerInfo,
Bundle bundle, IInstrumentationWatcher iInstrumentationWatcher,
IUiAutomationConnection iUiAutomationConnection, int i, boolean b, boolean b1,
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 0630f07..cb22dae 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -4849,7 +4849,8 @@
thread.runIsolatedEntryPoint(
app.getIsolatedEntryPoint(), app.getIsolatedEntryPointArgs());
} else if (instr2 != null) {
- thread.bindApplication(processName, appInfo, app.sdkSandboxClientAppPackage,
+ thread.bindApplication(processName, appInfo,
+ app.sdkSandboxClientAppVolumeUuid, app.sdkSandboxClientAppPackage,
providerList,
instr2.mClass,
profilerInfo, instr2.mArguments,
@@ -4864,7 +4865,8 @@
app.getDisabledCompatChanges(), serializedSystemFontMap,
app.getStartElapsedTime(), app.getStartUptime());
} else {
- thread.bindApplication(processName, appInfo, app.sdkSandboxClientAppPackage,
+ thread.bindApplication(processName, appInfo,
+ app.sdkSandboxClientAppVolumeUuid, app.sdkSandboxClientAppPackage,
providerList, null, profilerInfo, null, null, null, testMode,
mBinderTransactionTrackingEnabled, enableTrackAllocation,
isRestrictedBackupMode || !normalMode, app.isPersistent(),
diff --git a/services/core/java/com/android/server/am/ProcessRecord.java b/services/core/java/com/android/server/am/ProcessRecord.java
index b4ff870..ac5cb2d 100644
--- a/services/core/java/com/android/server/am/ProcessRecord.java
+++ b/services/core/java/com/android/server/am/ProcessRecord.java
@@ -87,6 +87,7 @@
final String processName; // name of the process
final String sdkSandboxClientAppPackage; // if this is an sdk sandbox process, name of the
// app package for which it is running
+ final String sdkSandboxClientAppVolumeUuid; // uuid of the app for which the sandbox is running
/**
* Overall state of process's uid.
@@ -535,6 +536,11 @@
userId = UserHandle.getUserId(_uid);
processName = _processName;
sdkSandboxClientAppPackage = _sdkSandboxClientAppPackage;
+ if (isSdkSandbox) {
+ sdkSandboxClientAppVolumeUuid = getClientInfoForSdkSandbox().volumeUuid;
+ } else {
+ sdkSandboxClientAppVolumeUuid = null;
+ }
mPersistent = false;
mRemoved = false;
mProfile = new ProcessProfileRecord(this);