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

Commit 8aa0980a authored by Rocky Fang's avatar Rocky Fang
Browse files

Improve sensorservice dump

Fixes: 288588302
Fixes: 353513545
Flag: EXEMPT bugfix
Test: adb shell dumpsys sensorservice and see expected dumps

Change-Id: I202118f830f712433034ca8d25b0db362379dd36
parent 2526c331
Loading
Loading
Loading
Loading
+25 −9
Original line number Diff line number Diff line
@@ -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);
    }
}

+11 −5
Original line number Diff line number Diff line
@@ -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,7 +38,7 @@ class BitTube;

class SensorService::SensorDirectConnection: public BnSensorEventConnection {
public:
    SensorDirectConnection(const sp<SensorService>& service, uid_t uid,
    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;
@@ -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;
+6 −7
Original line number Diff line number Diff line
@@ -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
+6 −3
Original line number Diff line number Diff line
@@ -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) {