diff options
| author | 2024-04-12 18:34:14 +0000 | |
|---|---|---|
| committer | 2024-04-26 00:15:34 +0000 | |
| commit | f40994585e9ee9e03db717d0ac55db19777951a6 (patch) | |
| tree | 99efc4982dfeaf6d16bbdd481fb932af43452e4a | |
| parent | f55e4459f4e0de68700b9c6c9150734497d6b4a9 (diff) | |
InputTracer: Use PackageManagerNative to get package UID
... instead of plumbing the call through InputManagerService via JNI.
Bug: 330360505
Test: manual
Test: atest inputflinger_tests
Change-Id: Ie763733d8dba442afcaea7560e6d997c06ca3877
9 files changed, 80 insertions, 49 deletions
diff --git a/services/inputflinger/Android.bp b/services/inputflinger/Android.bp index 4184a08a35..a03055ff86 100644 --- a/services/inputflinger/Android.bp +++ b/services/inputflinger/Android.bp @@ -107,6 +107,7 @@ cc_defaults { "libutils", "libstatspull", "libstatssocket", + "packagemanager_aidl-cpp", "server_configurable_flags", ], static_libs: [ diff --git a/services/inputflinger/dispatcher/Android.bp b/services/inputflinger/dispatcher/Android.bp index 6d71acc775..29aa3c3066 100644 --- a/services/inputflinger/dispatcher/Android.bp +++ b/services/inputflinger/dispatcher/Android.bp @@ -59,6 +59,8 @@ cc_defaults { srcs: [":libinputdispatcher_sources"], shared_libs: [ "libbase", + "libbinder", + "libbinder_ndk", "libcrypto", "libcutils", "libinput", @@ -69,6 +71,7 @@ cc_defaults { "libutils", "libstatspull", "libstatssocket", + "packagemanager_aidl-cpp", "server_configurable_flags", ], static_libs: [ diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp index d1930f1867..5a8e46e5ae 100644 --- a/services/inputflinger/dispatcher/InputDispatcher.cpp +++ b/services/inputflinger/dispatcher/InputDispatcher.cpp @@ -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> @@ -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) diff --git a/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h b/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h index 91a3e3f8db..62c2b02967 100644 --- a/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h +++ b/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h @@ -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, diff --git a/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp b/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp index 91ebe9bb5f..9b9633a1bd 100644 --- a/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp +++ b/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.cpp @@ -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 { @@ -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 --- @@ -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)); } } } @@ -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, []() { @@ -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; } @@ -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; } @@ -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; } diff --git a/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.h b/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.h index fdfe495c45..d0bab061f4 100644 --- a/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.h +++ b/services/inputflinger/dispatcher/trace/InputTracingPerfettoBackend.h @@ -20,6 +20,7 @@ #include "InputTracingPerfettoBackendConfig.h" +#include <android/content/pm/IPackageManagerNative.h> #include <ftl/flags.h> #include <perfetto/tracing.h> #include <mutex> @@ -49,11 +50,10 @@ namespace android::inputdispatcher::trace::impl { */ class PerfettoBackend : public InputTracingBackendInterface { public: - using GetPackageUid = std::function<gui::Uid(std::string)>; - static bool sUseInProcessBackendForTest; + static std::function<sp<content::pm::IPackageManagerNative>()> sPackageManagerProvider; - explicit PerfettoBackend(GetPackageUid); + explicit PerfettoBackend(); ~PerfettoBackend() override = default; void traceKeyEvent(const TracedKeyEvent&, const TracedEventMetadata&) override; @@ -72,7 +72,7 @@ private: void OnStart(const StartArgs&) override; void OnStop(const StopArgs&) override; - void initializeUidMap(GetPackageUid); + void initializeUidMap(); bool shouldIgnoreTracedInputEvent(const EventType&) const; inline ftl::Flags<TraceFlag> getFlags() const { return mConfig.flags; } TraceLevel resolveTraceLevel(const TracedEventMetadata&) const; @@ -86,10 +86,6 @@ private: std::optional<std::map<std::string, gui::Uid>> mUidMap; }; - // TODO(b/330360505): Query the native package manager directly from the data source, - // and remove this. - GetPackageUid mGetPackageUid; - static std::once_flag sDataSourceRegistrationFlag; static std::atomic<int32_t> sNextInstanceId; }; diff --git a/services/inputflinger/tests/FakeInputDispatcherPolicy.cpp b/services/inputflinger/tests/FakeInputDispatcherPolicy.cpp index 1360cd0208..36491ab64f 100644 --- a/services/inputflinger/tests/FakeInputDispatcherPolicy.cpp +++ b/services/inputflinger/tests/FakeInputDispatcherPolicy.cpp @@ -466,15 +466,4 @@ void FakeInputDispatcherPolicy::assertFilterInputEventWasCalledInternal( mFilteredEvent = nullptr; } -gui::Uid FakeInputDispatcherPolicy::getPackageUid(std::string pkg) { - std::scoped_lock lock(mLock); - auto it = mPackageUidMap.find(pkg); - return it != mPackageUidMap.end() ? it->second : gui::Uid::INVALID; -} - -void FakeInputDispatcherPolicy::addPackageUidMapping(std::string package, gui::Uid uid) { - std::scoped_lock lock(mLock); - mPackageUidMap.insert_or_assign(std::move(package), uid); -} - } // namespace android diff --git a/services/inputflinger/tests/FakeInputDispatcherPolicy.h b/services/inputflinger/tests/FakeInputDispatcherPolicy.h index 2cc018ef05..25d3d3c7ed 100644 --- a/services/inputflinger/tests/FakeInputDispatcherPolicy.h +++ b/services/inputflinger/tests/FakeInputDispatcherPolicy.h @@ -115,7 +115,6 @@ public: void setUnhandledKeyHandler(std::function<std::optional<KeyEvent>(const KeyEvent&)> handler); void assertUnhandledKeyReported(int32_t keycode); void assertUnhandledKeyNotReported(); - void addPackageUidMapping(std::string package, gui::Uid uid); private: std::mutex mLock; @@ -151,8 +150,6 @@ private: std::queue<int32_t> mReportedUnhandledKeycodes GUARDED_BY(mLock); std::function<std::optional<KeyEvent>(const KeyEvent&)> mUnhandledKeyHandler GUARDED_BY(mLock); - std::map<std::string, gui::Uid> mPackageUidMap GUARDED_BY(mLock); - /** * All three ANR-related callbacks behave the same way, so we use this generic function to wait * for a specific container to become non-empty. When the container is non-empty, return the @@ -199,7 +196,6 @@ private: void notifyDropWindow(const sp<IBinder>& token, float x, float y) override; void notifyDeviceInteraction(int32_t deviceId, nsecs_t timestamp, const std::set<gui::Uid>& uids) override; - gui::Uid getPackageUid(std::string) override; void assertFilterInputEventWasCalledInternal( const std::function<void(const InputEvent&)>& verify); diff --git a/services/inputflinger/tests/InputTracingTest.cpp b/services/inputflinger/tests/InputTracingTest.cpp index 23fa045f86..ef0eeaef6f 100644 --- a/services/inputflinger/tests/InputTracingTest.cpp +++ b/services/inputflinger/tests/InputTracingTest.cpp @@ -26,6 +26,7 @@ #include <NotifyArgsBuilders.h> #include <android-base/logging.h> +#include <android/content/pm/IPackageManagerNative.h> #include <gtest/gtest.h> #include <input/Input.h> #include <perfetto/trace/android/android_input_event.pbzero.h> @@ -65,6 +66,26 @@ const std::string ALLOWED_PKG_2{"allowed.pkg.2"}; const std::string DISALLOWED_PKG_1{"disallowed.pkg.1"}; const std::string DISALLOWED_PKG_2{"disallowed.pkg.2"}; +const std::map<std::string, gui::Uid> kPackageUidMap{ + {ALLOWED_PKG_1, ALLOWED_UID_1}, + {ALLOWED_PKG_2, ALLOWED_UID_2}, + {DISALLOWED_PKG_1, DISALLOWED_UID_1}, + {DISALLOWED_PKG_2, DISALLOWED_UID_2}, +}; + +class FakePackageManager : public content::pm::IPackageManagerNativeDefault { +public: + binder::Status getPackageUid(const ::std::string& pkg, int64_t flags, int32_t userId, + int32_t* outUid) override { + auto it = kPackageUidMap.find(pkg); + *outUid = it != kPackageUidMap.end() ? static_cast<int32_t>(it->second.val()) : -1; + return binder::Status::ok(); + } +}; + +const sp<testing::NiceMock<FakePackageManager>> kPackageManager = + sp<testing::NiceMock<FakePackageManager>>::make(); + const std::shared_ptr<FakeApplicationHandle> APP = std::make_shared<FakeApplicationHandle>(); } // namespace @@ -78,18 +99,11 @@ protected: void SetUp() override { impl::PerfettoBackend::sUseInProcessBackendForTest = true; - + impl::PerfettoBackend::sPackageManagerProvider = []() { return kPackageManager; }; mFakePolicy = std::make_unique<FakeInputDispatcherPolicy>(); - mFakePolicy->addPackageUidMapping(ALLOWED_PKG_1, ALLOWED_UID_1); - mFakePolicy->addPackageUidMapping(ALLOWED_PKG_2, ALLOWED_UID_2); - mFakePolicy->addPackageUidMapping(DISALLOWED_PKG_1, DISALLOWED_UID_1); - mFakePolicy->addPackageUidMapping(DISALLOWED_PKG_2, DISALLOWED_UID_2); auto tracingBackend = std::make_unique<impl::ThreadedBackend<impl::PerfettoBackend>>( - impl::PerfettoBackend([this](const auto& pkg) { - return static_cast<InputDispatcherPolicyInterface&>(*mFakePolicy) - .getPackageUid(pkg); - })); + impl::PerfettoBackend()); mRequestTracerIdle = tracingBackend->getIdleWaiterForTesting(); mDispatcher = std::make_unique<InputDispatcher>(*mFakePolicy, std::move(tracingBackend)); |