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
diff --git a/services/inputflinger/Android.bp b/services/inputflinger/Android.bp
index 4184a08..a03055f 100644
--- a/services/inputflinger/Android.bp
+++ b/services/inputflinger/Android.bp
@@ -107,6 +107,7 @@
"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 6d71acc..29aa3c3 100644
--- a/services/inputflinger/dispatcher/Android.bp
+++ b/services/inputflinger/dispatcher/Android.bp
@@ -59,6 +59,8 @@
srcs: [":libinputdispatcher_sources"],
shared_libs: [
"libbase",
+ "libbinder",
+ "libbinder_ndk",
"libcrypto",
"libcutils",
"libinput",
@@ -69,6 +71,7 @@
"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 d1930f1..5a8e46e 100644
--- a/services/inputflinger/dispatcher/InputDispatcher.cpp
+++ b/services/inputflinger/dispatcher/InputDispatcher.cpp
@@ -88,13 +88,12 @@
}
// 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 @@
// --- 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 91a3e3f..62c2b02 100644
--- a/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h
+++ b/services/inputflinger/dispatcher/include/InputDispatcherPolicyInterface.h
@@ -163,9 +163,6 @@
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 91ebe9b..9b9633a 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 @@
}
}
+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 @@
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::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 @@
if (!dataSource.valid()) {
return;
}
- dataSource->initializeUidMap(mGetPackageUid);
+ dataSource->initializeUidMap();
if (dataSource->shouldIgnoreTracedInputEvent(event.eventType)) {
return;
}
@@ -205,7 +243,7 @@
if (!dataSource.valid()) {
return;
}
- dataSource->initializeUidMap(mGetPackageUid);
+ dataSource->initializeUidMap();
if (dataSource->shouldIgnoreTracedInputEvent(event.eventType)) {
return;
}
@@ -229,7 +267,7 @@
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 fdfe495..d0bab06 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 @@
*/
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 @@
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 @@
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 1360cd0..36491ab 100644
--- a/services/inputflinger/tests/FakeInputDispatcherPolicy.cpp
+++ b/services/inputflinger/tests/FakeInputDispatcherPolicy.cpp
@@ -466,15 +466,4 @@
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 2cc018e..25d3d3c 100644
--- a/services/inputflinger/tests/FakeInputDispatcherPolicy.h
+++ b/services/inputflinger/tests/FakeInputDispatcherPolicy.h
@@ -115,7 +115,6 @@
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 @@
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 @@
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 23fa045..ef0eeae 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 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 @@
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));