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

Commit 89e6ebaf authored by Mingguang Xu's avatar Mingguang Xu
Browse files

btaa: gd: Add wakeup reason dumpsys data

Create a circular buffer for wakeup history and plumb wakeup history to
dumpsys.

Tag: #feature

Bug: 185037337
Bug: 170315554

Test: mmma -j system/bt
Test: manual

BYPASS_LONG_LINES_REASON: consist with gd format

Change-Id: I468ac585ed0cd3415176b5d9a373e9332efe4d99
parent 277d796e
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -575,6 +575,7 @@ genrule {
    ],
    cmd: "$(location flatc) -I packages/modules/Bluetooth/system/gd -b --schema -o $(genDir) $(in) ",
    srcs: [
        "btaa/activity_attribution.fbs",
        "common/init_flags.fbs",
        "dumpsys_data.fbs",
        "hci/hci_acl_manager.fbs",
@@ -582,6 +583,7 @@ genrule {
        "shim/dumpsys.fbs",
    ],
    out: [
        "activity_attribution.bfbs",
        "init_flags.bfbs",
        "dumpsys.bfbs",
        "dumpsys_data.bfbs",
@@ -597,6 +599,7 @@ genrule {
    ],
    cmd: "$(location flatc) -I packages/modules/Bluetooth/system/gd -o $(genDir) --cpp $(in) ",
    srcs: [
        "btaa/activity_attribution.fbs",
        "common/init_flags.fbs",
        "dumpsys_data.fbs",
        "hci/hci_acl_manager.fbs",
@@ -604,6 +607,7 @@ genrule {
        "shim/dumpsys.fbs",
    ],
    out: [
        "activity_attribution_generated.h",
        "dumpsys_data_generated.h",
        "dumpsys_generated.h",
        "hci_acl_manager_generated.h",
+36 −0
Original line number Diff line number Diff line
namespace bluetooth.activity_attribution;

attribute "privacy";

table WakeupEntry {
    wakeup_time:string;
    activity:string;
    address:string;
}

table WakeupAttributionData {
    title:string;
    num_wakeup:int;
    wakeup_attribution:[WakeupEntry];
}

table DeviceActivityAggregationEntry {
    address:string;
    activity:string;
    wakeup_count:int;
    byte_count:int;
    wakelock_duration:int;
}

table DeviceActivityAggregationData {
    title:string;
    device_activity_aggregation:[DeviceActivityAggregationEntry];
}

table ActivityAttributionData {
    title:string (privacy:"Any");
    wakeup_attribution_data:WakeupAttributionData (privacy:"Any");
    device_activity_aggregation_data:DeviceActivityAggregationData (privacy:"Any");
}

root_type ActivityAttributionData;
 No newline at end of file
+2 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ namespace bluetooth {
namespace activity_attribution {

enum class Activity : uint8_t { UNKNOWN = 0, ADVERTISE, CONNECT, CONTROL, SCAN, HFP, VENDOR };
#define CONVERT_ACTIVITY_TO_STR(Activity) std::string(#Activity)

struct BtaaAggregationEntry {
  hci::Address address;
@@ -62,6 +63,7 @@ class ActivityAttribution : public bluetooth::Module {
  void ListDependencies(ModuleList* list) override;
  void Start() override;
  void Stop() override;
  DumpsysDataFinisher GetDumpsysData(flatbuffers::FlatBufferBuilder* builder) const override;  // Module

 private:
  struct impl;
+20 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
#define LOG_TAG "btaa"

#include "btaa/activity_attribution.h"
#include "activity_attribution_generated.h"

#include <aidl/android/system/suspend/BnSuspendCallback.h>
#include <aidl/android/system/suspend/BnWakelockCallback.h>
@@ -126,6 +127,11 @@ struct ActivityAttribution::impl {
    callback_ = callback;
  }

  void Dump(
      std::promise<flatbuffers::Offset<ActivityAttributionData>> promise, flatbuffers::FlatBufferBuilder* fb_builder) {
    attribution_processor_.Dump(std::move(promise), fb_builder);
  }

  ActivityAttributionCallback* callback_;
  AttributionProcessor attribution_processor_;
  HciProcessor hci_processor_;
@@ -186,5 +192,19 @@ void ActivityAttribution::Stop() {
  pimpl_.reset();
}

DumpsysDataFinisher ActivityAttribution::GetDumpsysData(flatbuffers::FlatBufferBuilder* fb_builder) const {
  ASSERT(fb_builder != nullptr);

  std::promise<flatbuffers::Offset<ActivityAttributionData>> promise;
  auto future = promise.get_future();
  pimpl_->Dump(std::move(promise), fb_builder);

  auto dumpsys_data = future.get();

  return [dumpsys_data](DumpsysDataBuilder* dumpsys_builder) {
    dumpsys_builder->add_activity_attribution_dumpsys_data(dumpsys_data);
  };
}

}  // namespace activity_attribution
}  // namespace bluetooth
+13 −0
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@
namespace bluetooth {
namespace activity_attribution {

static constexpr size_t kWakeupAggregatorSize = 200;

struct AddressActivityKey {
  hci::Address address;
  Activity activity;
@@ -41,16 +43,27 @@ struct AddressActivityKeyHasher {
  }
};

struct WakeupDescriptor {
  Activity activity_;
  const hci::Address address_;
  WakeupDescriptor(Activity activity, const hci::Address address) : activity_(activity), address_(address) {}
  virtual ~WakeupDescriptor() {}
};

class AttributionProcessor {
 public:
  void OnBtaaPackets(std::vector<BtaaHciPacket> btaa_packets);
  void OnWakelockReleased(uint32_t duration_ms);
  void OnWakeup();
  void Dump(
      std::promise<flatbuffers::Offset<ActivityAttributionData>> promise, flatbuffers::FlatBufferBuilder* fb_builder);

 private:
  bool wakeup_ = false;
  std::unordered_map<AddressActivityKey, BtaaAggregationEntry, AddressActivityKeyHasher> btaa_aggregator_;
  std::unordered_map<AddressActivityKey, BtaaAggregationEntry, AddressActivityKeyHasher> wakelock_duration_aggregator_;
  common::TimestampedCircularBuffer<WakeupDescriptor> wakeup_aggregator_ =
      common::TimestampedCircularBuffer<WakeupDescriptor>(kWakeupAggregatorSize);
};

}  // namespace activity_attribution
Loading