Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 39fe0cd4 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "InputTracer: Use PackageManagerNative to get package UID" into main

parents daa995cc f4099458
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -107,6 +107,7 @@ cc_defaults {
        "libutils",
        "libstatspull",
        "libstatssocket",
        "packagemanager_aidl-cpp",
        "server_configurable_flags",
    ],
    static_libs: [
+3 −0
Original line number Diff line number Diff line
@@ -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: [
+3 −6
Original line number Diff line number Diff line
@@ -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)
+0 −3
Original line number Diff line number Diff line
@@ -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,
+46 −8
Original line number Diff line number Diff line
@@ -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;
        }
Loading