/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.util; import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; /** *

Various utilities for debugging and logging.

*/ public class DebugUtils { /** @hide */ public DebugUtils() {} /** *

Filters objects against the ANDROID_OBJECT_FILTER * environment variable. This environment variable can filter objects * based on their class name and attribute values.

* *

Here is the syntax for ANDROID_OBJECT_FILTER:

* *

ClassName@attribute1=value1@attribute2=value2...

* *

Examples:

* * *

The class name and the values are regular expressions.

* *

This class is useful for debugging and logging purpose:

*
     * if (DEBUG) {
     *   if (DebugUtils.isObjectSelected(childView) && LOGV_ENABLED) {
     *     Log.v(TAG, "Object " + childView + " logged!");
     *   }
     * }
     * 
* *

NOTE: This method is very expensive as it relies * heavily on regular expressions and reflection. Calls to this method * should always be stripped out of the release binaries and avoided * as much as possible in debug mode.

* * @param object any object to match against the ANDROID_OBJECT_FILTER * environement variable * @return true if object is selected by the ANDROID_OBJECT_FILTER * environment variable, false otherwise */ public static boolean isObjectSelected(Object object) { boolean match = false; String s = System.getenv("ANDROID_OBJECT_FILTER"); if (s != null && s.length() > 0) { String[] selectors = s.split("@"); // first selector == class name if (object.getClass().getSimpleName().matches(selectors[0])) { // check potential attributes for (int i = 1; i < selectors.length; i++) { String[] pair = selectors[i].split("="); Class klass = object.getClass(); try { Method declaredMethod = null; Class parent = klass; do { declaredMethod = parent.getDeclaredMethod("get" + pair[0].substring(0, 1).toUpperCase() + pair[0].substring(1), (Class[]) null); } while ((parent = klass.getSuperclass()) != null && declaredMethod == null); if (declaredMethod != null) { Object value = declaredMethod .invoke(object, (Object[])null); match |= (value != null ? value.toString() : "null").matches(pair[1]); } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } } } return match; } /** @hide */ public static void buildShortClassTag(Object cls, StringBuilder out) { if (cls == null) { out.append("null"); } else { String simpleName = cls.getClass().getSimpleName(); if (simpleName == null || simpleName.isEmpty()) { simpleName = cls.getClass().getName(); int end = simpleName.lastIndexOf('.'); if (end > 0) { simpleName = simpleName.substring(end+1); } } out.append(simpleName); out.append('{'); out.append(Integer.toHexString(System.identityHashCode(cls))); } } }