diff options
| -rw-r--r-- | Android.bp | 1 | ||||
| -rw-r--r-- | runtime/Android.bp | 1 | ||||
| -rw-r--r-- | runtime/hidden_api.cc | 50 | ||||
| -rw-r--r-- | runtime/hidden_api.h | 10 |
4 files changed, 39 insertions, 23 deletions
diff --git a/Android.bp b/Android.bp index 59f7abf138..34a646915f 100644 --- a/Android.bp +++ b/Android.bp @@ -15,6 +15,7 @@ art_static_dependencies = [ "libbase", "liblz4", "liblzma", + "libmetricslogger_static", ] subdirs = [ diff --git a/runtime/Android.bp b/runtime/Android.bp index 28bee3d67e..1ef5bf080f 100644 --- a/runtime/Android.bp +++ b/runtime/Android.bp @@ -397,6 +397,7 @@ cc_defaults { "libbacktrace", "liblz4", "liblog", + "libmetricslogger", // For atrace, properties, ashmem, set_sched_policy and socket_peer_is_trusted. "libcutils", // For common macros. diff --git a/runtime/hidden_api.cc b/runtime/hidden_api.cc index e519682092..612a930fab 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 { @@ -69,10 +75,6 @@ static_assert( 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(); @@ -131,6 +133,25 @@ void MemberSignature::WarnAboutAccess(AccessMethod access_method, 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) { @@ -139,20 +160,15 @@ void MemberSignature::LogAccessToEventLog(AccessMethod access_method, Action act // 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; - } - if (type_ == kField) { - flags |= kMemberIsField; + log_maker.AddTaggedData(FIELD_HIDDEN_API_ACCESS_DENIED, 1); } - 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> diff --git a/runtime/hidden_api.h b/runtime/hidden_api.h index 4325496ca3..e117c08c25 100644 --- a/runtime/hidden_api.h +++ b/runtime/hidden_api.h @@ -52,13 +52,11 @@ enum Action { kDeny }; -// Do not change the values of items in this enum, as they are written to the -// event log for offline analysis. Any changes will interfere with that analysis. enum AccessMethod { - kNone = 0, // internal test that does not correspond to an actual access by app - kReflection = 1, - kJNI = 2, - kLinking = 3, + kNone, // internal test that does not correspond to an actual access by app + kReflection, + kJNI, + kLinking, }; // Do not change the values of items in this enum, as they are written to the |