From 70f72fa3d5927034d24c2752b450a4adc6996927 Mon Sep 17 00:00:00 2001 From: Sanjana Sunil Date: Tue, 8 Mar 2022 16:16:18 +0000 Subject: 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. Quota calculation for sandbox storage is already present. Bug: 215506889 Test: atest SdkSandboxStorageHostTest#testSdkDataIsAttributedToApp Ignore-AOSP-First: Will cherry pick to AOSP once dependent CLs are also cherry-picked. Change-Id: I94bc30f7e47e06b3b60d28f16a647a2a0daaae93 Merged-In: I94bc30f7e47e06b3b60d28f16a647a2a0daaae93 (cherry picked from commit 577b3c4e786c8a18e8e50b50925cf6c7ff7215d9) --- cmds/installd/InstalldNativeService.cpp | 42 ++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/cmds/installd/InstalldNativeService.cpp b/cmds/installd/InstalldNativeService.cpp index 03fbd5d62f..a92de4efc0 100644 --- a/cmds/installd/InstalldNativeService.cpp +++ b/cmds/installd/InstalldNativeService.cpp @@ -2208,6 +2208,12 @@ static void collectQuotaStats(const std::string& uuid, int32_t userId, stats->dataSize += space; } deductDoubleSpaceIfNeeded(stats, doubleSpaceToBeDeleted, uid, uuid); + 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) { @@ -2285,8 +2291,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; @@ -2311,6 +2326,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/), + // 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); } @@ -2458,6 +2478,19 @@ binder::Status InstalldNativeService::getAppSize(const std::optional), + // 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( @@ -2694,6 +2727,13 @@ binder::Status InstalldNativeService::getUserSize(const std::optional