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

Commit e449b0c1 authored by Ruchir Rastogi's avatar Ruchir Rastogi
Browse files

Move statsd (and tests) to libbinder_ndk

Major changes include:
    - Removing unused permission checks within StatsService. These
      include ENFORCE_DUMP_AND_USAGE_STATS, checkDumpAndUsageStats,
      kOpUsage, and kPermissionUsage.
    - Converting from sp to shared_ptr
    - Using libbinder_ndk functions instead of libbinder functions
      (e.g. for installing death recipients, getting calling uids, etc.)
        - New death recipients were added in StatsService,
          ConfigManager, and SubscriberReporter.
    - Using a unique token (timestamp) to identify shell subscribers
      instead of IResultReceiver because IResultReceiver is not exposed by
      libbinder_ndk. Currently, statsd cannot detect if perfd dies; we
      will fix that later.

Bug: 145232107
Bug: 148609603
Test: m statsd
Test: m statsd_test
Test: bit stastd_test:*
Test: atest GtsStatsdHostTestCases
Change-Id: Ia1fda7280c22320bc4ebc8371acaadbe8eabcbd2
parent 22b21595
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -123,11 +123,11 @@ cc_defaults {
        "libutils",
    ],
    shared_libs: [
        "libbinder",
        "libbinder_ndk",
        "libincident",
        "liblog",
        "libstatssocket",
        "statsd-aidl-cpp",
        "statsd-aidl-ndk_platform",
    ],
}

+2 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ namespace statsd {

using std::string;
using std::vector;
using android::base::StringPrintf;

// These constants must be kept in sync with those in StatsDimensionsValue.java
const static int STATS_DIMENSIONS_VALUE_STRING_TYPE = 2;
@@ -73,7 +74,7 @@ static void populateStatsDimensionsValueParcelChildren(StatsDimensionsValueParce
                    break;
                case STRING:
                    childParcel.valueType = STATS_DIMENSIONS_VALUE_STRING_TYPE;
                    childParcel.stringValue = String16(dim.mValue.str_value.c_str());
                    childParcel.stringValue = dim.mValue.str_value;
                    break;
                default:
                    ALOGE("Encountered FieldValue with unsupported value type.");
+2 −2
Original line number Diff line number Diff line
@@ -16,7 +16,7 @@

#pragma once

#include <android/os/StatsDimensionsValueParcel.h>
#include <aidl/android/os/StatsDimensionsValueParcel.h>
#include <utils/JenkinsHash.h>
#include <vector>
#include "android-base/stringprintf.h"
@@ -27,7 +27,7 @@ namespace android {
namespace os {
namespace statsd {

using android::base::StringPrintf;
using ::aidl::android::os::StatsDimensionsValueParcel;

struct Metric2Condition {
    int64_t conditionId;
+135 −190

File changed.

Preview size limit exceeded, changes collapsed.

+41 −29
Original line number Diff line number Diff line
@@ -27,27 +27,30 @@
#include "shell/ShellSubscriber.h"
#include "statscompanion_util.h"

#include <android/os/BnStatsd.h>
#include <android/os/IPendingIntentRef.h>
#include <android/os/IStatsCompanionService.h>
#include <android/os/IStatsd.h>
#include <binder/IResultReceiver.h>
#include <binder/ParcelFileDescriptor.h>
#include <aidl/android/os/BnStatsd.h>
#include <aidl/android/os/IPendingIntentRef.h>
#include <aidl/android/os/IPullAtomCallback.h>
#include <utils/Looper.h>

#include <mutex>

using namespace android;
using namespace android::binder;
using namespace android::os;
using namespace std;

using Status = ::ndk::ScopedAStatus;
using aidl::android::os::BnStatsd;
using aidl::android::os::IPendingIntentRef;
using aidl::android::os::IPullAtomCallback;
using ::ndk::ScopedAIBinder_DeathRecipient;
using ::ndk::ScopedFileDescriptor;
using std::shared_ptr;

namespace android {
namespace os {
namespace statsd {

class StatsService : public BnStatsd,
                     public IBinder::DeathRecipient {
class StatsService : public BnStatsd {
public:
    StatsService(const sp<Looper>& handlerLooper, std::shared_ptr<LogEventQueue> queue);
    virtual ~StatsService();
@@ -55,10 +58,9 @@ public:
    /** The anomaly alarm registered with AlarmManager won't be updated by less than this. */
    const uint32_t MIN_DIFF_TO_UPDATE_REGISTERED_ALARM_SECS = 5;

    virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags);
    virtual status_t dump(int fd, const Vector<String16>& args);
    virtual status_t command(int inFd, int outFd, int err, Vector<String8>& args,
                             sp<IResultReceiver> resultReceiver);
    virtual status_t dump(int fd, const char** args, uint32_t numArgs) override;
    virtual status_t handleShellCommand(int in, int out, int err, const char** argv,
                                        uint32_t argc) override;

    virtual Status systemRunning();
    virtual Status statsCompanionReady();
@@ -66,10 +68,10 @@ public:
    virtual Status informPollAlarmFired();
    virtual Status informAlarmForSubscriberTriggeringFired();

    virtual Status informAllUidData(const ParcelFileDescriptor& fd);
    virtual Status informOnePackage(const String16& app, int32_t uid, int64_t version,
                                    const String16& version_string, const String16& installer);
    virtual Status informOnePackageRemoved(const String16& app, int32_t uid);
    virtual Status informAllUidData(const ScopedFileDescriptor& fd);
    virtual Status informOnePackage(const string& app, int32_t uid, int64_t version,
                                    const string& versionString, const string& installer);
    virtual Status informOnePackageRemoved(const string& app, int32_t uid);
    virtual Status informDeviceShutdown();

    /**
@@ -92,13 +94,13 @@ public:
     */
    virtual Status getData(int64_t key,
                           const int32_t callingUid,
                           vector<uint8_t>* output) override;
                           vector<int8_t>* output) override;


    /**
     * Binder call for clients to get metadata across all configs in statsd.
     */
    virtual Status getMetadata(vector<uint8_t>* output) override;
    virtual Status getMetadata(vector<int8_t>* output) override;


    /**
@@ -106,14 +108,14 @@ public:
     * should requestData for this configuration.
     */
    virtual Status addConfiguration(int64_t key,
                                    const vector<uint8_t>& config,
                                    const vector<int8_t>& config,
                                    const int32_t callingUid) override;

    /**
     * Binder call to let clients register the data fetch operation for a configuration.
     */
    virtual Status setDataFetchOperation(int64_t key,
                                         const sp<IPendingIntentRef>& pir,
                                         const shared_ptr<IPendingIntentRef>& pir,
                                         const int32_t callingUid) override;

    /**
@@ -125,7 +127,7 @@ public:
    /**
     * Binder call to let clients register the active configs changed operation.
     */
    virtual Status setActiveConfigsChangedOperation(const sp<IPendingIntentRef>& pir,
    virtual Status setActiveConfigsChangedOperation(const shared_ptr<IPendingIntentRef>& pir,
                                                    const int32_t callingUid,
                                                    vector<int64_t>* output) override;

@@ -144,7 +146,7 @@ public:
     */
    virtual Status setBroadcastSubscriber(int64_t configId,
                                          int64_t subscriberId,
                                          const sp<IPendingIntentRef>& pir,
                                          const shared_ptr<IPendingIntentRef>& pir,
                                          const int32_t callingUid) override;

    /**
@@ -167,14 +169,14 @@ public:
     */
    virtual Status registerPullAtomCallback(int32_t uid, int32_t atomTag, int64_t coolDownNs,
            int64_t timeoutNs, const std::vector<int32_t>& additiveFields,
            const sp<android::os::IPullAtomCallback>& pullerCallback) override;
            const shared_ptr<IPullAtomCallback>& pullerCallback) override;

    /**
     * Binder call to register a callback function for a pulled atom.
     */
    virtual Status registerNativePullAtomCallback(int32_t atomTag, int64_t coolDownNs,
            int64_t timeoutNs, const std::vector<int32_t>& additiveFields,
            const sp<android::os::IPullAtomCallback>& pullerCallback) override;
            const shared_ptr<IPullAtomCallback>& pullerCallback) override;

    /**
     * Binder call to unregister any existing callback for the given uid and atom.
@@ -191,9 +193,6 @@ public:
     */
    virtual Status getRegisteredExperimentIds(std::vector<int64_t>* expIdsOut);

    /** IBinder::DeathRecipient */
    virtual void binderDied(const wp<IBinder>& who) override;

private:
    /**
     * Load system properties at init.
@@ -317,13 +316,24 @@ private:
    /**
     * Adds a configuration after checking permissions and obtaining UID from binder call.
     */
    bool addConfigurationChecked(int uid, int64_t key, const vector<uint8_t>& config);
    bool addConfigurationChecked(int uid, int64_t key, const vector<int8_t>& config);

    /**
     * Update a configuration.
     */
    void set_config(int uid, const string& name, const StatsdConfig& config);

    /**
     * Death recipient callback that is called when StatsCompanionService dies.
     * The cookie is a pointer to a StatsService object.
     */
    static void statsCompanionServiceDied(void* cookie);

    /**
     * Implementation of statsCompanionServiceDied.
     */
    void statsCompanionServiceDiedImpl();

    /**
     * Tracks the uid <--> package name mapping.
     */
@@ -367,6 +377,8 @@ private:
    mutable mutex mShellSubscriberMutex;
    std::shared_ptr<LogEventQueue> mEventQueue;

    ScopedAIBinder_DeathRecipient mStatsCompanionServiceDeathRecipient;

    FRIEND_TEST(StatsLogProcessorTest, TestActivationsPersistAcrossSystemServerRestart);
    FRIEND_TEST(StatsServiceTest, TestAddConfig_simple);
    FRIEND_TEST(StatsServiceTest, TestAddConfig_empty);
Loading