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

Commit 08c0ff36 authored by Sanjana Sunil's avatar Sanjana Sunil
Browse files

Include SDK sandbox while calculating app and user size

SDK sandbox storage has been separated and need to be specially included
while getting app size and user size.

While calculating app size manually, each of the subdirectories in the
sdk sandbox storage (shared, directories for each sdk etc.) are added up
separately to the total. This is because each of these subdirectories
would contain a cache storage that needs to be added to the cache
calculation.

For quota calculation, the uid of the sandbox storage is used. Cache
data is already added by default to the cache size of the app since the
gids are the same.

Bug: 215506889
Test: atest SdkSandboxStorageHostTest#testSdkDataIsAttributedToApp
Ignore-AOSP-First: Will cherry pick to AOSP once dependent CLs are also
cherry-picked.

Change-Id: I94bc30f7e47e06b3b60d28f16a647a2a0daaae93
parent 431d9218
Loading
Loading
Loading
Loading
+42 −1
Original line number Diff line number Diff line
@@ -2152,6 +2152,13 @@ static void collectQuotaStats(const std::string& uuid, int32_t userId,
            stats->dataSize += space;
        }

        int sdkSandboxUid = multiuser_get_sdk_sandbox_uid(userId, appId);
        if (sdkSandboxUid != -1) {
            if ((space = GetOccupiedSpaceForUid(uuid, sdkSandboxUid)) != -1) {
                stats->dataSize += space;
            }
        }

        int cacheGid = multiuser_get_cache_gid(userId, appId);
        if (cacheGid != -1) {
            if ((space = GetOccupiedSpaceForGid(uuid, cacheGid)) != -1) {
@@ -2259,8 +2266,17 @@ static void collectManualStats(const std::string& path, struct stats* stats) {
    closedir(d);
}

void collectManualStatsForSubDirectories(const std::string& path, struct stats* stats) {
    const auto subDirHandler = [&path, &stats](const std::string& subDir) {
        auto fullpath = path + "/" + subDir;
        collectManualStats(fullpath, stats);
    };
    foreach_subdir(path, subDirHandler);
}

static void collectManualStatsForUser(const std::string& path, struct stats* stats,
        bool exclude_apps = false) {
                                      bool exclude_apps = false,
                                      bool is_sdk_sandbox_storage = false) {
    DIR *d;
    int dfd;
    struct dirent *de;
@@ -2285,6 +2301,11 @@ static void collectManualStatsForUser(const std::string& path, struct stats* sta
                continue;
            } else if (exclude_apps && (user_uid >= AID_APP_START && user_uid <= AID_APP_END)) {
                continue;
            } else if (is_sdk_sandbox_storage) {
                // In case of sdk sandbox storage (e.g. /data/misc_ce/0/sdksandbox/<package-name>),
                // collect individual stats of each subdirectory (shared, storage of each sdk etc.)
                collectManualStatsForSubDirectories(StringPrintf("%s/%s", path.c_str(), name),
                                                    stats);
            } else {
                collectManualStats(StringPrintf("%s/%s", path.c_str(), name), stats);
            }
@@ -2427,6 +2448,19 @@ binder::Status InstalldNativeService::getAppSize(const std::optional<std::string
            collectManualStats(dePath, &stats);
            ATRACE_END();

            // In case of sdk sandbox storage (e.g. /data/misc_ce/0/sdksandbox/<package-name>),
            // collect individual stats of each subdirectory (shared, storage of each sdk etc.)
            if (appId >= AID_APP_START && appId <= AID_APP_END) {
                ATRACE_BEGIN("sdksandbox");
                auto sdkSandboxCePath =
                        create_data_misc_sdk_sandbox_package_path(uuid_, true, userId, pkgname);
                collectManualStatsForSubDirectories(sdkSandboxCePath, &stats);
                auto sdkSandboxDePath =
                        create_data_misc_sdk_sandbox_package_path(uuid_, false, userId, pkgname);
                collectManualStatsForSubDirectories(sdkSandboxDePath, &stats);
                ATRACE_END();
            }

            if (!uuid) {
                ATRACE_BEGIN("profiles");
                calculate_tree_size(
@@ -2663,6 +2697,13 @@ binder::Status InstalldNativeService::getUserSize(const std::optional<std::strin
        collectManualStatsForUser(dePath, &stats);
        ATRACE_END();

        ATRACE_BEGIN("sdksandbox");
        auto sdkSandboxCePath = create_data_misc_sdk_sandbox_path(uuid_, true, userId);
        collectManualStatsForUser(sdkSandboxCePath, &stats, false, true);
        auto sdkSandboxDePath = create_data_misc_sdk_sandbox_path(uuid_, false, userId);
        collectManualStatsForUser(sdkSandboxDePath, &stats, false, true);
        ATRACE_END();

        if (!uuid) {
            ATRACE_BEGIN("profile");
            auto userProfilePath = create_primary_cur_profile_dir_path(userId);