diff options
| author | 2019-01-25 16:18:53 +0000 | |
|---|---|---|
| committer | 2019-01-30 10:24:00 +0000 | |
| commit | a2d2bc2ed74e35c46b7c6aa5172c652f63679fa3 (patch) | |
| tree | 4964fce11a9c49086b46aaf08be75f3262462b3d /runtime/hidden_api.cc | |
| parent | 4ee4561f2153f3b0bc3be2e781488a97c73ca58e (diff) | |
Replace libmetricslogger logging with up-call to Java for hidden api
Use VMRuntime.hiddenApiUsedWith{JNI,Reflection} instead of depending on
libmetricslogger
Topic: hidden-api-reporting-upcall
Test: m
Bug: 119217680
Change-Id: Ifaf0b0e4ae271f6fcd37e8d7cf917a3b81d8ddae
Merged-In: I3292f1d20cc8635391cddc3ba60d4a80b578fa82
Diffstat (limited to 'runtime/hidden_api.cc')
| -rw-r--r-- | runtime/hidden_api.cc | 60 |
1 files changed, 21 insertions, 39 deletions
diff --git a/runtime/hidden_api.cc b/runtime/hidden_api.cc index af5e67a461..1279997ba2 100644 --- a/runtime/hidden_api.cc +++ b/runtime/hidden_api.cc @@ -29,15 +29,6 @@ #include "thread-inl.h" #include "well_known_classes.h" -#ifdef ART_TARGET_ANDROID -#include <metricslogger/metrics_logger.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; -#endif - namespace art { namespace hiddenapi { @@ -182,28 +173,6 @@ bool MemberSignature::MemberNameAndTypeMatch(const MemberSignature& other) { return member_name_ == other.member_name_ && type_signature_ == other.type_signature_; } -#ifdef ART_TARGET_ANDROID -// 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 AccessMethod::kNone: - return android::metricslogger::ACCESS_METHOD_NONE; - case AccessMethod::kReflection: - return android::metricslogger::ACCESS_METHOD_REFLECTION; - case AccessMethod::kJNI: - return android::metricslogger::ACCESS_METHOD_JNI; - case AccessMethod::kLinking: - return android::metricslogger::ACCESS_METHOD_LINKING; - default: - DCHECK(false); - } -} -#endif - void MemberSignature::LogAccessToEventLog(AccessMethod access_method, bool access_denied) { #ifdef ART_TARGET_ANDROID if (access_method == AccessMethod::kLinking || access_method == AccessMethod::kNone) { @@ -213,19 +182,32 @@ void MemberSignature::LogAccessToEventLog(AccessMethod access_method, bool acces // None does not correspond to actual access, so should also be ignored. return; } - ComplexEventLogger log_maker(ACTION_HIDDEN_API_ACCESSED); - log_maker.AddTaggedData(FIELD_HIDDEN_API_ACCESS_METHOD, GetEnumValueForLog(access_method)); - if (access_denied) { - log_maker.AddTaggedData(FIELD_HIDDEN_API_ACCESS_DENIED, 1); + Runtime* runtime = Runtime::Current(); + if (runtime->IsAotCompiler()) { + return; } + JNIEnvExt* env = Thread::Current()->GetJniEnv(); const std::string& package_name = Runtime::Current()->GetProcessPackageName(); - if (!package_name.empty()) { - log_maker.SetPackageName(package_name); + ScopedLocalRef<jstring> package_str(env, env->NewStringUTF(package_name.c_str())); + if (env->ExceptionCheck()) { + env->ExceptionClear(); + LOG(ERROR) << "Unable to allocate string for package name which called hidden api"; } std::ostringstream signature_str; Dump(signature_str); - log_maker.AddTaggedData(FIELD_HIDDEN_API_SIGNATURE, signature_str.str()); - log_maker.Record(); + ScopedLocalRef<jstring> signature_jstr(env, + env->NewStringUTF(signature_str.str().c_str())); + if (env->ExceptionCheck()) { + env->ExceptionClear(); + LOG(ERROR) << "Unable to allocate string for hidden api method signature"; + } + env->CallStaticVoidMethod(WellKnownClasses::dalvik_system_VMRuntime, + WellKnownClasses::dalvik_system_VMRuntime_hiddenApiUsed, package_str.get(), + signature_jstr.get(), static_cast<jint>(access_method), access_denied); + if (env->ExceptionCheck()) { + env->ExceptionClear(); + LOG(ERROR) << "Unable to report hidden api usage"; + } #else UNUSED(access_method); UNUSED(access_denied); |