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) {