Merge "Restrict state event logging" into rvc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
938216c073
@@ -101,6 +101,7 @@ StatsLogProcessor::StatsLogProcessor(const sp<UidMap>& uidMap,
|
|||||||
mLargestTimestampSeen(0),
|
mLargestTimestampSeen(0),
|
||||||
mLastTimestampSeen(0) {
|
mLastTimestampSeen(0) {
|
||||||
mPullerManager->ForceClearPullerCache();
|
mPullerManager->ForceClearPullerCache();
|
||||||
|
StateManager::getInstance().updateLogSources(uidMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
StatsLogProcessor::~StatsLogProcessor() {
|
StatsLogProcessor::~StatsLogProcessor() {
|
||||||
@@ -419,6 +420,9 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event, int64_t elapsedRealtimeNs) {
|
|||||||
// The field numbers need to be currently updated by hand with atoms.proto
|
// The field numbers need to be currently updated by hand with atoms.proto
|
||||||
if (atomId == android::os::statsd::util::ISOLATED_UID_CHANGED) {
|
if (atomId == android::os::statsd::util::ISOLATED_UID_CHANGED) {
|
||||||
onIsolatedUidChangedEventLocked(*event);
|
onIsolatedUidChangedEventLocked(*event);
|
||||||
|
} else {
|
||||||
|
// Map the isolated uid to host uid if necessary.
|
||||||
|
mapIsolatedUidToHostUidIfNecessaryLocked(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
StateManager::getInstance().onLogEvent(*event);
|
StateManager::getInstance().onLogEvent(*event);
|
||||||
@@ -433,12 +437,6 @@ void StatsLogProcessor::OnLogEvent(LogEvent* event, int64_t elapsedRealtimeNs) {
|
|||||||
mLastPullerCacheClearTimeSec = curTimeSec;
|
mLastPullerCacheClearTimeSec = curTimeSec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (atomId != android::os::statsd::util::ISOLATED_UID_CHANGED) {
|
|
||||||
// Map the isolated uid to host uid if necessary.
|
|
||||||
mapIsolatedUidToHostUidIfNecessaryLocked(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
std::unordered_set<int> uidsWithActiveConfigsChanged;
|
std::unordered_set<int> uidsWithActiveConfigsChanged;
|
||||||
std::unordered_map<int, std::vector<int64_t>> activeConfigsPerUid;
|
std::unordered_map<int, std::vector<int64_t>> activeConfigsPerUid;
|
||||||
// pass the event to metrics managers.
|
// pass the event to metrics managers.
|
||||||
@@ -1054,6 +1052,7 @@ void StatsLogProcessor::notifyAppUpgrade(const int64_t& eventTimeNs, const strin
|
|||||||
const int uid, const int64_t version) {
|
const int uid, const int64_t version) {
|
||||||
std::lock_guard<std::mutex> lock(mMetricsMutex);
|
std::lock_guard<std::mutex> lock(mMetricsMutex);
|
||||||
VLOG("Received app upgrade");
|
VLOG("Received app upgrade");
|
||||||
|
StateManager::getInstance().notifyAppChanged(apk, mUidMap);
|
||||||
for (const auto& it : mMetricsManagers) {
|
for (const auto& it : mMetricsManagers) {
|
||||||
it.second->notifyAppUpgrade(eventTimeNs, apk, uid, version);
|
it.second->notifyAppUpgrade(eventTimeNs, apk, uid, version);
|
||||||
}
|
}
|
||||||
@@ -1063,6 +1062,7 @@ void StatsLogProcessor::notifyAppRemoved(const int64_t& eventTimeNs, const strin
|
|||||||
const int uid) {
|
const int uid) {
|
||||||
std::lock_guard<std::mutex> lock(mMetricsMutex);
|
std::lock_guard<std::mutex> lock(mMetricsMutex);
|
||||||
VLOG("Received app removed");
|
VLOG("Received app removed");
|
||||||
|
StateManager::getInstance().notifyAppChanged(apk, mUidMap);
|
||||||
for (const auto& it : mMetricsManagers) {
|
for (const auto& it : mMetricsManagers) {
|
||||||
it.second->notifyAppRemoved(eventTimeNs, apk, uid);
|
it.second->notifyAppRemoved(eventTimeNs, apk, uid);
|
||||||
}
|
}
|
||||||
@@ -1071,6 +1071,7 @@ void StatsLogProcessor::notifyAppRemoved(const int64_t& eventTimeNs, const strin
|
|||||||
void StatsLogProcessor::onUidMapReceived(const int64_t& eventTimeNs) {
|
void StatsLogProcessor::onUidMapReceived(const int64_t& eventTimeNs) {
|
||||||
std::lock_guard<std::mutex> lock(mMetricsMutex);
|
std::lock_guard<std::mutex> lock(mMetricsMutex);
|
||||||
VLOG("Received uid map");
|
VLOG("Received uid map");
|
||||||
|
StateManager::getInstance().updateLogSources(mUidMap);
|
||||||
for (const auto& it : mMetricsManagers) {
|
for (const auto& it : mMetricsManagers) {
|
||||||
it.second->onUidMapReceived(eventTimeNs);
|
it.second->onUidMapReceived(eventTimeNs);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,10 +19,18 @@
|
|||||||
|
|
||||||
#include "StateManager.h"
|
#include "StateManager.h"
|
||||||
|
|
||||||
|
#include <private/android_filesystem_config.h>
|
||||||
|
|
||||||
namespace android {
|
namespace android {
|
||||||
namespace os {
|
namespace os {
|
||||||
namespace statsd {
|
namespace statsd {
|
||||||
|
|
||||||
|
StateManager::StateManager()
|
||||||
|
: mAllowedPkg({
|
||||||
|
"com.android.systemui",
|
||||||
|
}) {
|
||||||
|
}
|
||||||
|
|
||||||
StateManager& StateManager::getInstance() {
|
StateManager& StateManager::getInstance() {
|
||||||
static StateManager sStateManager;
|
static StateManager sStateManager;
|
||||||
return sStateManager;
|
return sStateManager;
|
||||||
@@ -33,8 +41,14 @@ void StateManager::clear() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void StateManager::onLogEvent(const LogEvent& event) {
|
void StateManager::onLogEvent(const LogEvent& event) {
|
||||||
if (mStateTrackers.find(event.GetTagId()) != mStateTrackers.end()) {
|
// Only process state events from uids in AID_* and packages that are whitelisted in
|
||||||
mStateTrackers[event.GetTagId()]->onLogEvent(event);
|
// mAllowedPkg.
|
||||||
|
// Whitelisted AIDs are AID_ROOT and all AIDs in [1000, 2000)
|
||||||
|
if (event.GetUid() == AID_ROOT || (event.GetUid() >= 1000 && event.GetUid() < 2000) ||
|
||||||
|
mAllowedLogSources.find(event.GetUid()) != mAllowedLogSources.end()) {
|
||||||
|
if (mStateTrackers.find(event.GetTagId()) != mStateTrackers.end()) {
|
||||||
|
mStateTrackers[event.GetTagId()]->onLogEvent(event);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +93,20 @@ bool StateManager::getStateValue(const int32_t atomId, const HashableDimensionKe
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void StateManager::updateLogSources(const sp<UidMap>& uidMap) {
|
||||||
|
mAllowedLogSources.clear();
|
||||||
|
for (const auto& pkg : mAllowedPkg) {
|
||||||
|
auto uids = uidMap->getAppUid(pkg);
|
||||||
|
mAllowedLogSources.insert(uids.begin(), uids.end());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void StateManager::notifyAppChanged(const string& apk, const sp<UidMap>& uidMap) {
|
||||||
|
if (mAllowedPkg.find(apk) != mAllowedPkg.end()) {
|
||||||
|
updateLogSources(uidMap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace statsd
|
} // namespace statsd
|
||||||
} // namespace os
|
} // namespace os
|
||||||
} // namespace android
|
} // namespace android
|
||||||
|
|||||||
@@ -18,7 +18,12 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <utils/RefBase.h>
|
#include <utils/RefBase.h>
|
||||||
|
|
||||||
|
#include <set>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "HashableDimensionKey.h"
|
#include "HashableDimensionKey.h"
|
||||||
|
#include "packages/UidMap.h"
|
||||||
#include "state/StateListener.h"
|
#include "state/StateListener.h"
|
||||||
#include "state/StateTracker.h"
|
#include "state/StateTracker.h"
|
||||||
|
|
||||||
@@ -32,7 +37,7 @@ namespace statsd {
|
|||||||
*/
|
*/
|
||||||
class StateManager : public virtual RefBase {
|
class StateManager : public virtual RefBase {
|
||||||
public:
|
public:
|
||||||
StateManager(){};
|
StateManager();
|
||||||
|
|
||||||
~StateManager(){};
|
~StateManager(){};
|
||||||
|
|
||||||
@@ -62,6 +67,11 @@ public:
|
|||||||
bool getStateValue(const int32_t atomId, const HashableDimensionKey& queryKey,
|
bool getStateValue(const int32_t atomId, const HashableDimensionKey& queryKey,
|
||||||
FieldValue* output) const;
|
FieldValue* output) const;
|
||||||
|
|
||||||
|
// Updates mAllowedLogSources with the latest uids for the packages that are allowed to log.
|
||||||
|
void updateLogSources(const sp<UidMap>& uidMap);
|
||||||
|
|
||||||
|
void notifyAppChanged(const string& apk, const sp<UidMap>& uidMap);
|
||||||
|
|
||||||
inline int getStateTrackersCount() const {
|
inline int getStateTrackersCount() const {
|
||||||
return mStateTrackers.size();
|
return mStateTrackers.size();
|
||||||
}
|
}
|
||||||
@@ -79,6 +89,13 @@ private:
|
|||||||
|
|
||||||
// Maps state atom ids to StateTrackers
|
// Maps state atom ids to StateTrackers
|
||||||
std::unordered_map<int32_t, sp<StateTracker>> mStateTrackers;
|
std::unordered_map<int32_t, sp<StateTracker>> mStateTrackers;
|
||||||
|
|
||||||
|
// The package names that can log state events.
|
||||||
|
const std::set<std::string> mAllowedPkg;
|
||||||
|
|
||||||
|
// The combined uid sources (after translating pkg name to uid).
|
||||||
|
// State events from uids that are not in the list will be ignored to avoid state pollution.
|
||||||
|
std::set<int32_t> mAllowedLogSources;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace statsd
|
} // namespace statsd
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "state/StateTracker.h"
|
#include "state/StateTracker.h"
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
#include <private/android_filesystem_config.h>
|
||||||
|
|
||||||
#include "state/StateListener.h"
|
#include "state/StateListener.h"
|
||||||
#include "state/StateManager.h"
|
#include "state/StateManager.h"
|
||||||
@@ -114,6 +115,55 @@ TEST(StateManagerTest, TestStateManagerGetInstance) {
|
|||||||
EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
|
EXPECT_EQ(1, StateManager::getInstance().getStateTrackersCount());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(StateManagerTest, TestOnLogEvent) {
|
||||||
|
sp<MockUidMap> uidMap = makeMockUidMapForPackage("com.android.systemui", {10111});
|
||||||
|
sp<TestStateListener> listener1 = new TestStateListener();
|
||||||
|
StateManager mgr;
|
||||||
|
mgr.updateLogSources(uidMap);
|
||||||
|
// Add StateTracker by registering a listener.
|
||||||
|
mgr.registerListener(util::SCREEN_STATE_CHANGED, listener1);
|
||||||
|
|
||||||
|
// log event using AID_ROOT
|
||||||
|
std::unique_ptr<LogEvent> event = CreateScreenStateChangedEvent(
|
||||||
|
timestampNs, android::view::DisplayStateEnum::DISPLAY_STATE_ON);
|
||||||
|
mgr.onLogEvent(*event);
|
||||||
|
|
||||||
|
// check StateTracker was updated by querying for state
|
||||||
|
HashableDimensionKey queryKey = DEFAULT_DIMENSION_KEY;
|
||||||
|
EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
|
||||||
|
getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey));
|
||||||
|
|
||||||
|
// log event using mocked uid
|
||||||
|
event = CreateScreenStateChangedEvent(
|
||||||
|
timestampNs, android::view::DisplayStateEnum::DISPLAY_STATE_OFF, 10111);
|
||||||
|
mgr.onLogEvent(*event);
|
||||||
|
|
||||||
|
// check StateTracker was updated by querying for state
|
||||||
|
queryKey = DEFAULT_DIMENSION_KEY;
|
||||||
|
EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_OFF,
|
||||||
|
getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey));
|
||||||
|
|
||||||
|
// log event using non-whitelisted uid
|
||||||
|
event = CreateScreenStateChangedEvent(timestampNs,
|
||||||
|
android::view::DisplayStateEnum::DISPLAY_STATE_ON, 10112);
|
||||||
|
mgr.onLogEvent(*event);
|
||||||
|
|
||||||
|
// check StateTracker was NOT updated by querying for state
|
||||||
|
queryKey = DEFAULT_DIMENSION_KEY;
|
||||||
|
EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_OFF,
|
||||||
|
getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey));
|
||||||
|
|
||||||
|
// log event using AID_SYSTEM
|
||||||
|
event = CreateScreenStateChangedEvent(
|
||||||
|
timestampNs, android::view::DisplayStateEnum::DISPLAY_STATE_ON, AID_SYSTEM);
|
||||||
|
mgr.onLogEvent(*event);
|
||||||
|
|
||||||
|
// check StateTracker was updated by querying for state
|
||||||
|
queryKey = DEFAULT_DIMENSION_KEY;
|
||||||
|
EXPECT_EQ(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
|
||||||
|
getStateInt(mgr, util::SCREEN_STATE_CHANGED, queryKey));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test registering listeners to StateTrackers
|
* Test registering listeners to StateTrackers
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -635,8 +635,17 @@ sp<MockUidMap> makeMockUidMapForOneHost(int hostUid, const vector<int>& isolated
|
|||||||
return uidMap;
|
return uidMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
|
sp<MockUidMap> makeMockUidMapForPackage(const string& pkg, const set<int32_t>& uids) {
|
||||||
uint64_t timestampNs, const android::view::DisplayStateEnum state) {
|
sp<MockUidMap> uidMap = new StrictMock<MockUidMap>();
|
||||||
|
EXPECT_CALL(*uidMap, getAppUid(_)).Times(AnyNumber());
|
||||||
|
EXPECT_CALL(*uidMap, getAppUid(pkg)).WillRepeatedly(Return(uids));
|
||||||
|
|
||||||
|
return uidMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(uint64_t timestampNs,
|
||||||
|
const android::view::DisplayStateEnum state,
|
||||||
|
int loggerUid) {
|
||||||
AStatsEvent* statsEvent = AStatsEvent_obtain();
|
AStatsEvent* statsEvent = AStatsEvent_obtain();
|
||||||
AStatsEvent_setAtomId(statsEvent, util::SCREEN_STATE_CHANGED);
|
AStatsEvent_setAtomId(statsEvent, util::SCREEN_STATE_CHANGED);
|
||||||
AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
|
AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
|
||||||
@@ -644,7 +653,7 @@ std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
|
|||||||
AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
|
AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_EXCLUSIVE_STATE, true);
|
||||||
AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false);
|
AStatsEvent_addBoolAnnotation(statsEvent, util::ANNOTATION_ID_STATE_NESTED, false);
|
||||||
|
|
||||||
std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
|
std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(loggerUid, /*pid=*/0);
|
||||||
parseStatsEventToLogEvent(statsEvent, logEvent.get());
|
parseStatsEventToLogEvent(statsEvent, logEvent.get());
|
||||||
return logEvent;
|
return logEvent;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -243,9 +243,12 @@ std::shared_ptr<LogEvent> makeAttributionLogEvent(int atomId, int64_t eventTimeN
|
|||||||
|
|
||||||
sp<MockUidMap> makeMockUidMapForOneHost(int hostUid, const vector<int>& isolatedUids);
|
sp<MockUidMap> makeMockUidMapForOneHost(int hostUid, const vector<int>& isolatedUids);
|
||||||
|
|
||||||
|
sp<MockUidMap> makeMockUidMapForPackage(const string& pkg, const set<int32_t>& uids);
|
||||||
|
|
||||||
// Create log event for screen state changed.
|
// Create log event for screen state changed.
|
||||||
std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
|
std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(uint64_t timestampNs,
|
||||||
uint64_t timestampNs, const android::view::DisplayStateEnum state);
|
const android::view::DisplayStateEnum state,
|
||||||
|
int loggerUid = 0);
|
||||||
|
|
||||||
// Create log event for screen brightness state changed.
|
// Create log event for screen brightness state changed.
|
||||||
std::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(uint64_t timestampNs, int level);
|
std::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(uint64_t timestampNs, int level);
|
||||||
|
|||||||
Reference in New Issue
Block a user