diff options
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);  |