diff options
3 files changed, 86 insertions, 28 deletions
diff --git a/services/core/java/com/android/server/pm/PackageDexOptimizer.java b/services/core/java/com/android/server/pm/PackageDexOptimizer.java index e0a39f313012..b02b8f298528 100644 --- a/services/core/java/com/android/server/pm/PackageDexOptimizer.java +++ b/services/core/java/com/android/server/pm/PackageDexOptimizer.java @@ -258,23 +258,22 @@ public class PackageDexOptimizer { packageStats, options.isDowngrade(), profileName, dexMetadataPath, options.getCompilationReason()); - // Only report metrics for base apk for now. - // TODO: add ISA and APK type to metrics. // OTAPreopt doesn't have stats so don't report in that case. - if (pkg.getBaseApkPath().equals(path) && packageStats != null) { + if (packageStats != null) { Trace.traceBegin(Trace.TRACE_TAG_PACKAGE_MANAGER, "dex2oat-metrics"); try { long sessionId = Math.randomLongInternal(); ArtStatsLogUtils.writeStatsLog( mArtStatsLogger, sessionId, - path, compilerFilter, sharedGid, packageStats.getCompileTime(path), dexMetadataPath, options.getCompilationReason(), - newResult); + newResult, + ArtStatsLogUtils.getApkType(path), + dexCodeIsa); } 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 c8dc1b1ff562..f99a3c330c32 100644 --- a/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java +++ b/services/core/java/com/android/server/pm/dex/ArtStatsLogUtils.java @@ -39,6 +39,7 @@ public class ArtStatsLogUtils { private static final String TAG = ArtStatsLogUtils.class.getSimpleName(); private static final String PROFILE_DEX_METADATA = "primary.prof"; private static final String VDEX_DEX_METADATA = "primary.vdex"; + private static final String BASE_APK= "base.apk"; private static final int ART_COMPILATION_REASON_INSTALL_BULK_SECONDARY = @@ -122,16 +123,34 @@ public class ArtStatsLogUtils { ART_COMPILATION_FILTER_FAKE_RUN_FROM_VDEX_FALLBACK); } + private static final Map<String, Integer> ISA_MAP = new HashMap(); + + static { + COMPILE_FILTER_MAP.put("arm", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_ARM); + COMPILE_FILTER_MAP.put("arm64", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_ARM64); + COMPILE_FILTER_MAP.put("x86", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_X86); + COMPILE_FILTER_MAP.put("x86_64", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_X86_64); + COMPILE_FILTER_MAP.put("mips", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_MIPS); + COMPILE_FILTER_MAP.put("mips64", ArtStatsLog. + ART_DATUM_REPORTED__ISA__ART_ISA_MIPS64); + } + public static void writeStatsLog( ArtStatsLogger logger, long sessionId, - String path, String compilerFilter, int uid, long compileTime, String dexMetadataPath, int compilationReason, - int result) { + int result, + int apkType, + String isa) { int dexMetadataType = getDexMetadataType(dexMetadataPath); logger.write( sessionId, @@ -140,7 +159,9 @@ public class ArtStatsLogUtils { compilerFilter, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_RESULT_CODE, result, - dexMetadataType); + dexMetadataType, + apkType, + isa); logger.write( sessionId, uid, @@ -148,7 +169,16 @@ public class ArtStatsLogUtils { compilerFilter, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_TOTAL_TIME, compileTime, - dexMetadataType); + dexMetadataType, + apkType, + isa); + } + + public static int getApkType(String path) { + if (path.equals(BASE_APK)) { + return ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE; + } + return ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_SPLIT; } private static int getDexMetadataType(String dexMetadataPath) { @@ -207,7 +237,9 @@ public class ArtStatsLogUtils { String compilerFilter, int kind, long value, - int dexMetadataType) { + int dexMetadataType, + int apkType, + String isa) { ArtStatsLog.write( ArtStatsLog.ART_DATUM_REPORTED, sessionId, @@ -220,7 +252,10 @@ public class ArtStatsLogUtils { ArtStatsLog.ART_DATUM_REPORTED__THREAD_TYPE__ART_THREAD_MAIN, kind, value, - dexMetadataType); + dexMetadataType, + apkType, + ISA_MAP.getOrDefault(isa, + ArtStatsLog.ART_DATUM_REPORTED__ISA__ART_ISA_UNKNOWN)); } } } 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 13d75a77507f..f014119319e9 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 @@ -22,6 +22,7 @@ import com.android.internal.art.ArtStatsLog; import com.android.server.pm.dex.ArtStatsLogUtils.ArtStatsLogger; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -49,6 +50,9 @@ public final class ArtStatsLogUtilsTest { private static final String COMPILER_FILTER = "space-profile"; private static final String PROFILE_DEX_METADATA = "primary.prof"; private static final String VDEX_DEX_METADATA = "primary.vdex"; + private static final String INSTRUCTION_SET = "arm64"; + private static final String BASE_APK = "base.apk"; + private static final String SPLIT_APK = "split.apk"; private static final byte[] DEX_CONTENT = "dexData".getBytes(); private static final int COMPILATION_REASON = 1; private static final int RESULT_CODE = 222; @@ -97,17 +101,18 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, dexMetadataPath.toString(), COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_PROFILE_AND_VDEX); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_PROFILE_AND_VDEX); } finally { deleteSliently(dexMetadataPath); deleteSliently(apk); @@ -127,17 +132,18 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, dexMetadataPath.toString(), COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_PROFILE); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_PROFILE); } finally { deleteSliently(dexMetadataPath); deleteSliently(apk); @@ -157,17 +163,18 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, dexMetadataPath.toString(), COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_VDEX); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_VDEX); } finally { deleteSliently(dexMetadataPath); deleteSliently(apk); @@ -185,17 +192,18 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, /*dexMetadataPath=*/ null, COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_NONE); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_NONE); } finally { deleteSliently(apk); } @@ -214,23 +222,35 @@ public final class ArtStatsLogUtilsTest { ArtStatsLogUtils.writeStatsLog( mockLogger, SESSION_ID, - apk.toString(), COMPILER_FILTER, UID, COMPILE_TIME, dexMetadataPath.toString(), COMPILATION_REASON, - RESULT_CODE); + RESULT_CODE, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); // Assert verifyWrites(ArtStatsLog. - ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_UNKNOWN); + ART_DATUM_REPORTED__DEX_METADATA_TYPE__ART_DEX_METADATA_TYPE_UNKNOWN); } finally { deleteSliently(dexMetadataPath); deleteSliently(apk); } } + @Test + public void testGetApkType() { + // Act + int result1 = ArtStatsLogUtils.getApkType(BASE_APK); + int result2 = ArtStatsLogUtils.getApkType(SPLIT_APK); + + // Assert + Assert.assertEquals(result1, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE); + Assert.assertEquals(result2, ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_SPLIT); + } + private void verifyWrites(int dexMetadataType) { InOrder inorder = inOrder(mockLogger); inorder.verify(mockLogger).write( @@ -239,7 +259,9 @@ public final class ArtStatsLogUtilsTest { COMPILER_FILTER, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_RESULT_CODE, RESULT_CODE, - dexMetadataType); + dexMetadataType, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); inorder.verify(mockLogger).write( SESSION_ID, UID, @@ -247,7 +269,9 @@ public final class ArtStatsLogUtilsTest { COMPILER_FILTER, ArtStatsLog.ART_DATUM_REPORTED__KIND__ART_DATUM_DEX2OAT_TOTAL_TIME, COMPILE_TIME, - dexMetadataType); + dexMetadataType, + ArtStatsLog.ART_DATUM_REPORTED__APK_TYPE__ART_APK_TYPE_BASE, + INSTRUCTION_SET); } private Path zipFiles(String suffix, Path... files) throws IOException { |