Loading services/inputflinger/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ cc_defaults { "libutils", "libstatspull", "libstatssocket", "packagemanager_aidl-cpp", "server_configurable_flags", ], static_libs: [ Loading services/inputflinger/dispatcher/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,8 @@ cc_defaults { srcs: [":libinputdispatcher_sources"], shared_libs: [ "libbase", "libbinder", "libbinder_ndk", "libcrypto", "libcutils", "libinput", Loading @@ -69,6 +71,7 @@ cc_defaults { "libutils", "libstatspull", "libstatssocket", "packagemanager_aidl-cpp", "server_configurable_flags", ], static_libs: [ Loading services/inputflinger/dispatcher/InputDispatcher.cpp +3 −6 Original line number Diff line number Diff line Loading @@ -88,13 +88,12 @@ bool isInputTracingEnabled() { } // Create the input tracing backend that writes to perfetto from a single thread. std::unique_ptr<trace::InputTracingBackendInterface> createInputTracingBackendIfEnabled( trace::impl::PerfettoBackend::GetPackageUid getPackageUid) { std::unique_ptr<trace::InputTracingBackendInterface> createInputTracingBackendIfEnabled() { if (!isInputTracingEnabled()) { return nullptr; } return std::make_unique<trace::impl::ThreadedBackend<trace::impl::PerfettoBackend>>( trace::impl::PerfettoBackend(getPackageUid)); trace::impl::PerfettoBackend()); } template <class Entry> Loading Loading @@ -904,9 +903,7 @@ private: // --- InputDispatcher --- InputDispatcher::InputDispatcher(InputDispatcherPolicyInterface& policy) : InputDispatcher(policy, createInputTracingBackendIfEnabled([&policy](std::string pkg) { return policy.getPackageUid(pkg); })) {} : InputDispatcher(policy, createInputTracingBackendIfEnabled()) {} InputDispatcher::InputDispatcher(InputDispatcherPolicyInterface& policy, std::unique_ptr<trace::InputTracingBackendInterface> traceBackend) Loading services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h +0 −3 Original line number Diff line number Diff line Loading @@ -163,9 +163,6 @@ public: virtual void notifyDeviceInteraction(DeviceId deviceId, nsecs_t timestamp, const std::set<gui::Uid>& uids) = 0; /* Get the UID associated with the given package. */ virtual gui::Uid getPackageUid(std::string package) = 0; private: // Additional key latency in case a connection is still processing some motion events. // This will help with the case when a user touched a button that opens a new window, Loading services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp +46 −8 Original line number Diff line number Diff line Loading @@ -21,8 +21,10 @@ #include "AndroidInputEventProtoConverter.h" #include <android-base/logging.h> #include <binder/IServiceManager.h> #include <perfetto/trace/android/android_input_event.pbzero.h> #include <private/android_filesystem_config.h> #include <utils/String16.h> namespace android::inputdispatcher::trace::impl { Loading @@ -41,6 +43,34 @@ bool isPermanentlyAllowed(gui::Uid uid) { } } sp<content::pm::IPackageManagerNative> getPackageManager() { sp<IServiceManager> serviceManager = defaultServiceManager(); if (!serviceManager) { LOG(ERROR) << __func__ << ": unable to access native ServiceManager"; return nullptr; } sp<IBinder> binder = serviceManager->waitForService(String16("package_native")); auto packageManager = interface_cast<content::pm::IPackageManagerNative>(binder); if (!packageManager) { LOG(ERROR) << ": unable to access native PackageManager"; return nullptr; } return packageManager; } gui::Uid getPackageUid(const sp<content::pm::IPackageManagerNative>& pm, const std::string& package) { int32_t outUid = -1; if (auto status = pm->getPackageUid(package, /*flags=*/0, AID_SYSTEM, &outUid); !status.isOk()) { LOG(INFO) << "Failed to get package UID from native package manager for package '" << package << "': " << status; return gui::Uid::INVALID; } return gui::Uid{static_cast<uid_t>(outUid)}; } } // namespace // --- PerfettoBackend::InputEventDataSource --- Loading @@ -67,18 +97,24 @@ void PerfettoBackend::InputEventDataSource::OnStop(const InputEventDataSource::S InputEventDataSource::Trace([&](InputEventDataSource::TraceContext ctx) { ctx.Flush(); }); } void PerfettoBackend::InputEventDataSource::initializeUidMap(GetPackageUid getPackageUid) { void PerfettoBackend::InputEventDataSource::initializeUidMap() { if (mUidMap.has_value()) { return; } mUidMap = {{}}; auto packageManager = PerfettoBackend::sPackageManagerProvider(); if (!packageManager) { LOG(ERROR) << "Failed to initialize UID map: Could not get native package manager"; return; } for (const auto& rule : mConfig.rules) { for (const auto& package : rule.matchAllPackages) { mUidMap->emplace(package, getPackageUid(package)); mUidMap->emplace(package, getPackageUid(packageManager, package)); } for (const auto& package : rule.matchAnyPackages) { mUidMap->emplace(package, getPackageUid(package)); mUidMap->emplace(package, getPackageUid(packageManager, package)); } } } Loading Loading @@ -151,12 +187,14 @@ bool PerfettoBackend::InputEventDataSource::ruleMatches(const TraceRule& rule, bool PerfettoBackend::sUseInProcessBackendForTest{false}; std::function<sp<content::pm::IPackageManagerNative>()> PerfettoBackend::sPackageManagerProvider{ &getPackageManager}; std::once_flag PerfettoBackend::sDataSourceRegistrationFlag{}; std::atomic<int32_t> PerfettoBackend::sNextInstanceId{1}; PerfettoBackend::PerfettoBackend(GetPackageUid getPackagesForUid) : mGetPackageUid(getPackagesForUid) { PerfettoBackend::PerfettoBackend() { // Use a once-flag to ensure that the data source is only registered once per boot, since // we never unregister the InputEventDataSource. std::call_once(sDataSourceRegistrationFlag, []() { Loading @@ -181,7 +219,7 @@ void PerfettoBackend::traceMotionEvent(const TracedMotionEvent& event, if (!dataSource.valid()) { return; } dataSource->initializeUidMap(mGetPackageUid); dataSource->initializeUidMap(); if (dataSource->shouldIgnoreTracedInputEvent(event.eventType)) { return; } Loading @@ -205,7 +243,7 @@ void PerfettoBackend::traceKeyEvent(const TracedKeyEvent& event, if (!dataSource.valid()) { return; } dataSource->initializeUidMap(mGetPackageUid); dataSource->initializeUidMap(); if (dataSource->shouldIgnoreTracedInputEvent(event.eventType)) { return; } Loading @@ -229,7 +267,7 @@ void PerfettoBackend::traceWindowDispatch(const WindowDispatchArgs& dispatchArgs if (!dataSource.valid()) { return; } dataSource->initializeUidMap(mGetPackageUid); dataSource->initializeUidMap(); if (!dataSource->getFlags().test(TraceFlag::TRACE_DISPATCHER_WINDOW_DISPATCH)) { return; } Loading Loading
services/inputflinger/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -107,6 +107,7 @@ cc_defaults { "libutils", "libstatspull", "libstatssocket", "packagemanager_aidl-cpp", "server_configurable_flags", ], static_libs: [ Loading
services/inputflinger/dispatcher/Android.bp +3 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,8 @@ cc_defaults { srcs: [":libinputdispatcher_sources"], shared_libs: [ "libbase", "libbinder", "libbinder_ndk", "libcrypto", "libcutils", "libinput", Loading @@ -69,6 +71,7 @@ cc_defaults { "libutils", "libstatspull", "libstatssocket", "packagemanager_aidl-cpp", "server_configurable_flags", ], static_libs: [ Loading
services/inputflinger/dispatcher/InputDispatcher.cpp +3 −6 Original line number Diff line number Diff line Loading @@ -88,13 +88,12 @@ bool isInputTracingEnabled() { } // Create the input tracing backend that writes to perfetto from a single thread. std::unique_ptr<trace::InputTracingBackendInterface> createInputTracingBackendIfEnabled( trace::impl::PerfettoBackend::GetPackageUid getPackageUid) { std::unique_ptr<trace::InputTracingBackendInterface> createInputTracingBackendIfEnabled() { if (!isInputTracingEnabled()) { return nullptr; } return std::make_unique<trace::impl::ThreadedBackend<trace::impl::PerfettoBackend>>( trace::impl::PerfettoBackend(getPackageUid)); trace::impl::PerfettoBackend()); } template <class Entry> Loading Loading @@ -904,9 +903,7 @@ private: // --- InputDispatcher --- InputDispatcher::InputDispatcher(InputDispatcherPolicyInterface& policy) : InputDispatcher(policy, createInputTracingBackendIfEnabled([&policy](std::string pkg) { return policy.getPackageUid(pkg); })) {} : InputDispatcher(policy, createInputTracingBackendIfEnabled()) {} InputDispatcher::InputDispatcher(InputDispatcherPolicyInterface& policy, std::unique_ptr<trace::InputTracingBackendInterface> traceBackend) Loading
services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h +0 −3 Original line number Diff line number Diff line Loading @@ -163,9 +163,6 @@ public: virtual void notifyDeviceInteraction(DeviceId deviceId, nsecs_t timestamp, const std::set<gui::Uid>& uids) = 0; /* Get the UID associated with the given package. */ virtual gui::Uid getPackageUid(std::string package) = 0; private: // Additional key latency in case a connection is still processing some motion events. // This will help with the case when a user touched a button that opens a new window, Loading
services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp +46 −8 Original line number Diff line number Diff line Loading @@ -21,8 +21,10 @@ #include "AndroidInputEventProtoConverter.h" #include <android-base/logging.h> #include <binder/IServiceManager.h> #include <perfetto/trace/android/android_input_event.pbzero.h> #include <private/android_filesystem_config.h> #include <utils/String16.h> namespace android::inputdispatcher::trace::impl { Loading @@ -41,6 +43,34 @@ bool isPermanentlyAllowed(gui::Uid uid) { } } sp<content::pm::IPackageManagerNative> getPackageManager() { sp<IServiceManager> serviceManager = defaultServiceManager(); if (!serviceManager) { LOG(ERROR) << __func__ << ": unable to access native ServiceManager"; return nullptr; } sp<IBinder> binder = serviceManager->waitForService(String16("package_native")); auto packageManager = interface_cast<content::pm::IPackageManagerNative>(binder); if (!packageManager) { LOG(ERROR) << ": unable to access native PackageManager"; return nullptr; } return packageManager; } gui::Uid getPackageUid(const sp<content::pm::IPackageManagerNative>& pm, const std::string& package) { int32_t outUid = -1; if (auto status = pm->getPackageUid(package, /*flags=*/0, AID_SYSTEM, &outUid); !status.isOk()) { LOG(INFO) << "Failed to get package UID from native package manager for package '" << package << "': " << status; return gui::Uid::INVALID; } return gui::Uid{static_cast<uid_t>(outUid)}; } } // namespace // --- PerfettoBackend::InputEventDataSource --- Loading @@ -67,18 +97,24 @@ void PerfettoBackend::InputEventDataSource::OnStop(const InputEventDataSource::S InputEventDataSource::Trace([&](InputEventDataSource::TraceContext ctx) { ctx.Flush(); }); } void PerfettoBackend::InputEventDataSource::initializeUidMap(GetPackageUid getPackageUid) { void PerfettoBackend::InputEventDataSource::initializeUidMap() { if (mUidMap.has_value()) { return; } mUidMap = {{}}; auto packageManager = PerfettoBackend::sPackageManagerProvider(); if (!packageManager) { LOG(ERROR) << "Failed to initialize UID map: Could not get native package manager"; return; } for (const auto& rule : mConfig.rules) { for (const auto& package : rule.matchAllPackages) { mUidMap->emplace(package, getPackageUid(package)); mUidMap->emplace(package, getPackageUid(packageManager, package)); } for (const auto& package : rule.matchAnyPackages) { mUidMap->emplace(package, getPackageUid(package)); mUidMap->emplace(package, getPackageUid(packageManager, package)); } } } Loading Loading @@ -151,12 +187,14 @@ bool PerfettoBackend::InputEventDataSource::ruleMatches(const TraceRule& rule, bool PerfettoBackend::sUseInProcessBackendForTest{false}; std::function<sp<content::pm::IPackageManagerNative>()> PerfettoBackend::sPackageManagerProvider{ &getPackageManager}; std::once_flag PerfettoBackend::sDataSourceRegistrationFlag{}; std::atomic<int32_t> PerfettoBackend::sNextInstanceId{1}; PerfettoBackend::PerfettoBackend(GetPackageUid getPackagesForUid) : mGetPackageUid(getPackagesForUid) { PerfettoBackend::PerfettoBackend() { // Use a once-flag to ensure that the data source is only registered once per boot, since // we never unregister the InputEventDataSource. std::call_once(sDataSourceRegistrationFlag, []() { Loading @@ -181,7 +219,7 @@ void PerfettoBackend::traceMotionEvent(const TracedMotionEvent& event, if (!dataSource.valid()) { return; } dataSource->initializeUidMap(mGetPackageUid); dataSource->initializeUidMap(); if (dataSource->shouldIgnoreTracedInputEvent(event.eventType)) { return; } Loading @@ -205,7 +243,7 @@ void PerfettoBackend::traceKeyEvent(const TracedKeyEvent& event, if (!dataSource.valid()) { return; } dataSource->initializeUidMap(mGetPackageUid); dataSource->initializeUidMap(); if (dataSource->shouldIgnoreTracedInputEvent(event.eventType)) { return; } Loading @@ -229,7 +267,7 @@ void PerfettoBackend::traceWindowDispatch(const WindowDispatchArgs& dispatchArgs if (!dataSource.valid()) { return; } dataSource->initializeUidMap(mGetPackageUid); dataSource->initializeUidMap(); if (!dataSource->getFlags().test(TraceFlag::TRACE_DISPATCHER_WINDOW_DISPATCH)) { return; } Loading