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

Commit 51224681 authored by Peng Xu's avatar Peng Xu
Browse files

Add uid and pid information into recent sensor registeration log

Some legacy native client do not specify a package name. Making
tracking of sensor request difficult. This cl adds uid and pid
into the dumpsys print to help alleviate this issue.

Test: adb shell dumpsys sensorservice
Change-Id: I26c778a50927cc6c4f14284c3c6a09d38b2e4dd5
parent 4b5287e0
Loading
Loading
Loading
Loading
+59 −12
Original line number Diff line number Diff line
@@ -17,29 +17,76 @@
#ifndef ANDROID_SENSOR_REGISTRATION_INFO_H
#define ANDROID_SENSOR_REGISTRATION_INFO_H

#include "SensorServiceUtils.h"
#include <utils/Thread.h>
#include <iomanip>
#include <sstream>

namespace android {

class SensorService;

struct SensorService::SensorRegistrationInfo {
    int32_t mSensorHandle;
    String8 mPackageName;
    bool mActivated;
    int32_t mSamplingRateUs;
    int32_t mMaxReportLatencyUs;
    int32_t mHour, mMin, mSec;

class SensorService::SensorRegistrationInfo : public SensorServiceUtil::Dumpable {
public:
    SensorRegistrationInfo() : mPackageName() {
        mSensorHandle = mSamplingRateUs = mMaxReportLatencyUs = INT32_MIN;
        mHour = mMin = mSec = INT32_MIN;
        mHour = mMin = mSec = INT8_MIN;
        mActivated = false;
    }

    SensorRegistrationInfo(int32_t handle, const String8 &packageName,
                           int32_t samplingRateNs, int32_t maxReportLatencyNs, bool activate) {
        mSensorHandle = handle;
        mPackageName = packageName;

        mSamplingRateUs = static_cast<int32_t>(samplingRateNs/1000);
        mMaxReportLatencyUs = static_cast<int32_t>(maxReportLatencyNs/1000);
        mActivated = activate;

        IPCThreadState *thread = IPCThreadState::self();
        mPid = (thread != nullptr) ? thread->getCallingPid() : -1;
        mUid = (thread != nullptr) ? thread->getCallingUid() : -1;

        time_t rawtime = time(NULL);
        struct tm * timeinfo = localtime(&rawtime);
        mHour = static_cast<int8_t>(timeinfo->tm_hour);
        mMin = static_cast<int8_t>(timeinfo->tm_min);
        mSec = static_cast<int8_t>(timeinfo->tm_sec);
    }

    static bool isSentinel(const SensorRegistrationInfo& info) {
       return (info.mHour == INT32_MIN &&
               info.mMin == INT32_MIN &&
               info.mSec == INT32_MIN);
       return (info.mHour == INT8_MIN &&
               info.mMin == INT8_MIN &&
               info.mSec == INT8_MIN);
    }

    // Dumpable interface
    virtual std::string dump() const override {
        std::ostringstream ss;
        ss << std::setfill('0') << std::setw(2) << static_cast<int>(mHour) << ":"
           << std::setw(2) << static_cast<int>(mMin) << ":"
           << std::setw(2) << static_cast<int>(mSec)
           << (mActivated ? " +" : " -")
           << " 0x" << std::hex << std::setw(8) << mSensorHandle << std::dec
           << std::setfill(' ') << " pid=" << std::setw(5) << mPid
           << " uid=" << std::setw(5) << mUid << " package=" << mPackageName;
        if (mActivated) {
           ss  << " samplingPeriod=" << mSamplingRateUs << "us"
               << " batchingPeriod=" << mMaxReportLatencyUs << "us";
        };
        return ss.str();
    }

private:
    int32_t mSensorHandle;
    String8 mPackageName;
    pid_t   mPid;
    uid_t   mUid;
    int32_t mSamplingRateUs;
    int32_t mMaxReportLatencyUs;
    bool mActivated;
    int8_t mHour, mMin, mSec;

};

} // namespace android;
+7 −33
Original line number Diff line number Diff line
@@ -480,17 +480,7 @@ status_t SensorService::dump(int fd, const Vector<String16>& args) {
                        SENSOR_REGISTRATIONS_BUF_SIZE;
                    continue;
                }
                if (reg_info.mActivated) {
                   result.appendFormat("%02d:%02d:%02d activated handle=0x%08x "
                           "samplingRate=%dus maxReportLatency=%dus package=%s\n",
                           reg_info.mHour, reg_info.mMin, reg_info.mSec, reg_info.mSensorHandle,
                           reg_info.mSamplingRateUs, reg_info.mMaxReportLatencyUs,
                           reg_info.mPackageName.string());
                } else {
                   result.appendFormat("%02d:%02d:%02d de-activated handle=0x%08x package=%s\n",
                           reg_info.mHour, reg_info.mMin, reg_info.mSec,
                           reg_info.mSensorHandle, reg_info.mPackageName.string());
                }
                result.appendFormat("%s\n", reg_info.dump().c_str());
                currentIndex = (currentIndex - 1 + SENSOR_REGISTRATIONS_BUF_SIZE) %
                        SENSOR_REGISTRATIONS_BUF_SIZE;
            } while(startIndex != currentIndex);
@@ -1220,18 +1210,10 @@ status_t SensorService::enable(const sp<SensorEventConnection>& connection,

    if (err == NO_ERROR) {
        connection->updateLooperRegistration(mLooper);
        SensorRegistrationInfo &reg_info =
            mLastNSensorRegistrations.editItemAt(mNextSensorRegIndex);
        reg_info.mSensorHandle = handle;
        reg_info.mSamplingRateUs = samplingPeriodNs/1000;
        reg_info.mMaxReportLatencyUs = maxBatchReportLatencyNs/1000;
        reg_info.mActivated = true;
        reg_info.mPackageName = connection->getPackageName();
        time_t rawtime = time(NULL);
        struct tm * timeinfo = localtime(&rawtime);
        reg_info.mHour = timeinfo->tm_hour;
        reg_info.mMin = timeinfo->tm_min;
        reg_info.mSec = timeinfo->tm_sec;

        mLastNSensorRegistrations.editItemAt(mNextSensorRegIndex) =
                SensorRegistrationInfo(handle, connection->getPackageName(),
                                       samplingPeriodNs, maxBatchReportLatencyNs, true);
        mNextSensorRegIndex = (mNextSensorRegIndex + 1) % SENSOR_REGISTRATIONS_BUF_SIZE;
    }

@@ -1254,16 +1236,8 @@ status_t SensorService::disable(const sp<SensorEventConnection>& connection, int

    }
    if (err == NO_ERROR) {
        SensorRegistrationInfo &reg_info =
            mLastNSensorRegistrations.editItemAt(mNextSensorRegIndex);
        reg_info.mActivated = false;
        reg_info.mPackageName= connection->getPackageName();
        reg_info.mSensorHandle = handle;
        time_t rawtime = time(NULL);
        struct tm * timeinfo = localtime(&rawtime);
        reg_info.mHour = timeinfo->tm_hour;
        reg_info.mMin = timeinfo->tm_min;
        reg_info.mSec = timeinfo->tm_sec;
        mLastNSensorRegistrations.editItemAt(mNextSensorRegIndex) =
                SensorRegistrationInfo(handle, connection->getPackageName(), 0, 0, false);
        mNextSensorRegIndex = (mNextSensorRegIndex + 1) % SENSOR_REGISTRATIONS_BUF_SIZE;
    }
    return err;
+1 −1
Original line number Diff line number Diff line
@@ -91,7 +91,7 @@ private:
    // nested class/struct for internal use
    class SensorRecord;
    class SensorEventAckReceiver;
    struct SensorRegistrationInfo;
    class SensorRegistrationInfo;

    enum Mode {
       // The regular operating mode where any application can register/unregister/call flush on