Loading cmds/installd/InstalldNativeService.cpp +90 −68 Original line number Diff line number Diff line Loading @@ -1122,6 +1122,7 @@ static void collectQuotaStats(const std::string& device, int32_t userId, struct dqblk dq; if (stats != nullptr) { uid_t uid = multiuser_get_uid(userId, appId); if (quotactl(QCMD(Q_GETQUOTA, USRQUOTA), device.c_str(), uid, reinterpret_cast<char*>(&dq)) != 0) { Loading Loading @@ -1150,9 +1151,23 @@ static void collectQuotaStats(const std::string& device, int32_t userId, } } #if HACK_FOR_37193650 extStats->dataSize = extStats->dataSize; #else int sharedGid = multiuser_get_shared_gid(0, appId); if (sharedGid != -1) { if (quotactl(QCMD(Q_GETQUOTA, GRPQUOTA), device.c_str(), sharedGid, reinterpret_cast<char*>(&dq)) != 0) { if (errno != ESRCH) { PLOG(ERROR) << "Failed to quotactl " << device << " for GID " << sharedGid; } } else { #if MEASURE_DEBUG LOG(DEBUG) << "quotactl() for GID " << sharedGid << " " << dq.dqb_curspace; #endif stats->codeSize += dq.dqb_curspace; } } } if (extStats != nullptr) { int extGid = multiuser_get_ext_gid(userId, appId); if (extGid != -1) { if (quotactl(QCMD(Q_GETQUOTA, GRPQUOTA), device.c_str(), extGid, Loading @@ -1167,20 +1182,21 @@ static void collectQuotaStats(const std::string& device, int32_t userId, extStats->dataSize += dq.dqb_curspace; } } #endif int sharedGid = multiuser_get_shared_gid(userId, appId); if (sharedGid != -1) { if (quotactl(QCMD(Q_GETQUOTA, GRPQUOTA), device.c_str(), sharedGid, int extCacheGid = multiuser_get_ext_cache_gid(userId, appId); if (extCacheGid != -1) { if (quotactl(QCMD(Q_GETQUOTA, GRPQUOTA), device.c_str(), extCacheGid, reinterpret_cast<char*>(&dq)) != 0) { if (errno != ESRCH) { PLOG(ERROR) << "Failed to quotactl " << device << " for GID " << sharedGid; PLOG(ERROR) << "Failed to quotactl " << device << " for GID " << extCacheGid; } } else { #if MEASURE_DEBUG LOG(DEBUG) << "quotactl() for GID " << sharedGid << " " << dq.dqb_curspace; LOG(DEBUG) << "quotactl() for GID " << extCacheGid << " " << dq.dqb_curspace; #endif stats->codeSize += dq.dqb_curspace; extStats->dataSize += dq.dqb_curspace; extStats->cacheSize += dq.dqb_curspace; } } } } Loading Loading @@ -1256,9 +1272,10 @@ static void collectManualStatsForUser(const std::string& path, struct stats* sta if (fstatat(dfd, name, &s, AT_SYMLINK_NOFOLLOW) != 0) { continue; } int32_t user_uid = multiuser_get_app_id(s.st_uid); if (!strcmp(name, ".") || !strcmp(name, "..")) { continue; } else if (exclude_apps && (s.st_uid >= AID_APP_START && s.st_uid <= AID_APP_END)) { } else if (exclude_apps && (user_uid >= AID_APP_START && user_uid <= AID_APP_END)) { continue; } else { collectManualStats(StringPrintf("%s/%s", path.c_str(), name), stats); Loading Loading @@ -1357,25 +1374,13 @@ binder::Status InstalldNativeService::getAppSize(const std::unique_ptr<std::stri ATRACE_BEGIN("code"); for (auto codePath : codePaths) { calculate_tree_size(codePath, &stats.codeSize, -1, multiuser_get_shared_gid(userId, appId)); multiuser_get_shared_gid(0, appId)); } ATRACE_END(); ATRACE_BEGIN("quota"); collectQuotaStats(device, userId, appId, &stats, &extStats); ATRACE_END(); #if HACK_FOR_37193650 ATRACE_BEGIN("external"); for (size_t i = 0; i < packageNames.size(); i++) { const char* pkgname = packageNames[i].c_str(); auto extPath = create_data_media_package_path(uuid_, userId, "data", pkgname); calculate_tree_size(extPath, &extStats.dataSize); auto mediaPath = create_data_media_package_path(uuid_, userId, "media", pkgname); calculate_tree_size(mediaPath, &extStats.dataSize); } ATRACE_END(); #endif } else { ATRACE_BEGIN("code"); for (auto codePath : codePaths) { Loading Loading @@ -1414,7 +1419,7 @@ binder::Status InstalldNativeService::getAppSize(const std::unique_ptr<std::stri if (!uuid) { ATRACE_BEGIN("dalvik"); int32_t sharedGid = multiuser_get_shared_gid(userId, appId); int32_t sharedGid = multiuser_get_shared_gid(0, appId); if (sharedGid != -1) { calculate_tree_size(create_data_dalvik_cache_path(), &stats.codeSize, sharedGid, -1); Loading Loading @@ -1464,12 +1469,6 @@ binder::Status InstalldNativeService::getUserSize(const std::unique_ptr<std::str flags &= ~FLAG_USE_QUOTA; } #if HACK_FOR_37193650 if (userId != 0) { flags &= ~FLAG_USE_QUOTA; } #endif if (flags & FLAG_USE_QUOTA) { struct dqblk dq; Loading Loading @@ -1532,6 +1531,7 @@ binder::Status InstalldNativeService::getUserSize(const std::unique_ptr<std::str } ATRACE_BEGIN("quota"); int64_t dataSize = extStats.dataSize; for (auto appId : appIds) { if (appId >= AID_APP_START) { collectQuotaStats(device, userId, appId, &stats, &extStats); Loading @@ -1542,6 +1542,7 @@ binder::Status InstalldNativeService::getUserSize(const std::unique_ptr<std::str #endif } } extStats.dataSize = dataSize; ATRACE_END(); } else { ATRACE_BEGIN("obb"); Loading Loading @@ -1601,7 +1602,8 @@ binder::Status InstalldNativeService::getUserSize(const std::unique_ptr<std::str } binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std::string>& uuid, int32_t userId, int32_t flags, std::vector<int64_t>* _aidl_return) { int32_t userId, int32_t flags, const std::vector<int32_t>& appIds, std::vector<int64_t>* _aidl_return) { ENFORCE_UID(AID_SYSTEM); CHECK_ARGUMENT_UUID(uuid); // NOTE: Locking is relaxed on this method, since it's limited to Loading @@ -1620,6 +1622,7 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: int64_t audioSize = 0; int64_t videoSize = 0; int64_t imageSize = 0; int64_t appSize = 0; auto device = findQuotaDeviceForUuid(uuid); if (device.empty()) { Loading @@ -1629,6 +1632,7 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: if (flags & FLAG_USE_QUOTA) { struct dqblk dq; ATRACE_BEGIN("quota"); uid_t uid = multiuser_get_uid(userId, AID_MEDIA_RW); if (quotactl(QCMD(Q_GETQUOTA, USRQUOTA), device.c_str(), uid, reinterpret_cast<char*>(&dq)) != 0) { Loading Loading @@ -1666,7 +1670,20 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: #endif imageSize = dq.dqb_curspace; } ATRACE_END(); ATRACE_BEGIN("apps"); struct stats extStats; memset(&extStats, 0, sizeof(extStats)); for (auto appId : appIds) { if (appId >= AID_APP_START) { collectQuotaStats(device, userId, appId, nullptr, &extStats); } } appSize = extStats.dataSize + extStats.cacheSize; ATRACE_END(); } else { ATRACE_BEGIN("manual"); FTS *fts; FTSENT *p; auto path = create_data_media_path(uuid_, userId); Loading Loading @@ -1700,11 +1717,15 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: case FTS_DEFAULT: case FTS_SL: case FTS_SLNONE: if (p->fts_parent->fts_number == 1) { appSize += size; } totalSize += size; break; } } fts_close(fts); ATRACE_END(); } std::vector<int64_t> ret; Loading @@ -1712,6 +1733,7 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: ret.push_back(audioSize); ret.push_back(videoSize); ret.push_back(imageSize); ret.push_back(appSize); #if MEASURE_DEBUG LOG(DEBUG) << "Final result " << toString(ret); #endif Loading cmds/installd/InstalldNativeService.h +2 −1 Original line number Diff line number Diff line Loading @@ -68,7 +68,8 @@ public: int32_t userId, int32_t flags, const std::vector<int32_t>& appIds, std::vector<int64_t>* _aidl_return); binder::Status getExternalSize(const std::unique_ptr<std::string>& uuid, int32_t userId, int32_t flags, std::vector<int64_t>* _aidl_return); int32_t userId, int32_t flags, const std::vector<int32_t>& appIds, std::vector<int64_t>* _aidl_return); binder::Status setAppQuota(const std::unique_ptr<std::string>& uuid, int32_t userId, int32_t appId, int64_t cacheQuota); Loading cmds/installd/binder/android/os/IInstalld.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ interface IInstalld { int userId, int flags, int appId, in long[] ceDataInodes, in @utf8InCpp String[] codePaths); long[] getUserSize(@nullable @utf8InCpp String uuid, int userId, int flags, in int[] appIds); long[] getExternalSize(@nullable @utf8InCpp String uuid, int userId, int flags); long[] getExternalSize(@nullable @utf8InCpp String uuid, int userId, int flags, in int[] appIds); void setAppQuota(@nullable @utf8InCpp String uuid, int userId, int appId, long cacheQuota); Loading cmds/installd/utils.h +0 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ #define MEASURE_DEBUG 0 #define FIXUP_DEBUG 0 #define HACK_FOR_37193650 1 namespace android { namespace installd { Loading Loading
cmds/installd/InstalldNativeService.cpp +90 −68 Original line number Diff line number Diff line Loading @@ -1122,6 +1122,7 @@ static void collectQuotaStats(const std::string& device, int32_t userId, struct dqblk dq; if (stats != nullptr) { uid_t uid = multiuser_get_uid(userId, appId); if (quotactl(QCMD(Q_GETQUOTA, USRQUOTA), device.c_str(), uid, reinterpret_cast<char*>(&dq)) != 0) { Loading Loading @@ -1150,9 +1151,23 @@ static void collectQuotaStats(const std::string& device, int32_t userId, } } #if HACK_FOR_37193650 extStats->dataSize = extStats->dataSize; #else int sharedGid = multiuser_get_shared_gid(0, appId); if (sharedGid != -1) { if (quotactl(QCMD(Q_GETQUOTA, GRPQUOTA), device.c_str(), sharedGid, reinterpret_cast<char*>(&dq)) != 0) { if (errno != ESRCH) { PLOG(ERROR) << "Failed to quotactl " << device << " for GID " << sharedGid; } } else { #if MEASURE_DEBUG LOG(DEBUG) << "quotactl() for GID " << sharedGid << " " << dq.dqb_curspace; #endif stats->codeSize += dq.dqb_curspace; } } } if (extStats != nullptr) { int extGid = multiuser_get_ext_gid(userId, appId); if (extGid != -1) { if (quotactl(QCMD(Q_GETQUOTA, GRPQUOTA), device.c_str(), extGid, Loading @@ -1167,20 +1182,21 @@ static void collectQuotaStats(const std::string& device, int32_t userId, extStats->dataSize += dq.dqb_curspace; } } #endif int sharedGid = multiuser_get_shared_gid(userId, appId); if (sharedGid != -1) { if (quotactl(QCMD(Q_GETQUOTA, GRPQUOTA), device.c_str(), sharedGid, int extCacheGid = multiuser_get_ext_cache_gid(userId, appId); if (extCacheGid != -1) { if (quotactl(QCMD(Q_GETQUOTA, GRPQUOTA), device.c_str(), extCacheGid, reinterpret_cast<char*>(&dq)) != 0) { if (errno != ESRCH) { PLOG(ERROR) << "Failed to quotactl " << device << " for GID " << sharedGid; PLOG(ERROR) << "Failed to quotactl " << device << " for GID " << extCacheGid; } } else { #if MEASURE_DEBUG LOG(DEBUG) << "quotactl() for GID " << sharedGid << " " << dq.dqb_curspace; LOG(DEBUG) << "quotactl() for GID " << extCacheGid << " " << dq.dqb_curspace; #endif stats->codeSize += dq.dqb_curspace; extStats->dataSize += dq.dqb_curspace; extStats->cacheSize += dq.dqb_curspace; } } } } Loading Loading @@ -1256,9 +1272,10 @@ static void collectManualStatsForUser(const std::string& path, struct stats* sta if (fstatat(dfd, name, &s, AT_SYMLINK_NOFOLLOW) != 0) { continue; } int32_t user_uid = multiuser_get_app_id(s.st_uid); if (!strcmp(name, ".") || !strcmp(name, "..")) { continue; } else if (exclude_apps && (s.st_uid >= AID_APP_START && s.st_uid <= AID_APP_END)) { } else if (exclude_apps && (user_uid >= AID_APP_START && user_uid <= AID_APP_END)) { continue; } else { collectManualStats(StringPrintf("%s/%s", path.c_str(), name), stats); Loading Loading @@ -1357,25 +1374,13 @@ binder::Status InstalldNativeService::getAppSize(const std::unique_ptr<std::stri ATRACE_BEGIN("code"); for (auto codePath : codePaths) { calculate_tree_size(codePath, &stats.codeSize, -1, multiuser_get_shared_gid(userId, appId)); multiuser_get_shared_gid(0, appId)); } ATRACE_END(); ATRACE_BEGIN("quota"); collectQuotaStats(device, userId, appId, &stats, &extStats); ATRACE_END(); #if HACK_FOR_37193650 ATRACE_BEGIN("external"); for (size_t i = 0; i < packageNames.size(); i++) { const char* pkgname = packageNames[i].c_str(); auto extPath = create_data_media_package_path(uuid_, userId, "data", pkgname); calculate_tree_size(extPath, &extStats.dataSize); auto mediaPath = create_data_media_package_path(uuid_, userId, "media", pkgname); calculate_tree_size(mediaPath, &extStats.dataSize); } ATRACE_END(); #endif } else { ATRACE_BEGIN("code"); for (auto codePath : codePaths) { Loading Loading @@ -1414,7 +1419,7 @@ binder::Status InstalldNativeService::getAppSize(const std::unique_ptr<std::stri if (!uuid) { ATRACE_BEGIN("dalvik"); int32_t sharedGid = multiuser_get_shared_gid(userId, appId); int32_t sharedGid = multiuser_get_shared_gid(0, appId); if (sharedGid != -1) { calculate_tree_size(create_data_dalvik_cache_path(), &stats.codeSize, sharedGid, -1); Loading Loading @@ -1464,12 +1469,6 @@ binder::Status InstalldNativeService::getUserSize(const std::unique_ptr<std::str flags &= ~FLAG_USE_QUOTA; } #if HACK_FOR_37193650 if (userId != 0) { flags &= ~FLAG_USE_QUOTA; } #endif if (flags & FLAG_USE_QUOTA) { struct dqblk dq; Loading Loading @@ -1532,6 +1531,7 @@ binder::Status InstalldNativeService::getUserSize(const std::unique_ptr<std::str } ATRACE_BEGIN("quota"); int64_t dataSize = extStats.dataSize; for (auto appId : appIds) { if (appId >= AID_APP_START) { collectQuotaStats(device, userId, appId, &stats, &extStats); Loading @@ -1542,6 +1542,7 @@ binder::Status InstalldNativeService::getUserSize(const std::unique_ptr<std::str #endif } } extStats.dataSize = dataSize; ATRACE_END(); } else { ATRACE_BEGIN("obb"); Loading Loading @@ -1601,7 +1602,8 @@ binder::Status InstalldNativeService::getUserSize(const std::unique_ptr<std::str } binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std::string>& uuid, int32_t userId, int32_t flags, std::vector<int64_t>* _aidl_return) { int32_t userId, int32_t flags, const std::vector<int32_t>& appIds, std::vector<int64_t>* _aidl_return) { ENFORCE_UID(AID_SYSTEM); CHECK_ARGUMENT_UUID(uuid); // NOTE: Locking is relaxed on this method, since it's limited to Loading @@ -1620,6 +1622,7 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: int64_t audioSize = 0; int64_t videoSize = 0; int64_t imageSize = 0; int64_t appSize = 0; auto device = findQuotaDeviceForUuid(uuid); if (device.empty()) { Loading @@ -1629,6 +1632,7 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: if (flags & FLAG_USE_QUOTA) { struct dqblk dq; ATRACE_BEGIN("quota"); uid_t uid = multiuser_get_uid(userId, AID_MEDIA_RW); if (quotactl(QCMD(Q_GETQUOTA, USRQUOTA), device.c_str(), uid, reinterpret_cast<char*>(&dq)) != 0) { Loading Loading @@ -1666,7 +1670,20 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: #endif imageSize = dq.dqb_curspace; } ATRACE_END(); ATRACE_BEGIN("apps"); struct stats extStats; memset(&extStats, 0, sizeof(extStats)); for (auto appId : appIds) { if (appId >= AID_APP_START) { collectQuotaStats(device, userId, appId, nullptr, &extStats); } } appSize = extStats.dataSize + extStats.cacheSize; ATRACE_END(); } else { ATRACE_BEGIN("manual"); FTS *fts; FTSENT *p; auto path = create_data_media_path(uuid_, userId); Loading Loading @@ -1700,11 +1717,15 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: case FTS_DEFAULT: case FTS_SL: case FTS_SLNONE: if (p->fts_parent->fts_number == 1) { appSize += size; } totalSize += size; break; } } fts_close(fts); ATRACE_END(); } std::vector<int64_t> ret; Loading @@ -1712,6 +1733,7 @@ binder::Status InstalldNativeService::getExternalSize(const std::unique_ptr<std: ret.push_back(audioSize); ret.push_back(videoSize); ret.push_back(imageSize); ret.push_back(appSize); #if MEASURE_DEBUG LOG(DEBUG) << "Final result " << toString(ret); #endif Loading
cmds/installd/InstalldNativeService.h +2 −1 Original line number Diff line number Diff line Loading @@ -68,7 +68,8 @@ public: int32_t userId, int32_t flags, const std::vector<int32_t>& appIds, std::vector<int64_t>* _aidl_return); binder::Status getExternalSize(const std::unique_ptr<std::string>& uuid, int32_t userId, int32_t flags, std::vector<int64_t>* _aidl_return); int32_t userId, int32_t flags, const std::vector<int32_t>& appIds, std::vector<int64_t>* _aidl_return); binder::Status setAppQuota(const std::unique_ptr<std::string>& uuid, int32_t userId, int32_t appId, int64_t cacheQuota); Loading
cmds/installd/binder/android/os/IInstalld.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -38,7 +38,7 @@ interface IInstalld { int userId, int flags, int appId, in long[] ceDataInodes, in @utf8InCpp String[] codePaths); long[] getUserSize(@nullable @utf8InCpp String uuid, int userId, int flags, in int[] appIds); long[] getExternalSize(@nullable @utf8InCpp String uuid, int userId, int flags); long[] getExternalSize(@nullable @utf8InCpp String uuid, int userId, int flags, in int[] appIds); void setAppQuota(@nullable @utf8InCpp String uuid, int userId, int appId, long cacheQuota); Loading
cmds/installd/utils.h +0 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,6 @@ #define MEASURE_DEBUG 0 #define FIXUP_DEBUG 0 #define HACK_FOR_37193650 1 namespace android { namespace installd { Loading