diff options
| author | 2025-02-12 22:15:59 +0000 | |
|---|---|---|
| committer | 2025-02-13 19:57:08 +0000 | |
| commit | 7e6cea00ef17c9f7e15cddcccd5a07e0350e14be (patch) | |
| tree | a17a846d9c7b940fa6f8451530f3f63dab18221f | |
| parent | babdebb86140a6ee27fb156223a49af51ff49cc7 (diff) | |
Log widget memory stats to statsd
This change adds logging to AppWidgetServiceImpl for the
WIDGET_MEMORY_STATS atom. This atom records the current bitmap memory
usage of widgets held in system server.
Test: statsd_testdrive 10234
Bug: 391574081
Bug: 377356756
Flag: EXEMPT adding metrics
Change-Id: Ie4cd2b547077094c4954281a864f9fe25f2ed2be
| -rw-r--r-- | services/appwidget/Android.bp | 10 | ||||
| -rw-r--r-- | services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java | 41 |
2 files changed, 49 insertions, 2 deletions
diff --git a/services/appwidget/Android.bp b/services/appwidget/Android.bp index 8119073fdf7f..9548afe398b1 100644 --- a/services/appwidget/Android.bp +++ b/services/appwidget/Android.bp @@ -17,6 +17,12 @@ filegroup { java_library_static { name: "services.appwidget", defaults: ["platform_service_defaults"], - srcs: [":services.appwidget-sources"], - libs: ["services.core"], + srcs: [ + ":services.appwidget-sources", + ":statslog-framework-java-gen", + ], + libs: [ + "androidx.annotation_annotation", + "services.core", + ], } diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index d47aab061788..b610313c770b 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -51,6 +51,7 @@ import android.app.IApplicationThread; import android.app.IServiceConnection; import android.app.KeyguardManager; import android.app.PendingIntent; +import android.app.StatsManager; import android.app.admin.DevicePolicyManagerInternal; import android.app.admin.DevicePolicyManagerInternal.OnCrossProfileWidgetProvidersChangeListener; import android.app.usage.Flags; @@ -125,6 +126,7 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; import android.util.SparseLongArray; +import android.util.StatsEvent; import android.util.TypedValue; import android.util.Xml; import android.util.proto.ProtoInputStream; @@ -146,6 +148,7 @@ import com.android.internal.os.BackgroundThread; import com.android.internal.os.SomeArgs; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; +import com.android.internal.util.FrameworkStatsLog; import com.android.internal.widget.IRemoteViewsFactory; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; @@ -434,6 +437,44 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku mActivityManagerInternal = LocalServices.getService(ActivityManagerInternal.class); mAppOpsManagerInternal = LocalServices.getService(AppOpsManagerInternal.class); mUsageStatsManagerInternal = LocalServices.getService(UsageStatsManagerInternal.class); + registerPullCallbacks(); + } + + /** + * Register callbacks for pull atoms. + */ + private void registerPullCallbacks() { + final StatsManager manager = mContext.getSystemService(StatsManager.class); + manager.setPullAtomCallback(FrameworkStatsLog.WIDGET_MEMORY_STATS, + new StatsManager.PullAtomMetadata.Builder().build(), + new HandlerExecutor(mCallbackHandler), this::onPullAtom); + } + + /** + * Callback from StatsManager to log events indicated by the atomTag. This function will add + * the relevant events to the data list. + * + * @return PULL_SUCCESS if the pull was successful and events should be used, else PULL_SKIP. + */ + private int onPullAtom(int atomTag, @NonNull List<StatsEvent> data) { + if (atomTag == FrameworkStatsLog.WIDGET_MEMORY_STATS) { + synchronized (mLock) { + for (Widget widget : mWidgets) { + if (widget.views != null) { + final int uid = widget.provider.id.uid; + final int appWidgetId = widget.appWidgetId; + final long bitmapMemoryUsage = + widget.views.estimateTotalBitmapMemoryUsage(); + StatsEvent event = FrameworkStatsLog.buildStatsEvent( + FrameworkStatsLog.WIDGET_MEMORY_STATS, uid, appWidgetId, + bitmapMemoryUsage); + data.add(event); + } + } + } + return StatsManager.PULL_SUCCESS; + } + return StatsManager.PULL_SKIP; } /** |