Report Odrefresh BCP compilation type to StatsD

Bug: 279004055
Test: atest art_standalone_odrefresh_tests
Change-Id: If563943ddbce706dc81fda7a11c78ac4c067fa9a
diff --git a/odrefresh/odr_metrics.h b/odrefresh/odr_metrics.h
index 94414f8..4605277 100644
--- a/odrefresh/odr_metrics.h
+++ b/odrefresh/odr_metrics.h
@@ -34,7 +34,8 @@
  public:
   // Enumeration used to track the latest stage reached running odrefresh.
   //
-  // These values mirror those in OdrefreshReported::Stage in frameworks/proto_logging/atoms.proto.
+  // These values mirror those in OdrefreshReported::Stage in
+  // frameworks/proto_logging/atoms/art/odrefresh_extension_atoms.proto.
   // NB There are gaps between the values in case an additional stages are introduced.
   enum class Stage : uint8_t {
     kUnknown = 0,
@@ -48,7 +49,8 @@
 
   // Enumeration describing the overall status, processing stops on the first error discovered.
   //
-  // These values mirror those in OdrefreshReported::Status in frameworks/proto_logging/atoms.proto.
+  // These values mirror those in OdrefreshReported::Status in
+  // frameworks/proto_logging/atoms/art/odrefresh_extension_atoms.proto.
   enum class Status : uint8_t {
     kUnknown = 0,
     kOK = 1,
@@ -66,7 +68,7 @@
   // Enumeration describing the cause of compilation (if any) in odrefresh.
   //
   // These values mirror those in OdrefreshReported::Trigger in
-  // frameworks/proto_logging/atoms.proto.
+  // frameworks/proto_logging/atoms/art/odrefresh_extension_atoms.proto.
   enum class Trigger : uint8_t {
     kUnknown = 0,
     kApexVersionMismatch = 1,
@@ -74,6 +76,10 @@
     kMissingArtifacts = 3,
   };
 
+  // Enumeration describing the type of boot classpath compilation in odrefresh.
+  //
+  // These values mirror those in OdrefreshReported::BcpCompilationType in
+  // frameworks/proto_logging/atoms/art/odrefresh_extension_atoms.proto.
   enum class BcpCompilationType : uint8_t {
     kUnknown = 0,
     // Compiles for both the primary boot image and the mainline extension.
diff --git a/odrefresh/odr_metrics_record.h b/odrefresh/odr_metrics_record.h
index 41dea3e..4b18edb 100644
--- a/odrefresh/odr_metrics_record.h
+++ b/odrefresh/odr_metrics_record.h
@@ -31,7 +31,7 @@
 constexpr const char* kOdrefreshMetricsFile = "/data/misc/odrefresh/odrefresh-metrics.xml";
 
 // Initial OdrefreshMetrics version
-static constexpr int32_t kOdrefreshMetricsVersion = 3;
+static constexpr int32_t kOdrefreshMetricsVersion = 4;
 
 // Constant value used in ExecResult when the process was not run at all.
 // Mirrors EXEC_RESULT_STATUS_NOT_RUN contained in frameworks/proto_logging/atoms.proto.
diff --git a/odrefresh/odr_statslog_android.cc b/odrefresh/odr_statslog_android.cc
index 5e25929..fe2d121 100644
--- a/odrefresh/odr_statslog_android.cc
+++ b/odrefresh/odr_statslog_android.cc
@@ -35,71 +35,6 @@
 
 namespace {
 
-// Convert bare value from art::metrics::Stage to value defined in atoms.proto.
-int32_t TranslateStage(int32_t art_metrics_stage) {
-  switch (static_cast<OdrMetrics::Stage>(art_metrics_stage)) {
-    case OdrMetrics::Stage::kUnknown:
-      return metrics::statsd::ODREFRESH_REPORTED__STAGE_REACHED__STAGE_UNKNOWN;
-    case OdrMetrics::Stage::kCheck:
-      return metrics::statsd::ODREFRESH_REPORTED__STAGE_REACHED__STAGE_CHECK;
-    case OdrMetrics::Stage::kPreparation:
-      return metrics::statsd::ODREFRESH_REPORTED__STAGE_REACHED__STAGE_PREPARATION;
-    case OdrMetrics::Stage::kPrimaryBootClasspath:
-      return metrics::statsd::ODREFRESH_REPORTED__STAGE_REACHED__STAGE_PRIMARY_BOOT_CLASSPATH;
-    case OdrMetrics::Stage::kSecondaryBootClasspath:
-      return metrics::statsd::ODREFRESH_REPORTED__STAGE_REACHED__STAGE_SECONDARY_BOOT_CLASSPATH;
-    case OdrMetrics::Stage::kSystemServerClasspath:
-      return metrics::statsd::ODREFRESH_REPORTED__STAGE_REACHED__STAGE_SYSTEM_SERVER_CLASSPATH;
-    case OdrMetrics::Stage::kComplete:
-      return metrics::statsd::ODREFRESH_REPORTED__STAGE_REACHED__STAGE_COMPLETE;
-  }
-
-  LOG(ERROR) << "Unknown stage value: " << art_metrics_stage;
-  return -1;
-}
-
-// Convert bare value from art::metrics::Status to value defined in atoms.proto.
-int32_t TranslateStatus(int32_t art_metrics_status) {
-  switch (static_cast<OdrMetrics::Status>(art_metrics_status)) {
-    case OdrMetrics::Status::kUnknown:
-      return metrics::statsd::ODREFRESH_REPORTED__STATUS__STATUS_UNKNOWN;
-    case OdrMetrics::Status::kOK:
-      return metrics::statsd::ODREFRESH_REPORTED__STATUS__STATUS_OK;
-    case OdrMetrics::Status::kNoSpace:
-      return metrics::statsd::ODREFRESH_REPORTED__STATUS__STATUS_NO_SPACE;
-    case OdrMetrics::Status::kIoError:
-      return metrics::statsd::ODREFRESH_REPORTED__STATUS__STATUS_IO_ERROR;
-    case OdrMetrics::Status::kDex2OatError:
-      return metrics::statsd::ODREFRESH_REPORTED__STATUS__STATUS_DEX2OAT_ERROR;
-    case OdrMetrics::Status::kStagingFailed:
-      return metrics::statsd::ODREFRESH_REPORTED__STATUS__STATUS_STAGING_FAILED;
-    case OdrMetrics::Status::kInstallFailed:
-      return metrics::statsd::ODREFRESH_REPORTED__STATUS__STATUS_INSTALL_FAILED;
-    case OdrMetrics::Status::kDalvikCachePermissionDenied:
-      return metrics::statsd::ODREFRESH_REPORTED__STATUS__STATUS_DALVIK_CACHE_PERMISSION_DENIED;
-  }
-
-  LOG(ERROR) << "Unknown status value: " << art_metrics_status;
-  return -1;
-}
-
-// Convert bare value from art::metrics::Trigger to value defined in atoms.proto.
-int32_t TranslateTrigger(int32_t art_metrics_trigger) {
-  switch (static_cast<OdrMetrics::Trigger>(art_metrics_trigger)) {
-    case OdrMetrics::Trigger::kUnknown:
-      return metrics::statsd::ODREFRESH_REPORTED__TRIGGER__TRIGGER_UNKNOWN;
-    case OdrMetrics::Trigger::kApexVersionMismatch:
-      return metrics::statsd::ODREFRESH_REPORTED__TRIGGER__TRIGGER_APEX_VERSION_MISMATCH;
-    case OdrMetrics::Trigger::kDexFilesChanged:
-      return metrics::statsd::ODREFRESH_REPORTED__TRIGGER__TRIGGER_DEX_FILES_CHANGED;
-    case OdrMetrics::Trigger::kMissingArtifacts:
-      return metrics::statsd::ODREFRESH_REPORTED__TRIGGER__TRIGGER_MISSING_ARTIFACTS;
-  }
-
-  LOG(ERROR) << "Unknown trigger value: " << art_metrics_trigger;
-  return -1;
-}
-
 bool ReadValues(const char* metrics_file,
                 /*out*/ OdrMetricsRecord* record,
                 /*out*/ std::string* error_msg) {
@@ -111,30 +46,6 @@
     return false;
   }
 
-  //
-  // Convert values defined as enums to their statsd values.
-  //
-
-  record->trigger = TranslateTrigger(record->trigger);
-  if (record->trigger < 0) {
-    *error_msg = "failed to parse trigger.";
-    return false;
-  }
-
-  record->stage_reached = TranslateStage(record->stage_reached);
-  if (record->stage_reached < 0) {
-    *error_msg = "failed to parse stage_reached.";
-    return false;
-  }
-
-  record->status = TranslateStatus(record->status);
-  if (record->status < 0) {
-    *error_msg = "failed to parse status.";
-    return false;
-  }
-
-  // TODO(b/279004055): Translate BCP compilation types.
-
   return true;
 }
 
@@ -148,30 +59,31 @@
 
   // Write values to statsd. The order of values passed is the same as the order of the
   // fields in OdrMetricsRecord.
-  // TODO(b/279004055): Write BCP compilation types.
-  int bytes_written = art::metrics::statsd::stats_write(
-      metrics::statsd::ODREFRESH_REPORTED,
-      record.art_apex_version,
-      record.trigger,
-      record.stage_reached,
-      record.status,
-      record.primary_bcp_compilation_millis / 1000,
-      record.secondary_bcp_compilation_millis / 1000,
-      record.system_server_compilation_millis / 1000,
-      record.cache_space_free_start_mib,
-      record.cache_space_free_end_mib,
-      record.primary_bcp_compilation_millis,
-      record.secondary_bcp_compilation_millis,
-      record.system_server_compilation_millis,
-      record.primary_bcp_dex2oat_result.status,
-      record.primary_bcp_dex2oat_result.exit_code,
-      record.primary_bcp_dex2oat_result.signal,
-      record.secondary_bcp_dex2oat_result.status,
-      record.secondary_bcp_dex2oat_result.exit_code,
-      record.secondary_bcp_dex2oat_result.signal,
-      record.system_server_dex2oat_result.status,
-      record.system_server_dex2oat_result.exit_code,
-      record.system_server_dex2oat_result.signal);
+  int bytes_written =
+      art::metrics::statsd::stats_write(metrics::statsd::ODREFRESH_REPORTED,
+                                        record.art_apex_version,
+                                        record.trigger,
+                                        record.stage_reached,
+                                        record.status,
+                                        record.primary_bcp_compilation_millis / 1000,
+                                        record.secondary_bcp_compilation_millis / 1000,
+                                        record.system_server_compilation_millis / 1000,
+                                        record.cache_space_free_start_mib,
+                                        record.cache_space_free_end_mib,
+                                        record.primary_bcp_compilation_millis,
+                                        record.secondary_bcp_compilation_millis,
+                                        record.system_server_compilation_millis,
+                                        record.primary_bcp_dex2oat_result.status,
+                                        record.primary_bcp_dex2oat_result.exit_code,
+                                        record.primary_bcp_dex2oat_result.signal,
+                                        record.secondary_bcp_dex2oat_result.status,
+                                        record.secondary_bcp_dex2oat_result.exit_code,
+                                        record.secondary_bcp_dex2oat_result.signal,
+                                        record.system_server_dex2oat_result.status,
+                                        record.system_server_dex2oat_result.exit_code,
+                                        record.system_server_dex2oat_result.signal,
+                                        record.primary_bcp_compilation_type,
+                                        record.secondary_bcp_compilation_type);
   if (bytes_written <= 0) {
     *error_msg = android::base::StringPrintf("stats_write returned %d", bytes_written);
     return false;
diff --git a/runtime/exec_utils.h b/runtime/exec_utils.h
index 11ab579..b83722f 100644
--- a/runtime/exec_utils.h
+++ b/runtime/exec_utils.h
@@ -44,8 +44,8 @@
 };
 
 struct ExecResult {
-  // This struct needs to be in sync with the ExecResultStatus enum contained within
-  // the OdrefreshReported atom in frameworks/proto_logging/atoms.proto.
+  // This struct needs to be in sync with the ExecResultStatus enum contained within the
+  // OdrefreshReported atom in frameworks/proto_logging/atoms/art/odrefresh_extension_atoms.proto.
   enum Status {
     // Unable to get the status.
     kUnknown = 0,