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
diff --git a/services/sensorservice/SensorRegistrationInfo.h b/services/sensorservice/SensorRegistrationInfo.h
index 54d815b..75e8989 100644
--- a/services/sensorservice/SensorRegistrationInfo.h
+++ b/services/sensorservice/SensorRegistrationInfo.h
@@ -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;
}
- static bool isSentinel(const SensorRegistrationInfo& info) {
- return (info.mHour == INT32_MIN &&
- info.mMin == INT32_MIN &&
- info.mSec == INT32_MIN);
+ 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 == 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;
diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp
index c11df13..8fc4921 100644
--- a/services/sensorservice/SensorService.cpp
+++ b/services/sensorservice/SensorService.cpp
@@ -480,17 +480,7 @@
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 @@
if (err == NO_ERROR) {
connection->updateLooperRegistration(mLooper);
- SensorRegistrationInfo ®_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 @@
}
if (err == NO_ERROR) {
- SensorRegistrationInfo ®_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;
diff --git a/services/sensorservice/SensorService.h b/services/sensorservice/SensorService.h
index 5583dad..d0be121 100644
--- a/services/sensorservice/SensorService.h
+++ b/services/sensorservice/SensorService.h
@@ -91,7 +91,7 @@
// 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