código muerto y adiós opinión! Ali entretenimiento estadísticas de cobertura de códigos destructivos

Autor |  Ali Baba avanzó ingenieros de desarrollo de entretenimiento inalámbrico de largo Sun

Zebian | Tu Min

fondo

Con el fin de adaptarse a la rápida iteración del producto, por lo general una gran cantidad de recursos de I + D se invertirá en el desarrollo de nuevas características, funciones y de gobierno para la atención inútil, pero poco. Con el tiempo, la aplicación en línea se acumula una gran cantidad de código muerto, junto con el cambio de personal y la función de transferencia, gestión de costes código cada vez más inútil. El paquete de instalación de la aplicación final es demasiado grande, lo cual reduce la tasa de conversión de descarga de aplicaciones, la plataforma de aplicaciones de almacenamiento limitada (por ejemplo, la aplicación no puede superar los estantes de la tienda de Google 100M), lo que reduce la eficiencia de la investigación y el desarrollo, y así sucesivamente.

Lo inútil códigos de gobierno? El primero es un código estático se escanea. Para aplicaciones de Android, herramientas de análisis estático ProGuard pueden codificar las referencias relación, cortará automáticamente el código no ha sido citado para reducir el tamaño del paquete de instalación durante la fase de construcción.

Por supuesto, sólo la lectura de códigos de aún no es suficiente, ya que no es representativo del uso real de usuarios, por lo que necesita una línea de cobertura de código de usuario del programa de estadísticas.

Línea de estadísticas de cobertura de código Aquí voy a cortar en las aplicaciones Android para compartir pensamiento y suelo técnico plan de Youku gobierno código muerto.

programa de adquisición tradicional

En primer lugar, con el código estadístico en el código en las estadísticas requeridas. Cuando se ejecuta el código, estadísticas e informes. El número de líneas de aplicaciones de código normalmente son decenas de miles, añadir manualmente claramente poco realista, por lo general es para insertar código estadístico (en lo sucesivo, la instrumentación) de programación orientada a aspectos (AOP) en la fase de construcción, se puede hacer uso de algún madurar AOP middleware completado, por ejemplo, Jacoco, ASM.

En segundo lugar, la necesidad de pensar es, lo que se espera para recoger el tamaño de las partículas? En general, de fino a grueso tamaño de partícula se divide en: una instrucción, una rama, un método, el nivel de clase, más fino es el tamaño de las partículas, más precisa será la cobertura de código de resultado, pero la pérdida de rendimiento es mayor. Por ejemplo, si se desea capturar el detalle de nivel de instrucción, es necesario que cada instrucción instrumentada, pero esto puede llevar a cartucho también se duplicó el número de instrucciones, el paquete de instalación se incrementa en marcha una degradación del rendimiento.

Youku ha tratado de tamaño de las ramas con Jacoco instrumentación, que habíamos esperado a la cubierta ya que muchos usuarios debido a que los usuarios que cubre más resultados más precisos. Sin embargo, después de las pruebas, este programa aumenta el 10M paquete de instalación, un grave deterioro de rendimiento en carrera, decidido a dar a este programa.

Con el fin de sopesar el rendimiento y el tamaño de la adquisición, que ahora toma generalmente el nivel de clase de la instrumentación granularidad, en parte debido a un pequeño impacto en el rendimiento, por el contrario demasiado pequeño tamaño de la adquisición se sumará a la dificultad de la parte comercial de la gobernabilidad. Sin embargo, este esquema no es perfecta:

1) el rendimiento en tiempo de ejecución: cuándo se ejecutará la clase cuando se cargan primer código estadístico, proceso de arranque de la aplicación se carga miles de clase, causar algún impacto en el rendimiento de puesta en marcha; 

2) el tamaño del paquete: el número de clases, cómo se insertan muchas líneas de código estadísticas, para una gran aplicación, tales como Youku, se incrementará el número de tamaño del paquete de instalación;

3) Construcción de Procesado: debido a la necesidad de que cada proceso de clase build instrumentado, aumentar la construcción consume mucho tiempo;

El nuevo programa de adquisición -SlimLady

▐   objetivo

Yoqoo quería un esquema de línea de colección puede sin pérdida de cobertura de código, el núcleo de los siguientes objetivos:

  1. el rendimiento de ejecución: ningún efecto; 

  2. Tamaño del paquete: ningún efecto;

  3. Construcción de tiempo: ningún efecto;

▐   lograr

Al estudiar el código fuente, se puede encontrar información sobre la clase ha sido cargada por la máquina virtual de consulta DVM dinámico para obtener una cobertura de código de nivel de clase, bajo la figura sección "cobertura de Adquisición" es la colección esquemática SlimLady, aquí nos centramos sólo en esta parte, otras porciones se explicarán más adelante en el esquema general.

ClassTable

Especificación de Java Virtual Machine, la clase primero se debe cargar la máquina virtual antes de su uso. Androide, la carga de clases se realiza mediante cargador de clases, guardó por última vez en la capa ClassTable nativo, por lo que si tenemos la ClassTable todos los objetos ClassLoader, es posible determinar la máquina virtual que se cargan las clases.

En primer lugar, obtener todo el objeto cargador de clases. Para las clases de APK, si no se indica específicamente, el defecto será de carga generalmente PathClassLoader; a la carga dinámica, requiere una costumbre ClassLoader cargado, por ejemplo, crea un correspondiente Atlas ClassLoader el Bundle para cada uno, a través del cual ClassLoader manojo de clase a la carga. Una vez que sepa lo que la aplicación utiliza en ClassLoder, conseguir un pedazo de la torta

En segundo lugar, para obtener la dirección de la ClassTable objeto por ClassLoader. Java código fuente a través de las capas de clase ClassLoader se puede ver, hay una variable miembro ClassLoader classTable (7,0 y superior), esta variable contiene la dirección de la capa de Native objeto ClassTable, podemos obtener esta dirección por la reflexión:

ClassLoader classLoader = XXX;
Field classTableField = ClassLoader.class.getDeclaredField("classTable");
classTableField.setAccessible(true);
long classTableAddr = classTableField.getLong(classLoader);

Sin embargo, en el sistema se añade 9,0 classTable variable miembro a la lista gris oscuro, lo que limita la reflexión directa, refleja esta limitación es requerida por el sistema de la clase:

ClassLoader classLoader = XXX;
Method metaGetDeclaredField = Class.class.getDeclaredMethod("getDeclaredField", String.class);
Field classTableField = (Field) metaGetDeclaredField.invoke(ClassLoader.class, "classTable");
classTableField.setAccessible(true);
long classTableAddr = classTableField.getLong(classLoader);

En este punto, se obtiene las direcciones de todos los objetos ClassTable, que tiene toda la información de carga de clases.

lista de nombres de clases 

Al leer el código fuente encontró ClassTable hay una manera si cargado por el nombre de clase de clase de consulta también (La siguiente sección describe en detalle), por lo que sólo tenemos que obtener una lista de todos los nombres de las clases, a continuación, llamar a ese método que puede determinar si una clase se carga demasiado .

APK en la lista de nombres de clase se puede obtener DexFile, de la siguiente manera:

List<String> classes = new ArrayList<>();
DexFile df = new DexFile(context.getPackageCodePath());
for (Enumeration<String> iter = df.entries(); iter.hasMoreElements(); ) {
    classes.add(iter.nextElement());
}

Del mismo modo, la carga dinámica se puede obtener DexFile;

Si se carga la clase

Class_table.cc encuentra en una fuente de lectura, ClassTable búsqueda allí, pasando nombres de las clases y los nombres de las clases del valor hash, devuelve la dirección del objeto de clase, de la siguiente manera:

Espejo :: Clase * :: ClassTable de búsqueda (const char * descriptor, el hash size_t)

Si el valor de retorno nullptr, tenía tal descripción no está cargado, de lo contrario, lo que indica algún cargada.

mirror::Class* ClassTable::Lookup(const char* descriptor, size_t hash)

Este método es un método para obtener la dirección:

  1. Al cargar: class_table.cc en libart.so, todo lo que tenga que cargar con libart.so dlopen conseguir esto para que el manejador. De hecho, antes de la carga, libart.so debe haber sido cargado en el proceso actual, sólo para obtener el controlador de carga, no consume mucho tiempo;

  2. tabla de símbolos: Consulta por readelf de búsqueda de símbolos: _ZN3art10ClassTable6LookupEPKcj;

  3. Método del puntero: dlsym llamada, tablas de controlador y de símbolos de entrada que se pueden encontrar en las direcciones de los métodos de búsqueda;

Nota: De 7.0 del sistema, Google prohíbe el sistema de llamada de API nativo, aquí nos encontramos con libart.so dirección a través de / proc / self / maps, que copiará la tabla de símbolos, y por lo tanto evitar esta limitación;

En este punto, podemos llamando al método de búsqueda ClassTable, pasando el nombre de la clase y el valor hash para determinar si la clase se carga antes.

resumen

De esta manera, vamos a conocer en algún momento lo que se carga la clase antes, subirlos, y el proceso de polimerización, y luego comparando la lista de todos el nombre de clase, puede obtener los datos de cobertura de código. Este esquema no requiere instrumentación, la cobertura puede ser recogido sin pérdida.

El diseño general del nuevo programa

programa de adquisición mencionados anteriormente son el núcleo proceso de apoyo, además de la corriente abajo del programa en su conjunto, el esquema de diseño general como se muestra a continuación:

1) Distribución APK: La última APK construido por la construcción de centros, distribuidos a los usuarios; 

2) Disparador: aplicación instalada usuario, durante el uso, la aplicación después de pasar 10 segundos atrás, la frecuencia de muestreo se calcula por el golpe, si es exitosa, se activa la cobertura de código de adquisición

3) Configurar emitió: cuando sea necesario, se pueden enviar configurado para ajustar dinámicamente la función de conmutación, la velocidad de muestreo por la siguiente configuración dispuesto en el centro;

4) La recolección de datos: la adquisición de cobertura de código intermedio (clase) SlimLady estadísticas que se carga, los nombres de las clases cargadas almacenados en un archivo comprimido, y los datos comprimidos se transmiten a subir middleware;

5) Carga de datos: carga de datos subidos a la nube de middleware;

6) Descarga de datos: servidores de la nube periódicamente para descargar los datos;

7) proporcionar información de clase: Clase información del servidor obtiene de la construcción del centro, incluyendo una lista de todas las clases y confundir los nombres de archivo;

8) el análisis de datos: de acuerdo con la versión del código de servidor se descomprime los datos de cobertura, anti-aliasing, las estadísticas de agregación, los resultados estadísticos después de la polimerización incluyen la clase y el número de cargado anteriormente, en comparación con una lista de nombres de todas las clases que puede saber qué clases no había sido cargado, guardar los resultados en la base de datos;

9) Los resultados de la polimerización: de resultados de polimerización leer desde el lado de la base de datos, pulse módulo de visualización de cobertura de código, el calor módulo, tamaño de bloque y otra información.

resumen

El programa rompe a través de las estadísticas tradicionales de instrumentación enterrado, el acceso dinámico a información de la máquina virtual, la cobertura de código cobro revertido no destructiva. Con los datos de cobertura de código, tenemos una gran cantidad de control, por ejemplo: desconectado módulo de código inútil, llamada delgada o fuera de línea baja, un módulo de gran volumen, añadir la cobertura de código de bayoneta durante la fase de integración y así sucesivamente.

【Final】

lectura recomendada 

aprendizaje profundo "Tres Grandes", ganador del premio Turing Yann LeCun: no tengo talento, por lo que sólo tiene que seguir los sabios

64% de las empresas no se dio cuenta algoritmo inteligente 5 en el tamaño de ingenieros de la empresa equipo es menos de 10 personas, donde las oportunidades para los ingenieros en la IA?

2020 años, las cinco clases de lenguaje de programación morirán

resistido millones de personas viven, recomienda las Naciones Unidas desde el final de la ruta de migración de tecnología mosca libro!

no sé qué AWS eso? Este 11 de llave con usted sabe AWS!

escrita Solidez contrato de patrones de diseño inteligentes

Nos fijamos en cada punto, en serio como favorito

Liberadas 1861 artículos originales · ganado elogios 40000 + · Vistas 16,860,000 +

Supongo que te gusta

Origin blog.csdn.net/csdnnews/article/details/105021188
Recomendado
Clasificación