monitoreo Android UI Caton

I. Antecedentes

Use aplicaciones de fluidez, es una medida importante de la experiencia del usuario. Debido a configuraciones de modelo Android y diferentes sistemas, escenas de la complejidad del proyecto de la aplicación rica, las personas involucradas en el código historial de iteraciones más largo, puede haber una gran cantidad de hilo de código de interfaz de usuario de operación que consume tiempo, el tiempo de prueba real de vez en cuando se encontró que algunos escenarios de negocios se producen tarjeta fenómeno de Dayton, retroalimentación de los usuarios y las quejas se encuentran a menudo en el uso de aplicaciones Caton. Por lo tanto, nos preocupa cada vez más sobre el problema y mejorar la experiencia del usuario fluidez.

En segundo lugar, el programa

En base a este punto de dolor, queremos usar un mecanismo de detección efectiva, capaz de cubrir escenarios Caton que puedan surgir, una vez que se produjo Caton, nos puede ayudar a localizar más fácilmente consumiendo ocurrió Caton hora local, el registro específico y la información de la pila, en la medida en el código directamente de los desarrolladores para localizar un problema Caton. sistema de monitoreo de Android Caton prevemos la necesidad de alcanzar varias funciones básicas:

  • Cómo supervisar efectivamente la aplicación se producen Caton, mientras que en el caso de la tarjeta inmediatamente los registros estatales de aplicaciones correctas, tales como información de la pila, uso de CPU, uso de memoria, uso de IO, y así sucesivamente;

  • Caton información estadística que se informa a la plataforma de monitorización, necesidad de lidiar con el análisis del contenido del informe clasificado, sencilla y intuitiva plataforma para mostrar a través de la Web, para el desarrollo de un tratamiento de seguimiento.

En tercer lugar, la manera de supervisar Caton desde el nivel de aplicación?

Nuestra idea es generalmente el hilo principal interfaz de usuario mucho dibujar un gran número de operaciones de IO, o un gran número de operaciones de computación de la CPU ocupada, lo que resulta en la aplicación de interfaz Caton. Mientras que podemos en el caso de Caton, a los recursos de captura y sistemas de información de la pila de la información principal uso del hilo, se puede analizar con precisión la función de lo que sucedió Caton, el consumo de recursos. La pregunta entonces es cómo detectar con eficacia hilo principal de Android se produjo Caton, dos industria de aplicación popular y eficaz vigilancia de la siguiente manera:

  • Usando el hilo de interfaz de usuario ingrese Looper coincidencia de impresión;

  • 使用 Choreographer.FrameCallback.

3,1, que coincide con el registro mediante el hilo de interfaz de usuario del áncora de impresión para determinar si Caton

actualizaciones de Android UI hilo principal. Si la interfaz es menos de 1 segundo de refresco de 60 veces, es decir, menos de 60 FPS, se tiene la sensación de Caton. En términos simples, mecanismo de mensajería Android utilizar las actualizaciones de la interfaz de usuario, hilo de interfaz de usuario no Looper, continuará para eliminar el mensaje en su método de bucle, encuadernaciones Handler llama a su puesta en práctica del hilo de interfaz de usuario. Si hay tiempo método de operación del controlador de dispatchMesaage, ocurre Caton.

3.1.1, Looper.loop () el código fuente

public static void loop() {
    final Looper me = myLooper();
    if (me == null) { 
        throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
    }
    final MessageQueue queue = me.mQueue;
    // Make sure the identity of this thread is that of the local process,
    // and keep track of what that identity token actually is.
    Binder.clearCallingIdentity();
    final long ident = Binder.clearCallingIdentity();    
    for (;;) {
            Message msg = queue.next(); 
            // might block
            if (msg == null) {
            // No message indicates that the message queue is quitting.
                return;
            }
            // This must be in a local variable, in case a UI event sets the logger
            Printer logging = me.mLogging;        
            if (logging != null) {
                logging.println(">>>>> Dispatching to " + msg.target + " " +
                msg.callback + ": " + msg.what);
            }

            msg.target.dispatchMessage(msg);        
            if (logging != null) {
                logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
            }        
            // Make sure that during the course of dispatching the
            // identity of the thread wasn't corrupted.
            final long newIdent = Binder.clearCallingIdentity();        
            if (ident != newIdent) {
                Log.wtf(TAG, "Thread identity changed from 0x"
                    + Long.toHexString(ident) + " to 0x"
                    + Long.toHexString(newIdent) + " while dispatching to "
                    + msg.target.getClass().getName() + " "
                    + msg.callback + " what=" + msg.what);
            }

            msg.recycleUnchecked();
     }
}

Mientras el tiempo de ejecución línea de detección 25 msg.target.dispatchMessage (msg), ser capaz de detectar si la porción de rosca interfaz de usuario tiene una operación que consume tiempo. Toma nota de que esta línea de código antes y después de la ejecución, hay dos funciones logging.println, si se configura el registro, se imprimirá ">>>>> Despacho a" y "<<<<< Terminado a" registro tal, respectivamente, por lo podemos pasar a la diferencia de tiempo entre los dos registro para calcular el tiempo de ejecución DispatchMessage, estableciendo así un umbral para determinar si ha habido Caton.
Aquí Insertar imagen Descripción

3.1.2 Cómo establecer el registro es?

Nos fijamos en la línea 19, el código fuente está me.mLogging

public final class Looper {  
    private Printer mLogging;  
    public void setMessageLogging(@Nullable Printer printer) {  
        mLogging = printer;  
    }  
}  

public interface Printer {  
    void println(String x);  
}

mLogging de looper es privada, y proporciona setMessageLogging método (@Nullable impresora Impresora), por lo que podemos lograr una impresora propia, a través de setMessageLogging () puede ser pasado, de la siguiente manera:

public class BlockDetectByPrinter {    
	public static void start() {
        Looper.getMainLooper().setMessageLogging(new Printer() { 
           private static final String START = ">>>>> Dispatching"; 
           private static final String END = "<<<<< Finished";
            @Override
            public void println(String x) {
              if (x.startsWith(START)) {
                    LogMonitor.getInstance().startMonitor();
                }  
              if (x.startsWith(END)) {
                    LogMonitor.getInstance().removeMonitor();
                }
            }
        });
    }
}

Después de establecer el registro, el método de devolución de llamada de bucle logging.println imprimirá cada vez que los mensajes de registro a cabo: ">>>>> Despacho a" y "<<<<< Terminado a". uso BlockDetectByPrinter en el método onCreate se invoque la aplicación BlockDetectByPrinter.start de () puede ser.

Podemos implementar un simple LogMonitor pila a la información de registro Caton cuando el hilo principal. Cuando un partido a >>>>> Despacho, ejecución StartMonitor, llevará a cabo la tarea (umbral establecido Caton) después de 1000 ms, esta tarea se encarga de imprimir la información de la pila hilo de interfaz de usuario en el hilo hijo (rosca no UI). Si el mensaje debajo de la huelga completado dentro de 1000 ms, se puede igualar a <<<<< bobina acabada, ejecutar removeMonitor cancelado la tarea antes de la misión inicia la impresión de pila es que no hay Caton suceder, si el mensaje se ha terminado más de 1000 ms en este momento se le ocurrió Caton, la impresión y la pila de hebras información de la interfaz de usuario.

3.1.3, LogMonitor cómo lograr?

public class LogMonitor {    
	private static LogMonitor sInstance = new LogMonitor();    
	private HandlerThread mLogThread = new HandlerThread("log");    
	private Handler mIoHandler;    
	private static final long TIME_BLOCK = 1000L;    
	private LogMonitor() {
        mLogThread.start();
        mIoHandler = new Handler(mLogThread.getLooper());
    } 
   
	private static Runnable mLogRunnable = new Runnable() {        
        @Override
        public void run() {
            StringBuilder sb = new StringBuilder();
            StackTraceElement[] stackTrace = Looper.getMainLooper().getThread().getStackTrace();            
            for (StackTraceElement s : stackTrace) {
                sb.append(s.toString() + "\n");
            }
            Log.e("TAG", sb.toString());
        }
    };
    
    public static LogMonitor getInstance() {        
        return sInstance;
    }    
    public boolean isMonitor() {        
        return mIoHandler.hasCallbacks(mLogRunnable);
    }    
    public void startMonitor() {
        mIoHandler.postDelayed(mLogRunnable, TIME_BLOCK);
    }    
    public void removeMonitor() {
        mIoHandler.removeCallbacks(mLogRunnable);
    }
}

Cuando usamos aquí para construir un HandlerThread Handler, HandlerThread heredado de Hilo, en realidad un hilo, sólo uno más que el promedio del hilo Looper, proporcionar externa a sí mismo este método objeto getLooper Looper y luego crear Handler HandlerThread la lanzadera objeto pasado. Tal es el objeto de nuestra mIoHandler HandlerThread de unión del hilo no interfaz de usuario, y es que consume tiempo las operaciones de tratamiento no bloqueará la interfaz de usuario. Si el hilo de interfaz de usuario se bloquea más de 1000 ms, será ejecutado en la sub-hilo mLogRunnable, imprimir la información actual de pila de subprocesos de interfaz de usuario, si el mensaje no se procesa más de 1000 ms, se moverá de esta tarea en tiempo real mLogRunnable.

Ocurrir de repente imprimir la información de la pila de tarjetas más o menos de la siguiente manera, puede llevar mucho tiempo para desarrollar a través del lugar de colocación de registro.


优点: Ya no al usuario utilizar la aplicación o el proceso de prueba se puede controlar desde el caso Caton nivel aplicación, una vez Caton parece capaz de grabar aplicación y la información de estado, siempre que dispatchMesaage metrópolis demasiado tiempo registran, no se enfrenta a la primera de dos maneras adb problemas y deficiencias.

缺点: Sujeto a información de pila Get sub-hilo abierto, consumir una pequeña cantidad de recursos del sistema.

En la implementación real, diferentes teléfonos Android de diferentes sistemas e incluso diferente versión de la ROM, función de bucle puede no ser capaz de imprimir ">>>>> Despacho a" y "<<<<< Terminado a" registro tal, haciendo que el manera imposible.

estrategia de optimización: Sabemos que la función de inicio y fin de bucle se ejecutará println imprimir el registro, por lo que la versión optimizada del juicio Caton cambió, en bucle cuando la salida del primer registro de oración como StartMonitor, una salida de registro en un momento como el fin de solucionar este problema.

3.2, utilice el seguimiento de Choreographer.FrameCallback Caton

Choreographer.FrameCallback enlaces de documentos oficiales ( https://developer.android.com/reference/android/view/Choreographer.FrameCallback.html )

Sabemos, sistema Android cada 16 ms liberación de la señal VSYNC para notificar interfaz de redibujado, renderizado, cada ciclo sincronizado de 16.6ms, en nombre de la frecuencia de actualización de un cuadro. SDK contiene unas clases relacionadas, así como las devoluciones de llamada relacionados. En teoría, el período de devolución de llamada de dos de tiempo debe ser de 16 ms, 16 ms si más hemos de creer que un Caton, utilice el período de tiempo entre dos de devolución de llamada para determinar si hay Caton (Este programa es algo más que apoyar Android 4.1 API 16 ).

El principio fundamental de este programa es establecer su función FrameCallback por clase Coreógrafo, cuando cada cuadro se representa gatillo de devolución de llamada FrameCallback función, FrameCallback devolución de llamada vacío doFrame (largos frameTimeNanos). Interface rendirá un método de devolución de llamada doFrame, si el intervalo entre dos mayor doFrame que 16.6ms que indica la ocurrencia de Caton.
Aquí Insertar imagen Descripción

public class BlockDetectByChoreographer {
    public static void start() {
        Choreographer.getInstance().postFrameCallback(new Choreographer.FrameCallback() { 
                   long lastFrameTimeNanos = 0; 
                   long currentFrameTimeNanos = 0;

                @Override
                public void doFrame(long frameTimeNanos) { 
                    if(lastFrameTimeNanos == 0){
                        lastFrameTimeNanos == frameTimeNanos;
                    }
                    currentFrameTimeNanos = frameTimeNanos;
                    long diffMs = TimeUnit.MILLISECONDS.convert(currentFrameTimeNanos-lastFrameTimeNanos, TimeUnit.NANOSECONDS);
                    if (diffMs > 16.6f) {            
                       long droppedCount = (int)diffMs / 16.6;
                    }
                        if (LogMonitor.getInstance().isMonitor()) {
                        LogMonitor.getInstance().removeMonitor();                    
                    } 
                    LogMonitor.getInstance().startMonitor();
                    Choreographer.getInstance().postFrameCallback(this);
                }
        });
    }
}

Cuando se representa cada trama, la prestación de una nota de tiempo se utiliza para calcular el número de tramas, los datos pueden ser suavemente dibujados curva; al mismo tiempo, obteniendo isMonitor () para determinar el uno LogMonitor haya empezado a imprimirse tarea pila, si empezar, retire LogMonitor, en este momento se dicten en un tiempo y ahora se ha superado el umbral, la tarea se ha ejecutado para imprimir la pila, si no superar el umbral tarea luego rápidamente eliminado. Si isMonitor devuelve falso, no es una tarea LogMonitor de devolución de llamada, el inicio de un nuevo marco de tarea de supervisión.

优点: No sólo de la aplicación se puede utilizar para controlar el nivel de Caton, al mismo tiempo, se puede calcular en velocidades de fotogramas en tiempo real y los marcos de intercambio, la velocidad de fotogramas seguimiento de la página de datos de la aplicación, si se determina la velocidad de fotogramas es demasiado bajo, se puede guardar automáticamente la información de pila escena en tiempo real.

缺点: Sujeto a información de pila Get sub-hilo abierto, consumir una pequeña cantidad de recursos del sistema.

3.3, resume la comparación de los dos esquemas:

Looper.loop Choreographer.FrameCallback
Supervisar si Caton
El apoyo a las páginas estáticas de detección Caton
cálculo del tipo de bastidor de soporte X
El apoyo a la aplicación de información operativa

El uso real del proyecto, hemos puesto en marcha dos tipos de métodos de seguimiento que tenga que pasar, informaron dos maneras de recoger la información que tratan por separado Caton, Caton descubrió el efecto monitoreo es más o menos igual. Caton se produce cuando los mismos dos métodos de control se pueden grabar. Debido Choreographer.FrameCallback enfoque de supervisión no sólo para controlar Caton, también es fácil de calcular las velocidades de fotogramas en tiempo real, por lo que ahora usamos Choreographer.FrameCallback sólo para aplicaciones de monitor situación Caton.

En cuarto lugar, la forma de garantizar la exactitud de captura de pila Caton?

estudiantes observantes pueden encontrar que podemos juzgar por estos dos programas (Looper.loop y Choreographer.FrameCallback) es actualmente el hilo principal si ha habido Caton y, a continuación, en el cálculo de tiempo después del descubrimiento Caton volcado por la información principal pila de subprocesos . De hecho, a través de una sub-secuencia para monitorear las actividades del hilo principal, el vertedero de hilo principal calcula que la pila supera el umbral, el archivo de pila generada sólo para capturar una instantánea de un momento en la escena. Para hacer una analogía inapropiada, el equivalente de circuito cerrado de televisión capturó sólo después de los horrores del asesinato, pero no registró el transcurso de este caso se produjo, a continuación, sólo se ve la policía como el resultado sigue siendo difícil de juzgar los méritos y asesino. En el uso real, encontramos el caso de pila adquirió esta manera, ver el código y funciones, a menudo no está ya ocurrió código Caton.
Aquí Insertar imagen Descripción
Como se muestra, el hilo principal T1 ~ T2 período de tiempo se produce Caton, adquirida en la realización anterior de la pila ya está Caton tiempo T2. El Caton real podría ser este tiempo la función de un demasiado grande de Caton, aunque no necesariamente un tiempo de problema T2, Caton tal información no puede ser capturado con precisión reacción Caton sitio.

Tomamos un vistazo a los IOS micro-canal de captura pila del sistema de vigilancia Caton hilo principal es cómo lograr esto antes. se detecta IOS micro-canal, el programa se comprueba una vez cada segundo hilo 1, si se detecta el hilo principal Caton, todas las discusiones funcionarán memoria volcado de pila de llamadas. En esencia, la hora de inicio en el micro-canal esquema iOS es fijo, el número de controles es fijo. Si la ejecución de la tarea 1 tomó más tiempo para causar Caton, sino porque el hilo se controla una vez cada 1 segundo barrido, puede ser encontrado en la tarea N y volcado abajo de la pila, y no puede coger la pila de misión crítica 1. situación tal existe, pero ahora está de licencia grandes tácticas de vigilancia mar, Caton atrapado por el punto de distribución de probabilidad, pero todavía no es el mejor esquema de adquisición.

Por lo tanto, tenemos ante nosotros es cómo conseguir más precisa pila Caton. Con el fin de apilar la exactitud Caton, queremos ser capaces de conseguir la pila con el tiempo, en lugar de un punto de la pila, como se muestra a continuación:
Aquí Insertar imagen Descripción
programa de adquisición de frecuencia utilizamos para adquirir una pluralidad de pilas dentro de un período de tiempo Caton, sin entonces sólo hay un punto de la pila. La ventaja de este tipo de programas es asegurar la integridad de la supervisión, todo el proceso de Caton pila se han muestreo, la recopilación y el aterrizaje.

Consiste en el proceso de seguimiento del hilo niño en cada registro redondo o de salida para cada monitor del marco comenzado, hemos abierto un trabajo de muestreo de alta frecuencia para recoger la pila del hilo principal. El siguiente momento en que un registro o al final del monitor del marco, se determina si se ha producido Caton (cálculos consumen tiempo supera un valor umbral), para determinar si la memoria de este conjunto de suelo a la pila de almacenamiento de archivos. En otras palabras, cada Caton sucede, se registró un número entero de muestreo de alta frecuencia pila proceso de Caton. detalles De este modo registrar con precisión en todo el proceso de análisis de homicidios (se describirán más adelante cómo Caton partir de una pluralidad de información de la pila se extrae pila clave) para la presentación de informes.

En quinto lugar, después de que la pila masiva Caton cómo hacer frente a?

Después de pila Caton informó a las necesidades de plataforma para ser reportados para el análisis de documentos, la extracción y el proceso de agrupamiento, el espectáculo final de la plataforma de Caton. Mencionamos anteriormente, cada vez que se produce Caton, el muestreo de alta frecuencia a varias pilas con esta descripción Caton. Sea una estimación mínima, recogida diaria informaron 2000 archivos de usuario Caton, cada archivo de volcado Caton encontrado los usuarios menores de 10 años Caton, Caton altas frecuencias cada pila recogida 30, que se ha producido 20001030 = 60W una pila. De acuerdo con el desarrollo de esta magnitud, un mes puede producir decenas de millones de información de la pila, cada pila o fila de decenas funcionan relación llamada. Un número tan grande de almacenamiento de información, análisis, etc. página shows traen una presión considerable. Pronto explotar los niveles de almacenamiento, plataformas no pueden mostrar esas grandes cantidades de datos, desarrollo de ninguna manera de hacer frente a estos problemas de múltiples pilas. Por lo tanto, la masa Caton Pila convierta en otro problema que enfrentamos.

En un proceso de Caton, Caton generalmente ocurren en la llamada de una función, en la que más de una lista de pila, que ocupa cada pila están haciendo se volvieron a analizar después de un proceso de hash, hay una gran oportunidad de ser un volcado de pila con el mismo hash, como se muestra a continuación:
Aquí Insertar imagen Descripción

Publicados 100 artículos originales · ganado elogios 45 · vistas 640 000 +

Supongo que te gusta

Origin blog.csdn.net/wangzhongshun/article/details/100735952
Recomendado
Clasificación