diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 13e7ac1fd4a09..555d92949a3cc 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -9327,6 +9327,8 @@ message PackageInstallerV2Reported { // Return_code 1 indicates success. // For full list, see frameworks/base/core/java/android/content/pm/PackageManager.java optional int32 return_code = 4; + // Total size of the APKs installed for this package + optional int64 apks_size_bytes = 5; } /** diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 77afc960f897a..3f8a442b296dd 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -1812,7 +1812,33 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { isIncrementalInstallation(), packageNameToLog, currentTimestamp - createdMillis, - returnCode); + returnCode, + getApksSize()); + } + + private long getApksSize() { + final PackageSetting ps = mPm.getPackageSetting(mPackageName); + if (ps == null) { + return 0; + } + final File apkDirOrPath = ps.codePath; + if (apkDirOrPath == null) { + return 0; + } + if (apkDirOrPath.isFile() && apkDirOrPath.getName().toLowerCase().endsWith(".apk")) { + return apkDirOrPath.length(); + } + if (!apkDirOrPath.isDirectory()) { + return 0; + } + final File[] files = apkDirOrPath.listFiles(); + long apksSize = 0; + for (int i = 0; i < files.length; i++) { + if (files[i].getName().toLowerCase().endsWith(".apk")) { + apksSize += files[i].length(); + } + } + return apksSize; } /**