diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index 37b9d5649d7da..69c8314c9ad49 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -273,7 +273,8 @@ public class PackageDexOptimizer { options.getCompilationReason(), newResult, ArtStatsLogUtils.getApkType(path), - dexCodeIsa); + dexCodeIsa, + path); } finally { Trace.traceEnd(Trace.TRACE_TAG_PACKAGE_MANAGER); } diff --git a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java index f99a3c330c32d..13798ba1b7232 100644 --- a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java +++ b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java @@ -32,6 +32,8 @@ import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.zip.ZipEntry; /** Utils class to report ART metrics to statsd. */ @@ -150,7 +152,8 @@ public class ArtStatsLogUtils { int compilationReason, int result, int apkType, - String isa) { + String isa, + String apkPath) { int dexMetadataType = getDexMetadataType(dexMetadataPath); logger.write( sessionId, @@ -162,6 +165,16 @@ public class ArtStatsLogUtils { dexMetadataType, apkType, isa); + logger.write( + sessionId, + uid, + compilationReason, + compilerFilter, + ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_DEX_CODE_BYTES, + getDexBytes(apkPath), + dexMetadataType, + apkType, + isa); logger.write( sessionId, uid, @@ -181,6 +194,37 @@ public class ArtStatsLogUtils { return ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_SPLIT; } + private static long getDexBytes(String apkPath) { + StrictJarFile jarFile = null; + long dexBytes = 0; + try { + jarFile = new StrictJarFile(apkPath, + /*verify=*/ false, + /*signatureSchemeRollbackProtectionsEnforced=*/ false); + Iterator it = jarFile.iterator(); + Pattern p = Pattern.compile("classes(\\d)*[.]dex"); + Matcher m = p.matcher(""); + while (it.hasNext()) { + ZipEntry entry = it.next(); + m.reset(entry.getName()); + if (m.matches()) { + dexBytes += entry.getSize(); + } + } + return dexBytes; + } catch (IOException ignore) { + Slog.e(TAG, "Error when parsing APK " + apkPath); + return -1L; + } finally { + try { + if (jarFile != null) { + jarFile.close(); + } + } catch (IOException ignore) { + } + } + } + private static int getDexMetadataType(String dexMetadataPath) { if (dexMetadataPath == null) { return ArtStatsLog.ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_NONE; diff --git a/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java b/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java index f014119319e94..7d6f4acfb7a0b 100644 --- a/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/dex/ArtStatsLogUtilsTest.java @@ -108,7 +108,8 @@ public final class ArtStatsLogUtilsTest { COMPILATION_REASON, RESULT_CODE, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, - INSTRUCTION_SET); + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. @@ -139,7 +140,8 @@ public final class ArtStatsLogUtilsTest { COMPILATION_REASON, RESULT_CODE, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, - INSTRUCTION_SET); + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. @@ -170,7 +172,8 @@ public final class ArtStatsLogUtilsTest { COMPILATION_REASON, RESULT_CODE, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, - INSTRUCTION_SET); + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. @@ -199,7 +202,8 @@ public final class ArtStatsLogUtilsTest { COMPILATION_REASON, RESULT_CODE, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, - INSTRUCTION_SET); + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. @@ -229,7 +233,8 @@ public final class ArtStatsLogUtilsTest { COMPILATION_REASON, RESULT_CODE, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, - INSTRUCTION_SET); + INSTRUCTION_SET, + apk.toString()); // Assert verifyWrites(ArtStatsLog. @@ -262,6 +267,16 @@ public final class ArtStatsLogUtilsTest { dexMetadataType, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, INSTRUCTION_SET); + inorder.verify(mockLogger).write( + SESSION_ID, + UID, + COMPILATION_REASON, + COMPILER_FILTER, + ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_DEX_CODE_BYTES, + DEX_CONTENT.length, + dexMetadataType, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); inorder.verify(mockLogger).write( SESSION_ID, UID,