Análisis de la solución de optimización de rendimiento de Android más completa de la historia

La optimización del rendimiento en Android se divide en los siguientes aspectos:

optimización de diseño

Optimización de red

Optimización del paquete de instalación

optimización de memoria

optimización catónica

iniciar la optimización

……

1. Optimización del diseño

La esencia de la optimización del diseño es reducir la jerarquía de Vista. Los esquemas comunes de optimización del diseño son los siguientes:

  • En el caso de que tanto LinearLayout como RelativeLayout puedan completar el diseño, se prefiere LinearLayout, que puede reducir el nivel de Vista, pero tenga en cuenta que el mismo componente puede tardar mucho en dibujar RelativeLayout

  • Use la etiqueta <include> para extraer las partes comunes de los componentes de diseño de uso común para su reutilización.

  • Use la etiqueta < ViewStub > para cargar diseños no utilizados, carga diferida (cargada en la actividad cuando sea necesario)

  • Use etiquetas <Combinar> para reducir los niveles de anidamiento del diseño

2. Optimización del dibujo

La optimización del dibujo significa que el método onDraw de View debe evitar realizar una gran cantidad de operaciones, lo que se refleja principalmente en dos aspectos:

1. No cree nuevos objetos locales en onDraw.

Debido a que el método onDraw puede llamarse con frecuencia, se generará una gran cantidad de objetos temporales en un instante, lo que no solo ocupa demasiada memoria, sino que también hace que el sistema realice un GC con más frecuencia, lo que reduce la eficiencia de ejecución del programa.

2. No realice tareas que consumen mucho tiempo en el método onDraw,

No se pueden realizar miles de operaciones de bucle. Aunque cada bucle es muy liviano, una gran cantidad de bucles aún ocupan segmentos de tiempo de CPU, lo que hará que el proceso de dibujo de la vista no sea fluido.

De acuerdo con los estándares en el modelo de optimización de rendimiento proporcionado oficialmente por Google, se garantiza que la frecuencia de dibujo de View es de 60 fps como la mejor, lo que requiere que el tiempo de dibujo de cada fotograma no supere los 16 ms (16 ms = 1000/60), aunque es difícil que el programa garantice el tiempo de 16ms, pero siempre es práctico minimizar la complejidad en el método onDraw.

3. Optimización de la red

Los esquemas comunes de optimización de red son los siguientes:

  • Minimice las solicitudes de red y fusione tanto como sea posible

  • Evite la resolución de DNS. La consulta del nombre de dominio puede tardar cientos de milisegundos y puede haber riesgo de secuestro de DNS. Puede usar el método de agregar actualizaciones dinámicas de IP de acuerdo con las necesidades comerciales, o cambiar al método de acceso de nombre de dominio cuando falla el acceso del método de IP.

  • Se carga una gran cantidad de datos en forma de paginación

  • La transmisión de datos de red adopta la compresión GZIP

  • Únase al caché de datos de red para evitar solicitudes de red frecuentes

  • Al cargar imágenes, comprímalas cuando sea necesario

4. Optimización del paquete de instalación

  • El núcleo de la optimización del paquete de instalación es reducir el tamaño de la aplicación. Las soluciones comunes son las siguientes:

  • Reduzca los archivos de recursos innecesarios en la aplicación, como imágenes, y comprima las imágenes tanto como sea posible sin afectar el efecto de la APLICACIÓN, que tiene un cierto efecto

  • Cuando utilice la biblioteca SO, mantenga primero la versión v7 de la biblioteca SO y elimine otras versiones de la biblioteca SO. La razón es que en 2018, la versión v7 de la biblioteca SO puede cumplir con la mayoría de los requisitos del mercado. Puede que no sea posible para teléfonos móviles hace ocho o nueve años, pero no necesitamos adaptarnos a teléfonos móviles obsoletos. . El efecto de reducir el volumen de apk en el desarrollo real es muy significativo. Si usa muchas bibliotecas SO, por ejemplo, una versión de la biblioteca SO tiene un total de 10M, entonces solo conserve la versión v7, elimine armeabi y v8 versiones de la biblioteca SO, y el total puede reducirse 20 millones de volumen.

  • optimización de recursos de res

    (1) Use solo un conjunto de imágenes y use imágenes de alta resolución.

    (2) Diseño de interfaz de usuario Instale el complemento TinyPNG en ps para comprimir las imágenes sin pérdidas.

    (3) imágenes svg: la descripción de algunas imágenes sacrifica la potencia informática de la CPU para ahorrar espacio. Principios utilizados: iconos simples.

    (4) La imagen usa el formato WebP (https://developers.google.com/speed/webp/) (Facebook, Tencent, Taobao lo están usando). Desventaja: la carga es mucho más lenta que PNG. Pero la configuración es relativamente alta. Herramientas: http://isparta.github.io/

    (5) Use tintcolor (android: cambie el color dibujable mediante programación) para lograr el efecto de inversión del botón.

  • Optimización de código

    (1) Realizar la simplificación lógica de los módulos funcionales.

    (2) La herramienta Lint verifica los archivos inútiles y enumera los recursos inútiles en "Recursos no utilizados: recursos no utilizados" y los elimina.

    (3) Eliminar bibliotecas dependientes inútiles.

  • optimización de recursos lib

    (1) Recursos descargados dinámicamente.

    (2) El complemento de algunos módulos se agrega dinámicamente.

    (3) Recorte y compresión de archivos so.

  • optimización de recursos de activos

    (1) Es mejor usar el formato de compresión con pérdida para archivos de audio, como opus, mp3 y otros formatos, pero es mejor no usar el formato de música con compresión sin pérdida.

    (2) Para comprimir el archivo de fuente ttf, puede usar la herramienta FontCreator para extraer solo el texto que necesita. Por ejemplo, al mostrar la fecha, solo se necesitan fuentes digitales, pero el uso de la biblioteca de fuentes original puede requerir un tamaño de 10 MB. Si solo extrae las fuentes que necesita, el archivo de fuente generado es de solo 10 KB.

  • Ofuscación de código.

  • Utilice la herramienta de ofuscación de código proGuard, que incluye minificación, optimización, ofuscación y más.

  • Enchufar

  • Los módulos de función se pueden colocar en el servidor y cargar cuando sea necesario.

  • compresión extrema 7z

5. Optimización de la memoria de Android

1. Mecanismo de gestión de memoria de Android

Las aplicaciones de Android se ejecutan en la máquina virtual de Android, y la máquina virtual de Android realiza la asignación de memoria y la recolección de elementos no utilizados.

2. Fugas de memoria comunes

De hecho, la esencia de las fugas de memoria es que los objetos con un ciclo de vida más largo se refieren a objetos con un ciclo de vida más corto.

2.1 Fugas de memoria

Causa de la fuga de memoria: el objeto asignado en el montón ya no se usará, pero el recopilador de GC no puede reciclarlo y una aplicación sólida hace referencia a este objeto.

  • Fugas de memoria causadas por variables estáticas

    Solución: establezca la clase interna como una clase interna estática o sepárela; use context.getApplicationContext().

  • Fuga de memoria causada por el modo singleton

    Solución: pase el parámetro context.getApplicationContext().

  • Fuga de memoria causada por la animación de propiedades

    Solución: Llame a Animator.cancel() en Activity.onDestroy() para detener la animación.

  • Fuga de memoria causada por el controlador

    Solución: use la clase interna estática + la referencia débil WeakReference; borre la cola de mensajes cuando la clase externa termine su ciclo de vida.

  • pérdidas de memoria causadas por subprocesos

    Solución: establezca AsyncTask y Runnable como clases internas estáticas o sepárelas; use referencias débiles para guardar las referencias de contexto dentro de los subprocesos.

  • Fugas de memoria causadas por recursos no cerrados

    Solución: cierre o cierre la sesión a tiempo cuando se destruya la actividad. Por ejemplo:

    ① BroadcastReceiver: llame a unregisterReceiver() para cerrar la sesión;

    ②Cursor, Stream, File: Call close() para cerrar;

    ③Bitmap: llame a recycle() para liberar la memoria (no es necesario hacerlo manualmente después de la versión 2.3).

  • Fuga de memoria causada por el adaptador

    Detalles: en lugar de usar el caché y solo confiar en getView() para volver a crear una instancia del elemento cada vez, ejercerá presión sobre el gc.

    Solución: use el convertView almacenado en caché cuando construya el adaptador.

  • Fuga de memoria causada por WebView.

    Detalles: WebView es especial, incluso si se llama a su método de destrucción, aún causará una pérdida de memoria.

    Solución: De hecho, la mejor manera de evitar pérdidas de memoria causadas por WebView es hacer que la actividad donde se encuentra WebView se encuentre en otro proceso. Cuando finalice esta actividad, elimine el proceso actual donde se encuentra WebView. Recuerdo que el WebView de Ali Dingding es otro proceso Un proceso que se abre también debe usar este método para evitar pérdidas de memoria.

  • fuga de clase de colección

    Detalles: Por ejemplo, hay aplicaciones estáticas como mapas globales, pero al final no se borran.

    Solución: Recicle las colecciones innecesarias durante onDestry.

2.2 Ampliar memoria

Los SDK de los grandes fabricantes pueden tener menos fugas de memoria, pero la calidad de los SDK de algunos fabricantes pequeños es menos confiable. La mejor forma de afrontar esta situación que no podemos cambiar es ampliar la memoria.

Por lo general, hay dos formas de expandir la memoria:

  • Una es agregar el atributo largeHeap="true" en Aplicación en el archivo de manifiesto y la otra es abrir varios procesos para la misma aplicación para expandir el espacio de memoria total de una aplicación.

  • El segundo método es muy común, por ejemplo, he usado el SDK de Getui, y el Servicio de Getui está en otro proceso separado.

  • La optimización de la memoria en Android es generalmente de código abierto y limitación. El código abierto es para expandir la memoria y la limitación es para evitar fugas de memoria.

2.3 Herramientas para detectar y analizar fugas de memoria

  • MemoryMonitor: cambios en el uso de la memoria a lo largo del tiempo

  • MAT: archivo HRPOF de entrada, resultados de análisis de salida

  • a. Histograma: vea diferentes tipos de objetos y sus tamaños

  • b.DominateTree: la memoria ocupada por el objeto y su relación de referencia

  • Tutorial c.MAT

  • LeakCanary: una biblioteca para el monitoreo en tiempo real de fugas de memoria (principio de LeakCanary)

6. Plan de optimización de Caton

  • No realice operaciones de acceso a la red/IO en archivos grandes en el subproceso principal

  • Al dibujar la interfaz de usuario, intente reducir el nivel de la interfaz de usuario del dibujo; reduzca el anidamiento de vistas innecesario, puede usar la herramienta Visor de jerarquía para detectarlo, que se describirá en detalle más adelante;

  • Cuando nuestro diseño usa FrameLayout, podemos cambiarlo para fusionarlo, lo que puede evitar la superposición de cálculos entre nuestro propio diseño de marco y el diseño de marco ContentFrameLayout del sistema (medida y diseño)

  • Para mejorar la velocidad de visualización, usa ViewStub: solo estará ocupado al cargar. Se oculta cuando no está cargado, y solo ocupa espacio.

  • En el caso del mismo nivel de vista, intente usar LinerLayout en lugar de RelativeLayout, porque RelativeLayout medirá dos veces al medir, y LinerLayout medirá una vez, puede ver su código fuente;

  • Eliminar propiedades inútiles en el control;

  • Reutilización del diseño Por ejemplo, reutilización del diseño listView

  • Trate de evitar el sobredibujado (sobredibujado), por ejemplo: el fondo a menudo es fácil de causar sobredibujado. Dado que nuestro diseño ha establecido un fondo, el tema de MaterialDesign utilizado al mismo tiempo tendrá un fondo predeterminado. En este momento, se debe eliminar el fondo agregado por el tema;

  • Fondo opcional en XML

  • Optimización de vista personalizada. Use canvas.clipRect() para ayudar al sistema a identificar esas áreas visibles, solo se dibujará dentro de esta área. También evite sobregirar.

  • Optimización de inicio, monitoreando la velocidad de inicio, descubriendo los problemas que afectan la velocidad de inicio, optimizando la lógica de inicio y mejorando la velocidad de inicio de la aplicación. Por ejemplo, páginas de pantalla de inicio, optimización razonable del diseño, optimización de la lógica de carga y preparación de datos.

  • Mecanismo de actualización razonable, minimice la cantidad de actualizaciones, intente evitar que se ejecuten muchos subprocesos de CPU en segundo plano y reduzca el área de actualización.

7. Optimización del consumo de energía

En realidad, hay muchas razones para el consumo de energía. Aquí hablaré sobre varios esquemas de optimización. Lo contrario del esquema de optimización es la razón. Varios esquemas de optimización son los siguientes:

  • Uso razonable del bloqueo wake_lock, el bloqueo wake_lock es principalmente relativo a la suspensión del sistema (aquí es para ahorrar energía, ya está hecho), lo que significa que mi programa agrega este bloqueo a la CPU y el sistema no dormirá. El propósito es cooperar completamente con la operación de nuestro programa. En algunos casos, si no hace esto, habrá algunos problemas, como WeChat y otros paquetes de latidos de mensajería instantánea que detendrán el acceso a la red poco después de que se apague la pantalla. Por lo tanto, se utilizan muchos bloqueos wake_lock en WeChat.

  • Use jobScheduler2 para procesar de forma centralizada algunas solicitudes de red, y algunas que no necesitan ser procesadas de manera oportuna pueden procesarse durante la carga, como procesamiento de imágenes, descarga y actualización de aplicaciones, etc.;

  • Optimización de cálculo, evitando operaciones de punto flotante, etc.

  • Cuando los datos se transmiten en la red, intente comprimir los datos antes de la transmisión. Se recomienda utilizar la tecnología de serialización FlatBuffer, que es muchas veces más eficiente que json. Si no conoce FlatBuffer, se recomienda buscar información para aprender .

Apuntando al punto clave de la "optimización del rendimiento", me gustaría compartir con ustedes un "Análisis completo de optimización del rendimiento de Android de 360°". Este manual de estudio lo llevará a explorar la optimización del rendimiento de Android paso a paso, para que el rendimiento del producto es mejorable en todos los aspectos. , espero que les guste.
Este documento tiene un total de páginas 721, puntos principales 4 y capítulos pequeños 25. ¡No solo tiene un análisis detallado de los principios subyacentes, sino que también tiene casos prácticos especiales!

"Análisis de la optimización integral del rendimiento de Android de 360°"

Capítulo 1 Ideas de diseño y optimización de la calidad del código

1. Seis principios

  • Principio de responsabilidad única

  • Principio de sustitución de Liskov

  • Principio de inversión de dependencia

  • Principio de segregación de interfaz

  • ……

2. Patrones de diseño

  • Modo estructural: modo puente, modo adaptador, modo decorador, modo proxy, modo fachada (apariencia)...

  • Patrones creacionales: patrón constructor, patrón singleton, patrón de fábrica abstracto, patrón de método de fábrica...

  • Estructuras de datos: matrices, pilas, colas, listas enlazadas, árboles...

  • Algoritmos: algoritmos de clasificación, algoritmos de búsqueda...

imagen.png

Capítulo 2 Optimización del rendimiento del programa

1. Optimización de la velocidad de inicio y eficiencia de ejecución

  • Análisis de arranque en frío y arranque en caliente

  • Solución de pantalla en blanco y negro de inicio de aplicación

  • Análisis y solución de problemas de congelación de aplicaciones

  • StrictMode para optimizar la velocidad de inicio y la eficiencia de ejecución

  • ……

2. Detección y optimización del diseño

  • Optimización del nivel de diseño

  • sobre renderizado

  • ……

3. Optimización de la memoria

  • Golpe de memoria y fugas de memoria

  • gran memoria

  • Optimización de memoria de mapa de bits

  • Herramienta de monitoreo de memoria de perfil

  • Tapete para objetos grandes y detección de fugas

  • Optimización del consumo de energía

  • Optimización de transmisión de red y almacenamiento de datos Optimización de transmisión de red y almacenamiento de datos

  • Optimización del tamaño de APK

  • adaptación de pantalla

  • ……

4. Optimización del consumo de energía

  • Dormitar y en espera

  • Historiador de la batería

  • planificador de trabajos

  • administrador de trabajo

5. Optimización de transmisión de red y almacenamiento de datos.

  • herramienta de serialización de google protobuf

  • compresión extrema 7z

  • ……

6. Optimización del tamaño de APK

  • APK para adelgazar

  • Principio de confusión de recursos de WeChat

  • ……

imagen.png

7. Adaptación de pantalla

  • El principio de adaptación.

  • Principio de adaptación del calificador de resolución de pantalla y el calificador de ancho más pequeño

  • Por qué elegir el calificador más pequeño de ancho para la adaptación

  • Cómo adaptarse a otros módulos

  • Preguntas más frecuentes

    ……

8. Análisis del principio del problema OOM

  • mecanismo de gestión de memoria adj

  • Mecanismo de reciclaje de memoria JVM y análisis de algoritmo GC

  • Resumen de problemas relacionados con el ciclo de vida

  • Resumen del esquema de compresión de mapa de bits

  • ……

9. Análisis de problemas ANR

  • Principio de ajuste de la hora del sistema AMS

  • Análisis del principio de espera del programa

  • Resolución de problemas ANR

  • ……

10. Solución de monitoreo de accidentes

  • Solución de monitoreo de capa Java

  • Solución de monitoreo de capas de Nativie

  • ……

imagen.png

Capítulo 3 Optimización de la eficiencia del desarrollo

  1. Sistema de control de versiones distribuido Git

Escenario Introducción de la plataforma de integración continua empresarial eficiente

Sistema de control de versiones distribuido GIT

  • Gestión de sucursales GIT

  • ……

2. Sistema de compilación automático Gradle:

  • Gradle y complemento de Android: la relación entre gradle y el complemento de gradle de Android, el uso básico de Gradle Transform API...

  • Uso básico de Gradle Transform API: qué es Transform, escenarios de uso de Transform, aprendizaje de Transform API, tipo de entrada...

  • Desarrollo de complementos personalizados: introducción, preparación, práctica del complemento de Gradle, complemento de Gradle personalizado, método del módulo buildSrc...

  • Combate de complementos: empaquetado multicanal, liberación automática de versiones...

imagen.png

Capítulo 4 Práctica de optimización del rendimiento de la aplicación

1. Velocidad de inicio

  • Flujo general de inicio de la aplicación

  • arranque en frio y arranque en caliente

  • Medición de la velocidad de arranque

  • Optimización de la ventana de inicio

  • optimización de subprocesos

  • Optimización de la programación del sistema

  • optimización de GC

  • Optimización de E/S

  • Reordenamiento de recursos

  • Optimización del diseño de la página de inicio

  • Optimización de carga de clases

  • Elija el marco de inicio correcto

  • Reducir el nivel de salto de Actividad

  • Optimización de proveedores

  • fondo mantener vivo

  • ……

imagen.png

  • 2. Fluidez

  • Algunas herramientas y rutinas para el análisis de problemas de rendimiento

  • Análisis de datos a través de datos de rendimiento

  • Casos de rendimiento causados ​​por el rendimiento de la plataforma Android

  • Problemas de rendimiento causados ​​por la propia aplicación de Android

  • Datos y características de comportamiento de la baja memoria

  • Tesoro de la aplicación

  • Análisis de la congelación de toda la máquina causada por el servicio sin barreras del método de entrada de Xunfei

  • Bytedance: la página de detalles gráficos y de texto de Toutiao de hoy se abre en segundos

  • ……

  • 3. La práctica de Douyin en la optimización de recursos del tamaño del paquete APK

  • Compresión de imagen

  • compatibilidad webp no intrusiva

  • Optimización multi-DPI

  • Consolidación de recursos duplicados

  • modo estricto de ShrinkResource

  • Confusión de recursos (compatible con el modo aab)

  • Adelgazamiento ARSC

  • ……

imagen.png

  • 4. Análisis completo de la tecnología de diseño receptivo de Youku

  • Descripción general de la tecnología de diseño receptivo de la aplicación Youku

  • APLICACIÓN Youku Responsive Layout Android Landing

  • Aterrizando en la escena de la distribución

  • Aterrizando en la escena del consumo

  • Esquema de prueba de diseño receptivo de la aplicación Youku

  • ……

  • 5. Optimización de la red

  • Optimización de enlaces de Taobao móvil en la red

  • Práctica de la aplicación Baidu en la optimización profunda de la red

  • ……

  • 6. Revelar el secreto del proyecto de optimización del rendimiento Mobile Taobao Double Eleven

  • Realización de la regla de un segundo.

  • Aumento del 20 % en el tiempo de inicio y la velocidad de fotogramas de la página

  • Ahorre 50% en la memoria del teléfono Android

  • ……

  • 7. Análisis de dependencia del código fuente de enlace completo de la aplicación AutoNavi

  • Arquitectura de la plataforma de aplicaciones Gaode

  • Principio básico de realización

  • estructura del proyecto

  • Escenarios de aplicación y principios de implementación

  • ……

  • 8. Comparta la experiencia práctica de matar completamente OOM

  • Solucionar problemas de fugas de memoria

  • estrategia de fondo

  • El pico de memoria es demasiado alto

  • Solución de problemas y optimización de imágenes extragrandes

  • ……

  • 9. Práctica de optimización de memoria del terminal WeChat Android

  • Detección de fugas de actividad

  • Seguimiento de asignación y desasignación de mapa de bits

  • Detección de fugas de memoria nativa

  • monitoreo de hilos

  • monitor de memoria

  • ……

imagen.png

Resumir

La optimización del rendimiento no se resuelve con la actualización de una o dos versiones, es un requisito continuo, una integración continua y una retroalimentación iterativa. En proyectos reales, al comienzo del proyecto, debido a las limitaciones de mano de obra y tiempo de finalización del proyecto, la prioridad de la optimización del rendimiento es relativamente baja. Cuando el proyecto se pone en funcionamiento, la prioridad debe aumentar. Al construir una solución , los puntos de optimización del rendimiento también deben considerarse temprano, lo que refleja las habilidades técnicas de un programador. Espero que este " Análisis completo de optimización del rendimiento de Android de 360° " pueda ayudarte.

¡La información de este artículo se puede escanear de forma gratuita escaneando la tarjeta de certificación oficial de CSDN a continuación!

Supongo que te gusta

Origin blog.csdn.net/YoungOne2333/article/details/126909794
Recomendado
Clasificación