diff options
9 files changed, 83 insertions, 43 deletions
diff --git a/services/inputflinger/dispatcher/trace/InputTracer.cpp b/services/inputflinger/dispatcher/trace/InputTracer.cpp index 4cf6a89db6..47e27beff7 100644 --- a/services/inputflinger/dispatcher/trace/InputTracer.cpp +++ b/services/inputflinger/dispatcher/trace/InputTracer.cpp @@ -59,9 +59,10 @@ TracedEvent createTracedEvent(const KeyEntry& e) { e.downTime, e.flags, e.repeatCount}; } -void writeEventToBackend(const TracedEvent& event, InputTracingBackendInterface& backend) { - std::visit(Visitor{[&](const TracedMotionEvent& e) { backend.traceMotionEvent(e); }, - [&](const TracedKeyEvent& e) { backend.traceKeyEvent(e); }}, +void writeEventToBackend(const TracedEvent& event, const TracedEventArgs args, + InputTracingBackendInterface& backend) { + std::visit(Visitor{[&](const TracedMotionEvent& e) { backend.traceMotionEvent(e, args); }, + [&](const TracedKeyEvent& e) { backend.traceKeyEvent(e, args); }}, event); } @@ -110,7 +111,11 @@ void InputTracer::dispatchToTargetHint(const EventTrackerInterface& cookie, // TODO(b/210460522): Disallow adding new targets from a derived cookie. return; } - // TODO(b/210460522): Determine if the event is sensitive based on the target. + if (target.windowHandle != nullptr) { + eventState->isSecure |= target.windowHandle->getInfo()->layoutParamsFlags.test( + gui::WindowInfo::Flag::SECURE); + // TODO(b/210460522): Set events as sensitive when the IME connection is active. + } } void InputTracer::eventProcessingComplete(const EventTrackerInterface& cookie) { @@ -145,7 +150,8 @@ std::unique_ptr<EventTrackerInterface> InputTracer::traceDerivedEvent( // It is possible for a derived event to be dispatched some time after the original event // is dispatched, such as in the case of key fallback events. To account for these cases, // derived events can be traced after the processing is complete for the original event. - writeEventToBackend(eventState->events.back(), *mBackend); + const TracedEventArgs traceArgs{.isSecure = eventState->isSecure}; + writeEventToBackend(eventState->events.back(), traceArgs, *mBackend); } return std::make_unique<EventTrackerImpl>(std::move(eventState), /*isDerived=*/true); } @@ -184,6 +190,7 @@ void InputTracer::traceEventDispatch(const DispatchEntry& dispatchEntry, const int32_t windowId = dispatchEntry.windowId.value_or(0); const int32_t vsyncId = dispatchEntry.windowId.has_value() ? dispatchEntry.vsyncId : 0; + // TODO(b/210460522): Pass HMAC into traceEventDispatch. const WindowDispatchArgs windowDispatchArgs{std::move(traced), dispatchEntry.deliveryTime, dispatchEntry.resolvedFlags, @@ -195,7 +202,8 @@ void InputTracer::traceEventDispatch(const DispatchEntry& dispatchEntry, /*hmac=*/{}, resolvedKeyRepeatCount}; if (eventState->isEventProcessingComplete) { - mBackend->traceWindowDispatch(std::move(windowDispatchArgs)); + mBackend->traceWindowDispatch(std::move(windowDispatchArgs), + TracedEventArgs{.isSecure = eventState->isSecure}); } else { eventState->pendingDispatchArgs.emplace_back(std::move(windowDispatchArgs)); } @@ -214,12 +222,13 @@ bool InputTracer::isDerivedCookie(const EventTrackerInterface& cookie) { void InputTracer::EventState::onEventProcessingComplete() { // Write all of the events known so far to the trace. + const TracedEventArgs traceArgs{.isSecure = isSecure}; for (const auto& event : events) { - writeEventToBackend(event, *tracer.mBackend); + writeEventToBackend(event, traceArgs, *tracer.mBackend); } // Write all pending dispatch args to the trace. for (const auto& windowDispatchArgs : pendingDispatchArgs) { - tracer.mBackend->traceWindowDispatch(windowDispatchArgs); + tracer.mBackend->traceWindowDispatch(windowDispatchArgs, traceArgs); } pendingDispatchArgs.clear(); diff --git a/services/inputflinger/dispatcher/trace/InputTracer.h b/services/inputflinger/dispatcher/trace/InputTracer.h index 8da9632d7c..458f4aadc9 100644 --- a/services/inputflinger/dispatcher/trace/InputTracer.h +++ b/services/inputflinger/dispatcher/trace/InputTracer.h @@ -66,8 +66,8 @@ private: bool isEventProcessingComplete{false}; // A queue to hold dispatch args from being traced until event processing is complete. std::vector<const WindowDispatchArgs> pendingDispatchArgs; - // TODO(b/210460522): Add additional args for tracking event sensitivity and - // dispatch target UIDs. + // True if the event is targeting at least one secure window; + bool isSecure{false}; }; // Get the event state associated with a tracking cookie. diff --git a/services/inputflinger/dispatcher/trace/InputTracingBackendInterface.h b/services/inputflinger/dispatcher/trace/InputTracingBackendInterface.h index 94a86b94a2..865e8277c0 100644 --- a/services/inputflinger/dispatcher/trace/InputTracingBackendInterface.h +++ b/services/inputflinger/dispatcher/trace/InputTracingBackendInterface.h @@ -74,6 +74,12 @@ struct TracedMotionEvent { /** A representation of a traced input event. */ using TracedEvent = std::variant<TracedKeyEvent, TracedMotionEvent>; +/** Additional information about an input event being traced. */ +struct TracedEventArgs { + // True if the event is targeting at least one secure window. + bool isSecure; +}; + /** * An interface for the tracing backend, used for setting a custom backend for testing. */ @@ -82,10 +88,10 @@ public: virtual ~InputTracingBackendInterface() = default; /** Trace a KeyEvent. */ - virtual void traceKeyEvent(const TracedKeyEvent&) = 0; + virtual void traceKeyEvent(const TracedKeyEvent&, const TracedEventArgs&) = 0; /** Trace a MotionEvent. */ - virtual void traceMotionEvent(const TracedMotionEvent&) = 0; + virtual void traceMotionEvent(const TracedMotionEvent&, const TracedEventArgs&) = 0; /** Trace an event being sent to a window. */ struct WindowDispatchArgs { @@ -100,7 +106,7 @@ public: std::array<uint8_t, 32> hmac; int32_t resolvedKeyRepeatCount; }; - virtual void traceWindowDispatch(const WindowDispatchArgs&) = 0; + virtual void traceWindowDispatch(const WindowDispatchArgs&, const TracedEventArgs&) = 0; }; } // namespace android::inputdispatcher::trace diff --git a/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp b/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp index 46ad9e16d9..8ef9ca504d 100644 --- a/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp +++ b/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp @@ -63,7 +63,12 @@ PerfettoBackend::PerfettoBackend() { }); } -void PerfettoBackend::traceMotionEvent(const TracedMotionEvent& event) { +void PerfettoBackend::traceMotionEvent(const TracedMotionEvent& event, + const TracedEventArgs& args) { + if (args.isSecure) { + // For now, avoid tracing secure event entirely. + return; + } InputEventDataSource::Trace([&](InputEventDataSource::TraceContext ctx) { auto tracePacket = ctx.NewTracePacket(); auto* inputEvent = tracePacket->set_android_input_event(); @@ -72,7 +77,11 @@ void PerfettoBackend::traceMotionEvent(const TracedMotionEvent& event) { }); } -void PerfettoBackend::traceKeyEvent(const TracedKeyEvent& event) { +void PerfettoBackend::traceKeyEvent(const TracedKeyEvent& event, const TracedEventArgs& args) { + if (args.isSecure) { + // For now, avoid tracing secure event entirely. + return; + } InputEventDataSource::Trace([&](InputEventDataSource::TraceContext ctx) { auto tracePacket = ctx.NewTracePacket(); auto* inputEvent = tracePacket->set_android_input_event(); @@ -81,13 +90,17 @@ void PerfettoBackend::traceKeyEvent(const TracedKeyEvent& event) { }); } -void PerfettoBackend::traceWindowDispatch(const WindowDispatchArgs& dispatchArgs) { +void PerfettoBackend::traceWindowDispatch(const WindowDispatchArgs& dispatchArgs, + const TracedEventArgs& args) { + if (args.isSecure) { + // For now, avoid tracing secure event entirely. + return; + } InputEventDataSource::Trace([&](InputEventDataSource::TraceContext ctx) { auto tracePacket = ctx.NewTracePacket(); - auto* inputEventProto = tracePacket->set_android_input_event(); - auto* dispatchEventProto = inputEventProto->set_dispatcher_window_dispatch_event(); - AndroidInputEventProtoConverter::toProtoWindowDispatchEvent(dispatchArgs, - *dispatchEventProto); + auto* inputEvent = tracePacket->set_android_input_event(); + auto* dispatchEvent = inputEvent->set_dispatcher_window_dispatch_event(); + AndroidInputEventProtoConverter::toProtoWindowDispatchEvent(dispatchArgs, *dispatchEvent); }); } diff --git a/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.h b/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.h index fefcfb3ae0..d4553758a4 100644 --- a/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.h +++ b/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.h @@ -48,9 +48,9 @@ public: PerfettoBackend(); ~PerfettoBackend() override = default; - void traceKeyEvent(const TracedKeyEvent&) override; - void traceMotionEvent(const TracedMotionEvent&) override; - void traceWindowDispatch(const WindowDispatchArgs&) override; + void traceKeyEvent(const TracedKeyEvent&, const TracedEventArgs&) override; + void traceMotionEvent(const TracedMotionEvent&, const TracedEventArgs&) override; + void traceWindowDispatch(const WindowDispatchArgs&, const TracedEventArgs&) override; class InputEventDataSource : public perfetto::DataSource<InputEventDataSource> { public: diff --git a/services/inputflinger/dispatcher/trace/ThreadedBackend.cpp b/services/inputflinger/dispatcher/trace/ThreadedBackend.cpp index 25bc2276c9..b1791b3268 100644 --- a/services/inputflinger/dispatcher/trace/ThreadedBackend.cpp +++ b/services/inputflinger/dispatcher/trace/ThreadedBackend.cpp @@ -53,23 +53,26 @@ ThreadedBackend<Backend>::~ThreadedBackend() { } template <typename Backend> -void ThreadedBackend<Backend>::traceMotionEvent(const TracedMotionEvent& event) { +void ThreadedBackend<Backend>::traceMotionEvent(const TracedMotionEvent& event, + const TracedEventArgs& traceArgs) { std::scoped_lock lock(mLock); - mQueue.emplace_back(event); + mQueue.emplace_back(event, traceArgs); mThreadWakeCondition.notify_all(); } template <typename Backend> -void ThreadedBackend<Backend>::traceKeyEvent(const TracedKeyEvent& event) { +void ThreadedBackend<Backend>::traceKeyEvent(const TracedKeyEvent& event, + const TracedEventArgs& traceArgs) { std::scoped_lock lock(mLock); - mQueue.emplace_back(event); + mQueue.emplace_back(event, traceArgs); mThreadWakeCondition.notify_all(); } template <typename Backend> -void ThreadedBackend<Backend>::traceWindowDispatch(const WindowDispatchArgs& dispatchArgs) { +void ThreadedBackend<Backend>::traceWindowDispatch(const WindowDispatchArgs& dispatchArgs, + const TracedEventArgs& traceArgs) { std::scoped_lock lock(mLock); - mQueue.emplace_back(dispatchArgs); + mQueue.emplace_back(dispatchArgs, traceArgs); mThreadWakeCondition.notify_all(); } @@ -93,11 +96,13 @@ void ThreadedBackend<Backend>::threadLoop() { // Trace the events into the backend without holding the lock to reduce the amount of // work performed in the critical section. - for (const auto& entry : entries) { - std::visit(Visitor{[&](const TracedMotionEvent& e) { mBackend.traceMotionEvent(e); }, - [&](const TracedKeyEvent& e) { mBackend.traceKeyEvent(e); }, + for (const auto& [entry, traceArgs] : entries) { + std::visit(Visitor{[&](const TracedMotionEvent& e) { + mBackend.traceMotionEvent(e, traceArgs); + }, + [&](const TracedKeyEvent& e) { mBackend.traceKeyEvent(e, traceArgs); }, [&](const WindowDispatchArgs& args) { - mBackend.traceWindowDispatch(args); + mBackend.traceWindowDispatch(args, traceArgs); }}, entry); } diff --git a/services/inputflinger/dispatcher/trace/ThreadedBackend.h b/services/inputflinger/dispatcher/trace/ThreadedBackend.h index 5776cf9417..5d4efbb7e9 100644 --- a/services/inputflinger/dispatcher/trace/ThreadedBackend.h +++ b/services/inputflinger/dispatcher/trace/ThreadedBackend.h @@ -38,9 +38,9 @@ public: ThreadedBackend(Backend&& innerBackend); ~ThreadedBackend() override; - void traceKeyEvent(const TracedKeyEvent&) override; - void traceMotionEvent(const TracedMotionEvent&) override; - void traceWindowDispatch(const WindowDispatchArgs&) override; + void traceKeyEvent(const TracedKeyEvent&, const TracedEventArgs&) override; + void traceMotionEvent(const TracedMotionEvent&, const TracedEventArgs&) override; + void traceWindowDispatch(const WindowDispatchArgs&, const TracedEventArgs&) override; private: std::mutex mLock; @@ -48,7 +48,9 @@ private: bool mThreadExit GUARDED_BY(mLock){false}; std::condition_variable mThreadWakeCondition; Backend mBackend; - using TraceEntry = std::variant<TracedKeyEvent, TracedMotionEvent, WindowDispatchArgs>; + using TraceEntry = + std::pair<std::variant<TracedKeyEvent, TracedMotionEvent, WindowDispatchArgs>, + TracedEventArgs>; std::vector<TraceEntry> mQueue GUARDED_BY(mLock); using WindowDispatchArgs = InputTracingBackendInterface::WindowDispatchArgs; diff --git a/services/inputflinger/tests/FakeInputTracingBackend.cpp b/services/inputflinger/tests/FakeInputTracingBackend.cpp index 08738e3973..dc74f84d2c 100644 --- a/services/inputflinger/tests/FakeInputTracingBackend.cpp +++ b/services/inputflinger/tests/FakeInputTracingBackend.cpp @@ -163,7 +163,8 @@ base::Result<void> VerifyingTrace::verifyEventTraced(const Event& expectedEvent, // --- FakeInputTracingBackend --- -void FakeInputTracingBackend::traceKeyEvent(const trace::TracedKeyEvent& event) { +void FakeInputTracingBackend::traceKeyEvent(const trace::TracedKeyEvent& event, + const trace::TracedEventArgs&) { { std::scoped_lock lock(mTrace->mLock); mTrace->mTracedEvents.emplace(event.id, event); @@ -171,7 +172,8 @@ void FakeInputTracingBackend::traceKeyEvent(const trace::TracedKeyEvent& event) mTrace->mEventTracedCondition.notify_all(); } -void FakeInputTracingBackend::traceMotionEvent(const trace::TracedMotionEvent& event) { +void FakeInputTracingBackend::traceMotionEvent(const trace::TracedMotionEvent& event, + const trace::TracedEventArgs&) { { std::scoped_lock lock(mTrace->mLock); mTrace->mTracedEvents.emplace(event.id, event); @@ -179,7 +181,8 @@ void FakeInputTracingBackend::traceMotionEvent(const trace::TracedMotionEvent& e mTrace->mEventTracedCondition.notify_all(); } -void FakeInputTracingBackend::traceWindowDispatch(const WindowDispatchArgs& args) { +void FakeInputTracingBackend::traceWindowDispatch(const WindowDispatchArgs& args, + const trace::TracedEventArgs&) { { std::scoped_lock lock(mTrace->mLock); mTrace->mTracedWindowDispatches.push_back(args); diff --git a/services/inputflinger/tests/FakeInputTracingBackend.h b/services/inputflinger/tests/FakeInputTracingBackend.h index 1b3613d5c5..b149ffe7d8 100644 --- a/services/inputflinger/tests/FakeInputTracingBackend.h +++ b/services/inputflinger/tests/FakeInputTracingBackend.h @@ -83,9 +83,11 @@ public: private: std::shared_ptr<VerifyingTrace> mTrace; - void traceKeyEvent(const trace::TracedKeyEvent& entry) override; - void traceMotionEvent(const trace::TracedMotionEvent& entry) override; - void traceWindowDispatch(const WindowDispatchArgs& entry) override; + void traceKeyEvent(const trace::TracedKeyEvent& entry, const trace::TracedEventArgs&) override; + void traceMotionEvent(const trace::TracedMotionEvent& entry, + const trace::TracedEventArgs&) override; + void traceWindowDispatch(const WindowDispatchArgs& entry, + const trace::TracedEventArgs&) override; }; } // namespace android::inputdispatcher |