Support fixed uids in restricted metrics
Bug: 272177720
Ignore-AOSP-First: android u feature
Test: atest statsd_test
Change-Id: I7b0920b7e6e4c203b5938ca7adb6e9ea14dad8b6
diff --git a/statsd/src/StatsLogProcessor.cpp b/statsd/src/StatsLogProcessor.cpp
index 5451a99..139c8f8 100644
--- a/statsd/src/StatsLogProcessor.cpp
+++ b/statsd/src/StatsLogProcessor.cpp
@@ -907,7 +907,13 @@
return;
}
- set<int32_t> configPackageUids = mUidMap->getAppUid(configPackage);
+ set<int32_t> configPackageUids;
+ const auto& uidMapItr = UidMap::sAidToUidMapping.find(configPackage);
+ if (uidMapItr != UidMap::sAidToUidMapping.end()) {
+ configPackageUids.insert(uidMapItr->second);
+ } else {
+ configPackageUids = mUidMap->getAppUid(configPackage);
+ }
set<ConfigKey> keysToQuery =
getRestrictedConfigKeysToQueryLocked(callingUid, configId, configPackageUids, err);
diff --git a/statsd/src/StatsService.cpp b/statsd/src/StatsService.cpp
index ac89c3b..71d5f8a 100644
--- a/statsd/src/StatsService.cpp
+++ b/statsd/src/StatsService.cpp
@@ -166,8 +166,22 @@
},
[this](const ConfigKey& key, const string& delegatePackage,
const vector<int64_t>& restrictedMetrics) {
- set<string> configPackages = mUidMap->getAppNamesFromUid(key.GetUid(), true);
- set<int32_t> delegateUids = mUidMap->getAppUid(delegatePackage);
+ set<string> configPackages;
+ set<int32_t> delegateUids;
+ for (const auto& kv : UidMap::sAidToUidMapping) {
+ if (kv.second == static_cast<uint32_t>(key.GetUid())) {
+ configPackages.insert(kv.first);
+ }
+ if (kv.first == delegatePackage) {
+ delegateUids.insert(kv.second);
+ }
+ }
+ if (configPackages.empty()) {
+ configPackages = mUidMap->getAppNamesFromUid(key.GetUid(), true);
+ }
+ if (delegateUids.empty()) {
+ delegateUids = mUidMap->getAppUid(delegatePackage);
+ }
mConfigManager->SendRestrictedMetricsBroadcast(configPackages, key.GetId(),
delegateUids, restrictedMetrics);
});
diff --git a/statsd/tests/e2e/RestrictedEventMetric_e2e_test.cpp b/statsd/tests/e2e/RestrictedEventMetric_e2e_test.cpp
index 67f53f0..a76875d 100644
--- a/statsd/tests/e2e/RestrictedEventMetric_e2e_test.cpp
+++ b/statsd/tests/e2e/RestrictedEventMetric_e2e_test.cpp
@@ -294,6 +294,34 @@
));
}
+TEST_F(RestrictedEventMetricE2eTest, TestOneEventStaticUid) {
+ ConfigKey key2(2000, configId); // shell uid
+ processor->OnConfigUpdated(configAddedTimeNs + 1 * NS_PER_SEC, key2, config);
+
+ std::vector<std::unique_ptr<LogEvent>> events;
+
+ events.push_back(CreateRestrictedLogEvent(atomTag, configAddedTimeNs + 100));
+
+ // Send log events to StatsLogProcessor.
+ for (auto& event : events) {
+ processor->OnLogEvent(event.get());
+ }
+
+ std::stringstream query;
+ query << "SELECT * FROM metric_" << dbutils::reformatMetricId(restrictedMetricId);
+ processor->querySql(query.str(), /*minSqlClientVersion=*/0,
+ /*policyConfig=*/{}, mockStatsQueryCallback,
+ /*configKey=*/configId, /*configPackage=*/"AID_SHELL",
+ /*callingUid=*/delegate_uid);
+
+ EXPECT_EQ(rowCountResult, 1);
+ EXPECT_THAT(queryDataResult, ElementsAre(to_string(atomTag), to_string(configAddedTimeNs + 100),
+ _, // wallClockNs
+ _ // field_1
+ ));
+ dbutils::deleteDb(key2);
+}
+
TEST_F(RestrictedEventMetricE2eTest, TestTooManyConfigsAmbiguousQuery) {
ConfigKey key2(config_app_uid + 1, configId);
processor->OnConfigUpdated(configAddedTimeNs + 1 * NS_PER_SEC, key2, config);
@@ -324,6 +352,7 @@
/*callingUid=*/delegate_uid);
EXPECT_EQ(error, "Ambiguous ConfigKey");
+ dbutils::deleteDb(key2);
}
TEST_F(RestrictedEventMetricE2eTest, TestUnknownConfigPackage) {