[Android] Notas de estudio de optimización de inicio de aplicaciones

Propósito de optimización de inicio

experiencia de usuario:

La velocidad de inicio de la aplicación afecta directamente la experiencia del usuario. Los usuarios esperan que las aplicaciones se inicien rápidamente y respondan rápidamente a sus acciones. Si una aplicación se inicia lentamente, los usuarios pueden sentirse insatisfechos y optar por desinstalarla o cambiar a la aplicación de un competidor. A través de la optimización de inicio, se puede mejorar la velocidad de inicio de la aplicación, lo que permite a los usuarios obtener una mejor experiencia.

Ventaja competitiva:

El mercado de aplicaciones móviles es altamente competitivo y los usuarios tienen una gran cantidad de opciones. Si su aplicación se inicia lentamente, puede perder usuarios, especialmente en comparación con aplicaciones similares. Al habilitar la optimización, puede mejorar la velocidad de respuesta de la aplicación, atraer a más usuarios para que permanezcan en la aplicación y mejorar la competitividad de diferenciación de los competidores.

Administracion de recursos:

Cuando se inicia la aplicación, es posible que deba cargar e inicializar muchos recursos, como el diseño de la interfaz, los datos, etc. Si el proceso de inicio es largo y consume demasiados recursos, puede aumentar la carga del sistema, afectar el rendimiento de otras aplicaciones e incluso provocar que el sistema se bloquee. Al iniciar la optimización, puede administrar y utilizar los recursos de manera más eficaz, reducir la ocupación de los recursos del sistema y mejorar el rendimiento y la estabilidad generales del sistema.

Iniciar el alcance de la optimización

Durante el proceso de inicio de una aplicación de Android, hay tres pantallas principales, que son la primera pantalla, la segunda pantalla y la tercera pantalla. La primera pantalla se refiere a 应用程序加载的过程una imagen de fondo que generalmente se muestra en un tema. La segunda pantalla significa Splash页面que se muestra el contenido de la interfaz de inicio. La tercera pantalla se refiere a MainActivityla visualización de la principal interfaz interactiva de la aplicación.

Para mejorar la experiencia del usuario, solemos prestar atención al tiempo que tarda la aplicación en iniciar una página interactiva, es decir, el tiempo que pasa en la primera pantalla y en la segunda pantalla. Antes de eso, está el proceso de creación de la aplicación y el proceso de creación de inicio de SplashActivity. Por lo tanto, dentro del alcance de la optimización de la puesta en marcha, por lo general será desde Application.attachBaseContext()el principio hasta Main.onWindowFocusChanged()el final.

El objetivo de la optimización es reducir el tiempo de inicio y permitir que la aplicación muestre páginas interactivas lo antes posible. Por lo tanto, es necesario prestar atención al consumo de tiempo de la primera pantalla, es decir, el tiempo de inicio de la Aplicación, y el consumo de tiempo total de la primera pantalla y la segunda pantalla, es decir, el tiempo de inicio de la Aplicación. inicio a la página interactiva.

La secuencia de llamadas del proceso de creación de la aplicación:
inserte la descripción de la imagen aquí
la secuencia de llamadas desde la creación de la Actividad hasta el proceso de visualización
inserte la descripción de la imagen aquí

Ideas de optimización

1. Uso de herramientas

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
De esta manera, puede utilizar la herramienta de detección de rendimiento que trae Android Studio para la detección.

2. Método de optimización

1. Carga diferida, incluida la carga diferida de negocios y diseño
2. Tírelo al subproceso para cargarlo solo
3. Cargue por adelantado, mejore la eficiencia a través de subprocesos múltiples
4. Verifique el funcionamiento de IO del subproceso principal
5. Controle el número de subprocesos y el número de GC

Application.onCreate()

Optimización SDK:

Carga lenta:

Retrasar la inicialización del SDK hasta que sea realmente necesario, en lugar de cargarlo todo durante la inicialización de la Aplicación. Esto reduce el tiempo de inicialización en el inicio y mejora la velocidad de inicio.

Optimización de dependencias entre SDKs:

Es posible que algunos SDK deban inicializarse después de que otros SDK hayan terminado de cargarse. Los algoritmos topológicos se pueden usar para optimizar el orden de carga de los SDK para garantizar que los SDK dependientes se carguen e inicialicen antes que los SDK dependientes. Esto evita errores de inicialización o pérdida de tiempo debido a las dependencias.

El subproceso secundario inicializa el SDK:

Coloque el proceso de inicialización del SDK en el subproceso secundario para evitar bloquear el tiempo del subproceso principal. En particular, algunos SDK que deben inicializarse pueden cargarse a través de múltiples subprocesos y usar CountDownLatch para bloquear y reactivar subprocesos para garantizar que el subproceso principal pueda responder a las operaciones del usuario lo antes posible.

Optimización de código comercial

Se prohíbe el uso indebido de ContentProvider:

Dado que ContentProvider se inicializa en Application.attachBaseContext(), el abuso puede aumentar el tiempo de inicio. Por lo tanto, debe usar ContentProvider con cuidado y evitar usarlo demasiado para manejar la lógica empresarial.

Optimice las operaciones que consumen mucho tiempo en el hilo principal:

Encuentre y optimice el código que consume mucho tiempo en el subproceso principal de la aplicación para reducir el impacto en el tiempo de inicio. Las operaciones que consumen mucho tiempo se pueden mover a subprocesos a través de operaciones asincrónicas u otros métodos de optimización, lo que mejora la velocidad de inicio de la aplicación.

Activity.onCreate()
Optimizar diseño:

Reduzca la representación repetida de fondos de diseño, reduzca capas y use ViewStub para cargar diseños que no necesariamente se muestran a pedido. Puede considerar cargar el diseño en el subproceso secundario o cargarlo por adelantado para reducir el tiempo de bloqueo del subproceso principal.

Inicialización perezosa:

Evite las operaciones que consumen mucho tiempo en initView(), como operaciones IO, reproductores, etc. Haga que estas operaciones se carguen de forma diferida a pedido, o cárguelas en varios subprocesos para evitar bloquear el subproceso principal.

Fragmento de carga diferida:

Para el ViewPager+Fragment de la página principal, el Fragment se carga de forma perezosa bajo demanda, y solo se carga e inicializa cuando se desliza a la página correspondiente, lo que evita cargar todos los Fragments a la vez, ahorra recursos y mejora la velocidad de respuesta.

Activity.onResume()

No hagas operaciones que consumen mucho tiempo aquí, no hagas operaciones que consuman mucho tiempo aquí, no hagas operaciones que consuman mucho tiempo aquí.
Puntos de conocimiento en WMS: la representación de la página está en onResume.

inserte la descripción de la imagen aquí

Optimización de dependencias entre SDK (continúe con el segundo punto de optimización de SDK anterior)

Gráfico acíclico dirigido (DAG)

Un gráfico es una estructura de datos que consta de un conjunto de nodos (también llamados vértices) y los bordes que conectan esos nodos. Un gráfico dirigido significa que los bordes del gráfico tienen una dirección, mientras que los bordes de un gráfico no dirigido no tienen dirección. Gráfico acíclico dirigido significa que no hay ningún camino que forme un bucle en el gráfico dirigido, es decir, que partiendo de cualquier nodo y pasando por varias aristas no puede volver al punto de partida.

Un escenario común para el uso de DAG en la optimización del lanzamiento de aplicaciones para Android es la administración de dependencias. En las aplicaciones complejas de Android, puede haber dependencias entre diferentes componentes (como Actividad, Fragmento, Servicio, etc.), es decir, el inicio de un componente depende de la finalización de otros componentes. Con la ayuda de un gráfico acíclico dirigido, estas dependencias se pueden representar claramente y la secuencia de inicio se puede determinar a través de un algoritmo de clasificación de topología para mejorar el rendimiento de inicio de la aplicación.

Específicamente, el proceso de inicio de la aplicación de Android se puede ver como un gráfico dirigido, donde los nodos representan diferentes componentes y los bordes representan dependencias entre componentes. Por ejemplo, es posible que una actividad deba esperar a que otras actividades completen la inicialización antes de comenzar. Al construir un gráfico acíclico dirigido efectivo, estas dependencias se pueden visualizar y el orden de inicio se puede determinar de acuerdo con el algoritmo de clasificación de topología, lo que reduce el tiempo de espera innecesario y mejora la velocidad de respuesta de la aplicación.

Inicio de Android

El inicio de Android proporciona una forma más simple y eficiente de inicializar los componentes cuando se inicia la aplicación. Los desarrolladores pueden usar el inicio de Android para simplificar la secuencia de inicio y establecer explícitamente el orden de inicialización y las dependencias entre los componentes. Al mismo tiempo, el inicio de Android admite la espera síncrona y asíncrona, el control manual del tiempo de ejecución dependiente y garantiza el orden de inicialización de los componentes dependientes internos a través de la clasificación de topología de gráficos acíclicos dirigidos.

Enlace: un gran artículo sobre el inicio de Android

Supongo que te gusta

Origin blog.csdn.net/qq_43358469/article/details/132017609
Recomendado
Clasificación