diff options
author | 2024-08-01 18:07:54 +0000 | |
---|---|---|
committer | 2024-08-07 23:07:48 +0000 | |
commit | 8aa0980a6a17f31d268311dbfb843d2f2edf8dfa (patch) | |
tree | 588dbd5afb0aa62376640d8fa9bfb43aafbfc9f9 | |
parent | 2526c3316de5830171481f4519c7b80e6d615f45 (diff) |
Improve sensorservice dump
Fixes: 288588302
Fixes: 353513545
Flag: EXEMPT bugfix
Test: adb shell dumpsys sensorservice and see expected dumps
Change-Id: I202118f830f712433034ca8d25b0db362379dd36
-rw-r--r-- | services/sensorservice/SensorDirectConnection.cpp | 34 | ||||
-rw-r--r-- | services/sensorservice/SensorDirectConnection.h | 16 | ||||
-rw-r--r-- | services/sensorservice/SensorEventConnection.cpp | 13 | ||||
-rw-r--r-- | services/sensorservice/SensorService.cpp | 9 |
4 files changed, 48 insertions, 24 deletions
diff --git a/services/sensorservice/SensorDirectConnection.cpp b/services/sensorservice/SensorDirectConnection.cpp index 555b80aed3..33724a93b5 100644 --- a/services/sensorservice/SensorDirectConnection.cpp +++ b/services/sensorservice/SensorDirectConnection.cpp @@ -26,12 +26,17 @@ namespace android { using util::ProtoOutputStream; -SensorService::SensorDirectConnection::SensorDirectConnection(const sp<SensorService>& service, - uid_t uid, const sensors_direct_mem_t *mem, int32_t halChannelHandle, - const String16& opPackageName, int deviceId) - : mService(service), mUid(uid), mMem(*mem), +SensorService::SensorDirectConnection::SensorDirectConnection( + const sp<SensorService>& service, uid_t uid, pid_t pid, const sensors_direct_mem_t* mem, + int32_t halChannelHandle, const String16& opPackageName, int deviceId) + : mService(service), + mUid(uid), + mPid(pid), + mMem(*mem), mHalChannelHandle(halChannelHandle), - mOpPackageName(opPackageName), mDeviceId(deviceId), mDestroyed(false) { + mOpPackageName(opPackageName), + mDeviceId(deviceId), + mDestroyed(false) { mUserId = multiuser_get_user_id(mUid); ALOGD_IF(DEBUG_CONNECTIONS, "Created SensorDirectConnection"); } @@ -62,10 +67,21 @@ void SensorService::SensorDirectConnection::onFirstRef() { void SensorService::SensorDirectConnection::dump(String8& result) const { Mutex::Autolock _l(mConnectionLock); - result.appendFormat("\tPackage %s, HAL channel handle %d, total sensor activated %zu\n", - String8(mOpPackageName).c_str(), getHalChannelHandle(), mActivated.size()); - for (auto &i : mActivated) { - result.appendFormat("\t\tSensor %#08x, rate %d\n", i.first, i.second); + result.appendFormat("\t%s | HAL channel handle %d | uid %d | pid %d\n", + String8(mOpPackageName).c_str(), getHalChannelHandle(), mUid, mPid); + result.appendFormat("\tActivated sensor count: %zu\n", mActivated.size()); + dumpSensorInfoWithLock(result, mActivated); + + result.appendFormat("\tBackup sensor (opened but UID idle) count: %zu\n", + mActivatedBackup.size()); + dumpSensorInfoWithLock(result, mActivatedBackup); +} + +void SensorService::SensorDirectConnection::dumpSensorInfoWithLock( + String8& result, std::unordered_map<int, int> sensors) const { + for (auto& i : sensors) { + result.appendFormat("\t\t%s 0x%08x | rate %d\n", mService->getSensorName(i.first).c_str(), + i.first, i.second); } } diff --git a/services/sensorservice/SensorDirectConnection.h b/services/sensorservice/SensorDirectConnection.h index bfaf811330..9f21731fa9 100644 --- a/services/sensorservice/SensorDirectConnection.h +++ b/services/sensorservice/SensorDirectConnection.h @@ -17,9 +17,10 @@ #ifndef ANDROID_SENSOR_DIRECT_CONNECTION_H #define ANDROID_SENSOR_DIRECT_CONNECTION_H -#include <optional> +#include <android-base/thread_annotations.h> #include <stdint.h> #include <sys/types.h> +#include <optional> #include <binder/BinderService.h> @@ -37,15 +38,15 @@ class BitTube; class SensorService::SensorDirectConnection: public BnSensorEventConnection { public: - SensorDirectConnection(const sp<SensorService>& service, uid_t uid, - const sensors_direct_mem_t *mem, int32_t halChannelHandle, - const String16& opPackageName, int deviceId); + SensorDirectConnection(const sp<SensorService>& service, uid_t uid, pid_t pid, + const sensors_direct_mem_t* mem, int32_t halChannelHandle, + const String16& opPackageName, int deviceId); void dump(String8& result) const; void dump(util::ProtoOutputStream* proto) const; uid_t getUid() const { return mUid; } const String16& getOpPackageName() const { return mOpPackageName; } int32_t getHalChannelHandle() const; - bool isEquivalent(const sensors_direct_mem_t *mem) const; + bool isEquivalent(const sensors_direct_mem_t* mem) const; // Invoked when access to sensors for this connection has changed, e.g. lost or // regained due to changes in the sensor restricted/privacy mode or the @@ -94,8 +95,13 @@ private: // Recover sensor requests previously capped by capRates(). void uncapRates(); + // Dumps a set of sensor infos. + void dumpSensorInfoWithLock(String8& result, std::unordered_map<int, int> sensors) const + EXCLUSIVE_LOCKS_REQUIRED(mConnectionLock); + const sp<SensorService> mService; const uid_t mUid; + const pid_t mPid; const sensors_direct_mem_t mMem; const int32_t mHalChannelHandle; const String16 mOpPackageName; diff --git a/services/sensorservice/SensorEventConnection.cpp b/services/sensorservice/SensorEventConnection.cpp index 3446f58b96..130c112fd2 100644 --- a/services/sensorservice/SensorEventConnection.cpp +++ b/services/sensorservice/SensorEventConnection.cpp @@ -90,15 +90,14 @@ void SensorService::SensorEventConnection::dump(String8& result) { result.append("NORMAL\n"); } result.appendFormat("\t %s | WakeLockRefCount %d | uid %d | cache size %d | " - "max cache size %d\n", mPackageName.c_str(), mWakeLockRefCount, mUid, mCacheSize, - mMaxCacheSize); + "max cache size %d | has sensor access: %s\n", + mPackageName.c_str(), mWakeLockRefCount, mUid, mCacheSize, mMaxCacheSize, + hasSensorAccess() ? "true" : "false"); for (auto& it : mSensorInfo) { const FlushInfo& flushInfo = it.second; - result.appendFormat("\t %s 0x%08x | status: %s | pending flush events %d \n", - mService->getSensorName(it.first).c_str(), - it.first, - flushInfo.mFirstFlushPending ? "First flush pending" : - "active", + result.appendFormat("\t %s 0x%08x | first flush pending: %s | pending flush events %d \n", + mService->getSensorName(it.first).c_str(), it.first, + flushInfo.mFirstFlushPending ? "true" : "false", flushInfo.mPendingFlushEventsToSend); } #if DEBUG_CONNECTIONS diff --git a/services/sensorservice/SensorService.cpp b/services/sensorservice/SensorService.cpp index 31b7f8886c..3895ffe55e 100644 --- a/services/sensorservice/SensorService.cpp +++ b/services/sensorservice/SensorService.cpp @@ -682,14 +682,14 @@ status_t SensorService::dump(int fd, const Vector<String16>& args) { mSensorPrivacyPolicy->isSensorPrivacyEnabled() ? "enabled" : "disabled"); const auto& activeConnections = connLock.getActiveConnections(); - result.appendFormat("%zd active connections\n", activeConnections.size()); + result.appendFormat("%zd open event connections\n", activeConnections.size()); for (size_t i=0 ; i < activeConnections.size() ; i++) { result.appendFormat("Connection Number: %zu \n", i); activeConnections[i]->dump(result); } const auto& directConnections = connLock.getDirectConnections(); - result.appendFormat("%zd direct connections\n", directConnections.size()); + result.appendFormat("%zd open direct connections\n", directConnections.size()); for (size_t i = 0 ; i < directConnections.size() ; i++) { result.appendFormat("Direct connection %zu:\n", i); directConnections[i]->dump(result); @@ -1729,7 +1729,10 @@ sp<ISensorEventConnection> SensorService::createSensorDirectConnection( ALOGE("SensorDevice::registerDirectChannel returns %d", channelHandle); } else { mem.handle = clone; - conn = new SensorDirectConnection(this, uid, &mem, channelHandle, opPackageName, deviceId); + IPCThreadState* thread = IPCThreadState::self(); + pid_t pid = (thread != nullptr) ? thread->getCallingPid() : -1; + conn = new SensorDirectConnection(this, uid, pid, &mem, channelHandle, opPackageName, + deviceId); } if (conn == nullptr) { |