Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f427b4f0 authored by Sanjana Sunil's avatar Sanjana Sunil
Browse files

Set correct volume storage path for SDK sandbox

Context.getDataDir() for SDK sandbox incorrectly returns /data volume
path even if the actual storage is on another volume. This CL sets the
correct storage path by checking the uuid from the ApplicationInfo of
the client app and setting it to the same value.

Bug: 229736419
Test: atest
SdkSandboxStorageHostTest#testSdkSharedStorage_DifferentVolumeIsUsable

Change-Id: Ib72ea559363cdeb4b7cfcc2f48ca8ddace96e352
parent cab6ff99
Loading
Loading
Loading
Loading
+27 −10
Original line number Diff line number Diff line
@@ -872,6 +872,7 @@ public final class ActivityThread extends ClientTransactionHandler
        String processName;
        @UnsupportedAppUsage
        ApplicationInfo appInfo;
        String sdkSandboxClientAppVolumeUuid;
        String sdkSandboxClientAppPackage;
        @UnsupportedAppUsage
        List<ProviderInfo> providers;
@@ -1118,9 +1119,10 @@ public final class ActivityThread extends ClientTransactionHandler

        @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 @@ public final class ActivityThread extends ClientTransactionHandler
            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 @@ public final class ActivityThread extends ClientTransactionHandler
        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 @@ public final class ActivityThread extends ClientTransactionHandler
    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 @@ public final class ActivityThread extends ClientTransactionHandler
                        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));
@@ -6577,9 +6592,11 @@ public final class ActivityThread extends ClientTransactionHandler
            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) {
+1 −1
Original line number Diff line number Diff line
@@ -72,7 +72,7 @@ oneway interface IApplicationThread {
    @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,
+8 −5
Original line number Diff line number Diff line
@@ -400,7 +400,8 @@ public final class LoadedApk {
        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 @@ public final class LoadedApk {
        }
    }

    /** @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
+18 −4
Original line number Diff line number Diff line
@@ -478,8 +478,15 @@ public class Environment {
    }

    /** {@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 @@ public class Environment {
    }

    /** {@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) {
+1 −1
Original line number Diff line number Diff line
@@ -425,7 +425,7 @@ public class TransactionParcelTests {

        @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,
Loading