summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Willie Koomson <wvk@google.com> 2025-02-12 22:15:59 +0000
committer Willie Koomson <wvk@google.com> 2025-02-13 19:57:08 +0000
commit7e6cea00ef17c9f7e15cddcccd5a07e0350e14be (patch)
treea17a846d9c7b940fa6f8451530f3f63dab18221f
parentbabdebb86140a6ee27fb156223a49af51ff49cc7 (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.bp10
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java41
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;
}
/**