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
Merged-In: I23548f902d2ff56ad00534421bf8afa902edaa75
Change-Id: I23548f902d2ff56ad00534421bf8afa902edaa75
(cherry picked from commit 2d4d62f2c4cb6f4a659333263a32f7d94c08fc11)
diff --git a/Android.bp b/Android.bp
index 59f7abf..34a6469 100644
--- a/Android.bp
+++ b/Android.bp
@@ -15,6 +15,7 @@
"libbase",
"liblz4",
"liblzma",
+ "libmetricslogger_static",
]
subdirs = [
diff --git a/runtime/Android.bp b/runtime/Android.bp
index 28bee3d..1ef5bf0 100644
--- a/runtime/Android.bp
+++ b/runtime/Android.bp
@@ -397,6 +397,7 @@
"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 e519682..612a930 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 @@
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 @@
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 @@
// 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>
diff --git a/runtime/hidden_api.h b/runtime/hidden_api.h
index 4325496..e117c08 100644
--- a/runtime/hidden_api.h
+++ b/runtime/hidden_api.h
@@ -52,13 +52,11 @@
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