// Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. package org.chromium.content.browser; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Debug; import android.util.Log; import org.chromium.base.CommandLine; import org.chromium.content.common.ContentSwitches; /** * Logs Heap stats, such as gc count, alloc count, etc. * It's enabled by CommandLine.ENABLE_TEST_INTENTS, and logs whenever broadcast * intent ACTION_LOG is received, e.g.: * adb shell am broadcast -a com.google.android.apps.chrome.LOG_HEAP_STATS */ public class HeapStatsLogger { private static final String TAG = "HeapStatsLogger"; private static final String ACTION_LOG = "com.google.android.apps.chrome.LOG_HEAP_STATS"; private static HeapStatsLogger sHeapStats; private final HeapStatsLoggerReceiver mBroadcastReceiver; private final HeapStatsLoggerIntentFilter mIntentFilter; public static void init(Context context) { if (CommandLine.getInstance().hasSwitch(ContentSwitches.ENABLE_TEST_INTENTS)) { sHeapStats = new HeapStatsLogger(context); } } private HeapStatsLogger(Context context) { Debug.startAllocCounting(); mBroadcastReceiver = new HeapStatsLoggerReceiver(); mIntentFilter = new HeapStatsLoggerIntentFilter(); context.registerReceiver(mBroadcastReceiver, mIntentFilter); } private static class HeapStatsLoggerIntentFilter extends IntentFilter { HeapStatsLoggerIntentFilter() { addAction(ACTION_LOG); } } private class HeapStatsLoggerReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (ACTION_LOG.equals(intent.getAction())) { log(); } else { Log.e(TAG, "Unexpected intent: " + intent); } } } private void log() { Log.i(TAG, "heap_stats " + // Format is "key=value unit", and it'll be parsed by the test // runner in order to be added to the bot graphs. "gc_count=" + Debug.getGlobalGcInvocationCount() + " times " + "alloc_count=" + Debug.getGlobalAllocCount() + " times " + "alloc_size=" + Debug.getGlobalAllocSize() + " bytes " + "freed_count=" + Debug.getGlobalFreedCount() + " times " + "freed_size=" + Debug.getGlobalFreedSize() + " bytes" ); } }