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

Commit 72f47a3f authored by Nikita Ioffe's avatar Nikita Ioffe
Browse files

Don't bind mount app storage for app with NO_APP_DATA_STORAGE

Such apps don't have any internal storage in the first place, hence
there is no need in hiding it via bind mount.

Bug: 211761016
Test: add NO_APP_DATA_STORAGE property to supplemental process
Test: checked that supplemental process can be started
Test: atest PackageManagerShellTest
Test: atest android.appsecurity.cts.StorageHostTest#testNoInternalAppStorage
Change-Id: I857607e6c1fdd670d1456566bd8cce02793edcb2
parent a8bc22f0
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -135,6 +135,7 @@ import com.android.server.Watchdog;
import com.android.server.am.ActivityManagerService.ProcessChangeItem;
import com.android.server.compat.PlatformCompat;
import com.android.server.pm.dex.DexManager;
import com.android.server.pm.parsing.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageStateInternal;
import com.android.server.wm.ActivityServiceConnectionsHolder;
import com.android.server.wm.WindowManagerService;
@@ -2379,6 +2380,8 @@ public final class ProcessList {
            final String[] targetPackagesList = sharedPackages.length == 0
                    ? new String[]{app.info.packageName} : sharedPackages;

            final boolean hasAppStorage = hasAppStorage(pmInt, app.info.packageName);

            pkgDataInfoMap = getPackageAppDataInfoMap(pmInt, targetPackagesList, uid);
            if (pkgDataInfoMap == null) {
                // TODO(b/152760674): Handle inode == 0 case properly, now we just give it a
@@ -2401,6 +2404,12 @@ public final class ProcessList {
                bindMountAppsData = false;
            }

            if (!hasAppStorage) {
                bindMountAppsData = false;
                pkgDataInfoMap = null;
                allowlistedAppDataInfoMap = null;
            }

            int userId = UserHandle.getUserId(uid);
            StorageManagerInternal storageManagerInternal = LocalServices.getService(
                    StorageManagerInternal.class);
@@ -2488,6 +2497,17 @@ public final class ProcessList {
        }
    }

    private boolean hasAppStorage(PackageManagerInternal pmInt, String packageName) {
        final AndroidPackage pkg = pmInt.getPackage(packageName);
        if (pkg == null) {
            Slog.w(TAG, "Unknown package " + packageName);
            return false;
        }
        final PackageManager.Property noAppStorageProp =
                    pkg.getProperties().get(PackageManager.PROPERTY_NO_APP_DATA_STORAGE);
        return noAppStorageProp == null || !noAppStorageProp.getBoolean();
    }

    @GuardedBy("mService")
    void startProcessLocked(ProcessRecord app, HostingRecord hostingRecord, int zygotePolicyFlags) {
        startProcessLocked(app, hostingRecord, zygotePolicyFlags, null /* abiOverride */);