Loading cmds/bootanimation/BootAnimation.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip"; static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimation-dark.zip"; static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootanimation.zip"; static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip"; static const char APEX_BOOTANIMATION_FILE[] = "/apex/com.android.bootanimation/etc/bootanimation.zip"; static const char PRODUCT_ENCRYPTED_BOOTANIMATION_FILE[] = "/product/media/bootanimation-encrypted.zip"; static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip"; static const char OEM_SHUTDOWNANIMATION_FILE[] = "/oem/media/shutdownanimation.zip"; Loading Loading @@ -358,10 +359,10 @@ void BootAnimation::findBootAnimationFile() { const bool playDarkAnim = android::base::GetIntProperty("ro.boot.theme", 0) == 1; static const char* bootFiles[] = {playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE, {APEX_BOOTANIMATION_FILE, playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE, OEM_BOOTANIMATION_FILE, SYSTEM_BOOTANIMATION_FILE}; static const char* shutdownFiles[] = {PRODUCT_SHUTDOWNANIMATION_FILE, OEM_SHUTDOWNANIMATION_FILE, SYSTEM_SHUTDOWNANIMATION_FILE}; {PRODUCT_SHUTDOWNANIMATION_FILE, OEM_SHUTDOWNANIMATION_FILE, SYSTEM_SHUTDOWNANIMATION_FILE, ""}; for (const char* f : (!mShuttingDown ? bootFiles : shutdownFiles)) { if (access(f, R_OK) == 0) { Loading cmds/statsd/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -263,6 +263,7 @@ cc_test { "tests/e2e/Anomaly_duration_sum_e2e_test.cpp", "tests/e2e/ConfigTtl_e2e_test.cpp", "tests/e2e/PartialBucket_e2e_test.cpp", "tests/e2e/DurationMetric_e2e_test.cpp", "tests/shell/ShellSubscriber_test.cpp", ], Loading cmds/statsd/src/StatsLogProcessor.h +7 −0 Original line number Diff line number Diff line Loading @@ -273,6 +273,13 @@ private: FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations); FRIEND_TEST(DurationMetricE2eTest, TestOneBucket); FRIEND_TEST(DurationMetricE2eTest, TestTwoBuckets); FRIEND_TEST(DurationMetricE2eTest, TestWithActivation); FRIEND_TEST(DurationMetricE2eTest, TestWithCondition); FRIEND_TEST(DurationMetricE2eTest, TestWithSlicedCondition); FRIEND_TEST(DurationMetricE2eTest, TestWithActivationAndSlicedCondition); }; } // namespace statsd Loading cmds/statsd/src/atoms.proto +59 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import "frameworks/base/core/proto/android/stats/docsui/docsui_enums.proto"; import "frameworks/base/core/proto/android/stats/enums.proto"; import "frameworks/base/core/proto/android/stats/intelligence/enums.proto"; import "frameworks/base/core/proto/android/stats/launcher/launcher.proto"; import "frameworks/base/core/proto/android/stats/location/location_enums.proto"; import "frameworks/base/core/proto/android/stats/mediametrics/mediametrics.proto"; import "frameworks/base/core/proto/android/stats/storage/storage_enums.proto"; import "frameworks/base/core/proto/android/stats/style/style_enums.proto"; Loading Loading @@ -301,6 +302,7 @@ message Atom { ContentCaptureServiceEvents content_capture_service_events = 207; ContentCaptureSessionEvents content_capture_session_events = 208; ContentCaptureFlushed content_capture_flushed = 209; LocationManagerApiUsageReported location_manager_api_usage_reported = 210; } // Pulled events will start at field 10000. Loading Loading @@ -6485,3 +6487,60 @@ message AppOps { // while the app was in the background (only for trusted requests) optional int64 trusted_background_duration_millis = 9; } /** * Location Manager API Usage information(e.g. API under usage, * API call's parameters). * Logged from: * frameworks/base/services/core/java/com/android/server/LocationManagerService.java */ message LocationManagerApiUsageReported { // Indicating if usage starts or usage ends. optional android.stats.location.UsageState state = 1; // LocationManagerService's API in use. // We can identify which API from LocationManager is // invoking current LMS API by the combination of // API parameter(e.g. is_listener_null, is_intent_null, // is_location_request_null) optional android.stats.location.LocationManagerServiceApi api_in_use = 2; // Name of the package calling the API. optional string calling_package_name = 3; // Type of the location provider. optional android.stats.location.ProviderType provider = 4; // Quality of the location request optional android.stats.location.LocationRequestQuality quality = 5; // The desired interval for active location updates, in milliseconds. // Bucketized to reduce cardinality. optional android.stats.location.LocationRequestIntervalBucket bucketized_interval = 6; // Minimum distance between location updates, in meters. // Bucketized to reduce cardinality. optional android.stats.location.SmallestDisplacementBucket bucketized_smallest_displacement = 7; // The number of location updates. optional int64 num_updates = 8; // The request expiration time, in millisecond since boot. // Bucketized to reduce cardinality. optional android.stats.location.ExpirationBucket bucketized_expire_in = 9; // Type of Callback passed in for this API. optional android.stats.location.CallbackType callback_type = 10; // The radius of the central point of the alert // region, in meters. Only for API REQUEST_GEOFENCE. // Bucketized to reduce cardinality. optional android.stats.location.GeofenceRadiusBucket bucketized_radius = 11; // Activity Importance of API caller. // Categorized to 3 types that are interesting from location's perspective. optional android.stats.location.ActivityImportance activiy_importance = 12; } cmds/statsd/src/metrics/DurationMetricProducer.cpp +67 −19 Original line number Diff line number Diff line Loading @@ -338,32 +338,25 @@ void DurationMetricProducer::onSlicedConditionMayChangeLocked_opt2(bool conditio } } void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) { VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId); flushIfNeededLocked(eventTime); if (!mConditionSliced) { return; } void DurationMetricProducer::onSlicedConditionMayChangeInternalLocked(bool overallCondition, const int64_t eventTimeNs) { bool changeDimTrackable = mWizard->IsChangedDimensionTrackable(mConditionTrackerIndex); if (changeDimTrackable && mHasLinksToAllConditionDimensionsInTracker && mDimensionsInCondition.empty()) { onSlicedConditionMayChangeLocked_opt1(overallCondition, eventTime); onSlicedConditionMayChangeLocked_opt1(overallCondition, eventTimeNs); return; } if (changeDimTrackable && mSameConditionDimensionsInTracker && mMetric2ConditionLinks.size() <= 1) { onSlicedConditionMayChangeLocked_opt2(overallCondition, eventTime); onSlicedConditionMayChangeLocked_opt2(overallCondition, eventTimeNs); return; } // Now for each of the on-going event, check if the condition has changed for them. for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { for (auto& pair : whatIt.second) { pair.second->onSlicedConditionMayChange(overallCondition, eventTime); pair.second->onSlicedConditionMayChange(overallCondition, eventTimeNs); } } Loading @@ -389,10 +382,10 @@ void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondit continue; } unique_ptr<DurationTracker> newTracker = whatIt.second.begin()->second->clone(eventTime); whatIt.second.begin()->second->clone(eventTimeNs); if (newTracker != nullptr) { newTracker->setEventKey(MetricDimensionKey(newEventKey)); newTracker->onSlicedConditionMayChange(overallCondition, eventTime); newTracker->onSlicedConditionMayChange(overallCondition, eventTimeNs); whatIt.second[conditionDimension] = std::move(newTracker); } } Loading @@ -418,10 +411,10 @@ void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondit if (hitGuardRailLocked(newEventKey)) { continue; } auto newTracker = whatIt.second.begin()->second->clone(eventTime); auto newTracker = whatIt.second.begin()->second->clone(eventTimeNs); if (newTracker != nullptr) { newTracker->setEventKey(newEventKey); newTracker->onSlicedConditionMayChange(overallCondition, eventTime); newTracker->onSlicedConditionMayChange(overallCondition, eventTimeNs); whatIt.second[conditionDimension] = std::move(newTracker); } } Loading @@ -430,10 +423,61 @@ void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondit } } void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) { VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId); if (!mIsActive) { return; } flushIfNeededLocked(eventTime); if (!mConditionSliced) { return; } onSlicedConditionMayChangeInternalLocked(overallCondition, eventTime); } void DurationMetricProducer::onActiveStateChangedLocked(const int64_t& eventTimeNs) { MetricProducer::onActiveStateChangedLocked(eventTimeNs); if (!mConditionSliced) { if (ConditionState::kTrue != mCondition) { return; } if (mIsActive) { flushIfNeededLocked(eventTimeNs); } for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { for (auto& pair : whatIt.second) { pair.second->onConditionChanged(mIsActive, eventTimeNs); } } } else if (mIsActive) { flushIfNeededLocked(eventTimeNs); onSlicedConditionMayChangeInternalLocked(mIsActive, eventTimeNs); } else { // mConditionSliced == true && !mIsActive for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { for (auto& pair : whatIt.second) { pair.second->onConditionChanged(mIsActive, eventTimeNs); } } } } void DurationMetricProducer::onConditionChangedLocked(const bool conditionMet, const int64_t eventTime) { VLOG("Metric %lld onConditionChanged", (long long)mMetricId); mCondition = conditionMet ? ConditionState::kTrue : ConditionState::kFalse; if (!mIsActive) { return; } flushIfNeededLocked(eventTime); for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { for (auto& pair : whatIt.second) { Loading Loading @@ -696,7 +740,9 @@ void DurationMetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, return; } if (mIsActive) { flushIfNeededLocked(event.GetElapsedTimestampNs()); } // Handles Stopall events. if (matcherIndex == mStopAllIndex) { Loading Loading @@ -767,6 +813,8 @@ void DurationMetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, } } condition = condition && mIsActive; if (dimensionKeysInCondition.empty()) { handleStartEvent(MetricDimensionKey(dimensionInWhat, DEFAULT_DIMENSION_KEY), conditionKey, condition, event); Loading Loading
cmds/bootanimation/BootAnimation.cpp +3 −2 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ static const char OEM_BOOTANIMATION_FILE[] = "/oem/media/bootanimation.zip"; static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimation-dark.zip"; static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootanimation.zip"; static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip"; static const char APEX_BOOTANIMATION_FILE[] = "/apex/com.android.bootanimation/etc/bootanimation.zip"; static const char PRODUCT_ENCRYPTED_BOOTANIMATION_FILE[] = "/product/media/bootanimation-encrypted.zip"; static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip"; static const char OEM_SHUTDOWNANIMATION_FILE[] = "/oem/media/shutdownanimation.zip"; Loading Loading @@ -358,10 +359,10 @@ void BootAnimation::findBootAnimationFile() { const bool playDarkAnim = android::base::GetIntProperty("ro.boot.theme", 0) == 1; static const char* bootFiles[] = {playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE, {APEX_BOOTANIMATION_FILE, playDarkAnim ? PRODUCT_BOOTANIMATION_DARK_FILE : PRODUCT_BOOTANIMATION_FILE, OEM_BOOTANIMATION_FILE, SYSTEM_BOOTANIMATION_FILE}; static const char* shutdownFiles[] = {PRODUCT_SHUTDOWNANIMATION_FILE, OEM_SHUTDOWNANIMATION_FILE, SYSTEM_SHUTDOWNANIMATION_FILE}; {PRODUCT_SHUTDOWNANIMATION_FILE, OEM_SHUTDOWNANIMATION_FILE, SYSTEM_SHUTDOWNANIMATION_FILE, ""}; for (const char* f : (!mShuttingDown ? bootFiles : shutdownFiles)) { if (access(f, R_OK) == 0) { Loading
cmds/statsd/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -263,6 +263,7 @@ cc_test { "tests/e2e/Anomaly_duration_sum_e2e_test.cpp", "tests/e2e/ConfigTtl_e2e_test.cpp", "tests/e2e/PartialBucket_e2e_test.cpp", "tests/e2e/DurationMetric_e2e_test.cpp", "tests/shell/ShellSubscriber_test.cpp", ], Loading
cmds/statsd/src/StatsLogProcessor.h +7 −0 Original line number Diff line number Diff line Loading @@ -273,6 +273,13 @@ private: FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations); FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations); FRIEND_TEST(DurationMetricE2eTest, TestOneBucket); FRIEND_TEST(DurationMetricE2eTest, TestTwoBuckets); FRIEND_TEST(DurationMetricE2eTest, TestWithActivation); FRIEND_TEST(DurationMetricE2eTest, TestWithCondition); FRIEND_TEST(DurationMetricE2eTest, TestWithSlicedCondition); FRIEND_TEST(DurationMetricE2eTest, TestWithActivationAndSlicedCondition); }; } // namespace statsd Loading
cmds/statsd/src/atoms.proto +59 −0 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import "frameworks/base/core/proto/android/stats/docsui/docsui_enums.proto"; import "frameworks/base/core/proto/android/stats/enums.proto"; import "frameworks/base/core/proto/android/stats/intelligence/enums.proto"; import "frameworks/base/core/proto/android/stats/launcher/launcher.proto"; import "frameworks/base/core/proto/android/stats/location/location_enums.proto"; import "frameworks/base/core/proto/android/stats/mediametrics/mediametrics.proto"; import "frameworks/base/core/proto/android/stats/storage/storage_enums.proto"; import "frameworks/base/core/proto/android/stats/style/style_enums.proto"; Loading Loading @@ -301,6 +302,7 @@ message Atom { ContentCaptureServiceEvents content_capture_service_events = 207; ContentCaptureSessionEvents content_capture_session_events = 208; ContentCaptureFlushed content_capture_flushed = 209; LocationManagerApiUsageReported location_manager_api_usage_reported = 210; } // Pulled events will start at field 10000. Loading Loading @@ -6485,3 +6487,60 @@ message AppOps { // while the app was in the background (only for trusted requests) optional int64 trusted_background_duration_millis = 9; } /** * Location Manager API Usage information(e.g. API under usage, * API call's parameters). * Logged from: * frameworks/base/services/core/java/com/android/server/LocationManagerService.java */ message LocationManagerApiUsageReported { // Indicating if usage starts or usage ends. optional android.stats.location.UsageState state = 1; // LocationManagerService's API in use. // We can identify which API from LocationManager is // invoking current LMS API by the combination of // API parameter(e.g. is_listener_null, is_intent_null, // is_location_request_null) optional android.stats.location.LocationManagerServiceApi api_in_use = 2; // Name of the package calling the API. optional string calling_package_name = 3; // Type of the location provider. optional android.stats.location.ProviderType provider = 4; // Quality of the location request optional android.stats.location.LocationRequestQuality quality = 5; // The desired interval for active location updates, in milliseconds. // Bucketized to reduce cardinality. optional android.stats.location.LocationRequestIntervalBucket bucketized_interval = 6; // Minimum distance between location updates, in meters. // Bucketized to reduce cardinality. optional android.stats.location.SmallestDisplacementBucket bucketized_smallest_displacement = 7; // The number of location updates. optional int64 num_updates = 8; // The request expiration time, in millisecond since boot. // Bucketized to reduce cardinality. optional android.stats.location.ExpirationBucket bucketized_expire_in = 9; // Type of Callback passed in for this API. optional android.stats.location.CallbackType callback_type = 10; // The radius of the central point of the alert // region, in meters. Only for API REQUEST_GEOFENCE. // Bucketized to reduce cardinality. optional android.stats.location.GeofenceRadiusBucket bucketized_radius = 11; // Activity Importance of API caller. // Categorized to 3 types that are interesting from location's perspective. optional android.stats.location.ActivityImportance activiy_importance = 12; }
cmds/statsd/src/metrics/DurationMetricProducer.cpp +67 −19 Original line number Diff line number Diff line Loading @@ -338,32 +338,25 @@ void DurationMetricProducer::onSlicedConditionMayChangeLocked_opt2(bool conditio } } void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) { VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId); flushIfNeededLocked(eventTime); if (!mConditionSliced) { return; } void DurationMetricProducer::onSlicedConditionMayChangeInternalLocked(bool overallCondition, const int64_t eventTimeNs) { bool changeDimTrackable = mWizard->IsChangedDimensionTrackable(mConditionTrackerIndex); if (changeDimTrackable && mHasLinksToAllConditionDimensionsInTracker && mDimensionsInCondition.empty()) { onSlicedConditionMayChangeLocked_opt1(overallCondition, eventTime); onSlicedConditionMayChangeLocked_opt1(overallCondition, eventTimeNs); return; } if (changeDimTrackable && mSameConditionDimensionsInTracker && mMetric2ConditionLinks.size() <= 1) { onSlicedConditionMayChangeLocked_opt2(overallCondition, eventTime); onSlicedConditionMayChangeLocked_opt2(overallCondition, eventTimeNs); return; } // Now for each of the on-going event, check if the condition has changed for them. for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { for (auto& pair : whatIt.second) { pair.second->onSlicedConditionMayChange(overallCondition, eventTime); pair.second->onSlicedConditionMayChange(overallCondition, eventTimeNs); } } Loading @@ -389,10 +382,10 @@ void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondit continue; } unique_ptr<DurationTracker> newTracker = whatIt.second.begin()->second->clone(eventTime); whatIt.second.begin()->second->clone(eventTimeNs); if (newTracker != nullptr) { newTracker->setEventKey(MetricDimensionKey(newEventKey)); newTracker->onSlicedConditionMayChange(overallCondition, eventTime); newTracker->onSlicedConditionMayChange(overallCondition, eventTimeNs); whatIt.second[conditionDimension] = std::move(newTracker); } } Loading @@ -418,10 +411,10 @@ void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondit if (hitGuardRailLocked(newEventKey)) { continue; } auto newTracker = whatIt.second.begin()->second->clone(eventTime); auto newTracker = whatIt.second.begin()->second->clone(eventTimeNs); if (newTracker != nullptr) { newTracker->setEventKey(newEventKey); newTracker->onSlicedConditionMayChange(overallCondition, eventTime); newTracker->onSlicedConditionMayChange(overallCondition, eventTimeNs); whatIt.second[conditionDimension] = std::move(newTracker); } } Loading @@ -430,10 +423,61 @@ void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondit } } void DurationMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) { VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId); if (!mIsActive) { return; } flushIfNeededLocked(eventTime); if (!mConditionSliced) { return; } onSlicedConditionMayChangeInternalLocked(overallCondition, eventTime); } void DurationMetricProducer::onActiveStateChangedLocked(const int64_t& eventTimeNs) { MetricProducer::onActiveStateChangedLocked(eventTimeNs); if (!mConditionSliced) { if (ConditionState::kTrue != mCondition) { return; } if (mIsActive) { flushIfNeededLocked(eventTimeNs); } for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { for (auto& pair : whatIt.second) { pair.second->onConditionChanged(mIsActive, eventTimeNs); } } } else if (mIsActive) { flushIfNeededLocked(eventTimeNs); onSlicedConditionMayChangeInternalLocked(mIsActive, eventTimeNs); } else { // mConditionSliced == true && !mIsActive for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { for (auto& pair : whatIt.second) { pair.second->onConditionChanged(mIsActive, eventTimeNs); } } } } void DurationMetricProducer::onConditionChangedLocked(const bool conditionMet, const int64_t eventTime) { VLOG("Metric %lld onConditionChanged", (long long)mMetricId); mCondition = conditionMet ? ConditionState::kTrue : ConditionState::kFalse; if (!mIsActive) { return; } flushIfNeededLocked(eventTime); for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { for (auto& pair : whatIt.second) { Loading Loading @@ -696,7 +740,9 @@ void DurationMetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, return; } if (mIsActive) { flushIfNeededLocked(event.GetElapsedTimestampNs()); } // Handles Stopall events. if (matcherIndex == mStopAllIndex) { Loading Loading @@ -767,6 +813,8 @@ void DurationMetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, } } condition = condition && mIsActive; if (dimensionKeysInCondition.empty()) { handleStartEvent(MetricDimensionKey(dimensionInWhat, DEFAULT_DIMENSION_KEY), conditionKey, condition, event); Loading