Use tron for logging hidden API accesses.

Example output:
sysui_multi_action: [757,1391,1392,1,1394,Ldalvik/system/VMRuntime;->getRuntime()Ldalvik/system/VMRuntime;]
sysui_multi_action: [757,1391,1392,1,1393,1,1394,Ldalvik/system/VMRuntime;->setHiddenApiExemptions([Ljava/lang/String;)V]

Test: m
Test: $ adb shell settings put global \
Test:     hidden_api_access_log_sampling_rate 65536
Test: $ adb lolcat -b events | grep sysui_multi_action | grep 1390
Bug: 77517571
Change-Id: I23548f902d2ff56ad00534421bf8afa902edaa75
diff --git a/runtime/hidden_api.cc b/runtime/hidden_api.cc
index c2fd4ee..b732a00 100644
--- a/runtime/hidden_api.cc
+++ b/runtime/hidden_api.cc
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-#include <log/log_event_list.h>
+#include <metricslogger/metrics_logger.h>
 
 #include "hidden_api.h"
 
@@ -24,6 +24,12 @@
 #include "thread-current-inl.h"
 #include "well_known_classes.h"
 
+using android::metricslogger::ComplexEventLogger;
+using android::metricslogger::ACTION_HIDDEN_API_ACCESSED;
+using android::metricslogger::FIELD_HIDDEN_API_ACCESS_METHOD;
+using android::metricslogger::FIELD_HIDDEN_API_ACCESS_DENIED;
+using android::metricslogger::FIELD_HIDDEN_API_SIGNATURE;
+
 namespace art {
 namespace hiddenapi {
 
@@ -66,10 +72,6 @@
 
 namespace detail {
 
-// This is the ID of the event log event. It is duplicated from
-// system/core/logcat/event.logtags
-constexpr int EVENT_LOG_TAG_art_hidden_api_access = 20004;
-
 MemberSignature::MemberSignature(ArtField* field) {
   class_name_ = field->GetDeclaringClass()->GetDescriptor(&tmp_);
   member_name_ = field->GetName();
@@ -128,6 +130,25 @@
   LOG(WARNING) << "Accessing hidden " << (type_ == kField ? "field " : "method ")
                << Dumpable<MemberSignature>(*this) << " (" << list << ", " << access_method << ")";
 }
+// Convert an AccessMethod enum to a value for logging from the proto enum.
+// This method may look odd (the enum values are current the same), but it
+// prevents coupling the internal enum to the proto enum (which should never
+// be changed) so that we are free to change the internal one if necessary in
+// future.
+inline static int32_t GetEnumValueForLog(AccessMethod access_method) {
+  switch (access_method) {
+    case kNone:
+      return android::metricslogger::ACCESS_METHOD_NONE;
+    case kReflection:
+      return android::metricslogger::ACCESS_METHOD_REFLECTION;
+    case kJNI:
+      return android::metricslogger::ACCESS_METHOD_JNI;
+    case kLinking:
+      return android::metricslogger::ACCESS_METHOD_LINKING;
+    default:
+      DCHECK(false);
+  }
+}
 
 void MemberSignature::LogAccessToEventLog(AccessMethod access_method, Action action_taken) {
   if (access_method == kLinking) {
@@ -136,20 +157,15 @@
     // not to log these in the event log.
     return;
   }
-  uint32_t flags = 0;
+  ComplexEventLogger log_maker(ACTION_HIDDEN_API_ACCESSED);
+  log_maker.AddTaggedData(FIELD_HIDDEN_API_ACCESS_METHOD, GetEnumValueForLog(access_method));
   if (action_taken == kDeny) {
-    flags |= kAccessDenied;
+    log_maker.AddTaggedData(FIELD_HIDDEN_API_ACCESS_DENIED, 1);
   }
-  if (type_ == kField) {
-    flags |= kMemberIsField;
-  }
-  android_log_event_list ctx(EVENT_LOG_TAG_art_hidden_api_access);
-  ctx << access_method;
-  ctx << flags;
-  ctx << class_name_;
-  ctx << member_name_;
-  ctx << type_signature_;
-  ctx << LOG_ID_EVENTS;
+  std::ostringstream signature_str;
+  Dump(signature_str);
+  log_maker.AddTaggedData(FIELD_HIDDEN_API_SIGNATURE, signature_str.str());
+  log_maker.Record();
 }
 
 template<typename T>