Cómo la aplicación de Android OkCredit mejoró el arranque en frío en un 70% | Autor Anjal Saneen | Buen crédito | Agosto de 2021
Un buen lanzamiento de la aplicación es esencial para una mejor experiencia de usuario en Okcredit. Reconociendo esto en los últimos seis meses, el equipo que brinda soporte técnico para nuestras aplicaciones de Android comenzó a medir, analizar, identificar cuellos de botella y mejorar el rendimiento de inicio. Finalmente, redujimos el tiempo de inicio de la aplicación en un 70%, y esta es la historia de cómo lo hicimos.
¿Cuál es la hora de inicio en frío?
Según la documentación de Android:
Arranque en frío significa que la aplicación se inicia desde el principio: el proceso del sistema no ha creado el proceso de aplicación antes de este inicio. Un inicio en frío ocurre cuando su aplicación se inicia por primera vez desde que se inició el dispositivo o después de que el sistema finaliza la aplicación.
En pocas palabras, cuando la aplicación se abre desde el estado finalizado hasta que el primer marco de la aplicación está completamente cargado, se realiza un seguimiento del tiempo de inicio en frío. Este es un indicador para reproducir pistas de consola. ¿Qué es el arranque en frío?
Hasta el primer sorteo, pasarán muchas cosas.
- Cargue e inicie la aplicación.
- La ventana de vista previa de la aplicación se muestra inmediatamente después del inicio.
- Crea un proceso de solicitud.
- Cree un objeto de aplicación.
- Inicie el hilo principal.
- Crea el evento principal.
- Opiniones infladas.
- Diseñe la pantalla.
- Realiza un sorteo inicial.
Si quieres conocer más sobre cada etapa, te recomendamos leer esta maravillosa serie de artículos de Py ⚔.
Medida, medida, medida
En Okcredit comenzamos a invertir en análisis confiables y métricas de rendimiento, lo que nos permitió comprender cómo difieren las métricas en cada versión y recopilar más información sobre el arranque en frío. Puedes ver cómo detectamos estas métricas en el repositorio de Github.
Dividimos el tiempo de arranque en frío en 4 etapas y comenzamos a enumerar las medidas de mejora para cada etapa. Después de ejecutar cada elemento de acción, verificamos el impacto después del lanzamiento.Estas son las 4 etapas
- Manejo de bifurcaciones a proveedores de contenido: La duración entre el proceso de solicitud bifurcado de Zygote y la primera inicialización del proveedor de contenido. Aquí se creará el objeto de la aplicación y se iniciará el hilo principal. Los desarrolladores tienen poca influencia en las mejoras aquí.
- Proveedor de contenido de la aplicación OnCreate (): La duración entre la primera inicialización del proveedor de contenido y el comienzo. App.OnCreate ()Incluye todo el tiempo empleado por el proveedor de contenido en la aplicación.
- App OnCreate () comienza a App OnCreate () finaliza: Intervalo de tiempo entre el inicio App.OnCreate () Hasta el final App.OnCreate (). Incluye el tiempo dedicado App.OnCreate ()
- La aplicación OnCreate () comienza a dibujar el marco por primera vez: La duración entre el final de App.OnCreate () y el primer marco de dibujo. Incluye el tiempo que lleva inicializar la actividad inicial, inflando el primer diseño, Medición() y dibujar() Se utiliza para el diseño inicial.
Usamos la creación de perfiles de CPU de Android Studio para identificar métodos que deben ejecutarse durante mucho tiempo durante el inicio de la aplicación. Para registrar automáticamente la actividad de la CPU durante el inicio de la aplicación, siga los pasos de este documento.
1. La pereza de la daga
Dagger Lazy es una excelente manera de retrasar la inicialización de objetos costosos. Antes de que necesitemos estos objetos, no se inicializarán y ahorrarán un tiempo precioso durante el inicio de la aplicación.
En la imagen de arriba, puedes ver la clase. IAwsServiceImp_Factory La inicialización está tardando mucho. Esta clase se usa para cargar archivos que no se usan durante el inicio de la aplicación. Inicializar clases de manera perezosa de esta manera nos ayuda a reducir el valioso tiempo de inicio de la aplicación.
2. Descargue la inicialización del SDK desde App.OnCreate () al hilo de fondo.
Todo el código en App.OnCreate () se ejecutará como parte del proceso de inicialización en el hilo principal.Se recomiendan muchas bibliotecas y SDK en Application.onCreate ()Esto eventualmente aumentará el tiempo de inicio de la aplicación. Descargamos algo de inicialización del hilo principal al hilo de fondo.
override fun onCreate()
super.onCreate() setupDependencyInjection()
observeProcessLifecycle() Executors.newSingleThreadExecutor().execute
firebaseRemoteConfig.get().fetchAndActivate()
setupJobScheduler()
setupAppsFlyer()
setupAnalytics()
trackDeviceInfo()
Anteriormente usamos GlobalScope.launch de la corrutina para desinstalar en el hilo de fondo. Posteriormente cambiamos a ExecutorService. ExecutorService está siendo precargado por Zygote. Una corrutina que no está precargada tiene un alto costo de inicialización. Puede leer este artículo para obtener más información.
3. Refactorice el diseño de la pantalla de inicio en una jerarquía de vista plana
Usamos el diseño de restricciones para aplanar la jerarquía de vistas. Esto mejora el diseño y la fase de medición de la representación del cuadro inicial.Medimos constantemente Medición() y dibujar() La duración de estos diseños es respectivamente.
4. Elimina el seguimiento de Firebase durante el inicio de la aplicación.
Firebase Performance Monitoring es un servicio que lo ayuda a obtener información valiosa sobre las características de rendimiento. Proporciona funciones útiles, como indicadores de desempeño para un solo método y muchos otros indicadores de desempeño. Desafortunadamente, Firebase Performance Library también tiene algunos costos ocultos. Lo inicializa el proveedor de contenido, que pasa mucho tiempo durante el inicio de la aplicación.Lo más importante, somos App.OnCreate () Se utiliza para medir el rendimiento de la producción. Esto también llevó mucho tiempo. Así que decidimos eliminar el rendimiento de la base de fuego de la aplicación y usaremos herramientas de inspección internas.
5. Elimina el objeto de fecha y hora de la pantalla de inicio.
usamos org.joda.time Como biblioteca de fecha y hora en la aplicación. Es una biblioteca de tiempo de Java popular.Resulta que solo uno org.joda.time.DateTime () El objeto causará una desaceleración significativa durante el inicio de su aplicación porque se usa internamente getResourceAsStream () Cargando datos de zona horaria, que es muy lento.Evitamos DateTime durante el inicio de la aplicación, estamos migrando la biblioteca de fecha y hora a tiempo.
6. Inicialización retrasada de proveedores de contenido
Tenemos base de fuego, administrador de trabajo, ciclo de vida y un servicio de terceros inicializado a través de un proveedor de contenido. Inicializamos perezosamente el administrador de trabajo usando su inicialización bajo demanda.Todos los demás proveedores de contenido deben inicializarse primero App.OnCreate (), Por lo que no podemos inicializar de forma perezosa.
Además, la biblioteca de inicio de la aplicación Jetpack AndroidX proporciona una forma de inicializar el proveedor de contenido de forma perezosa. Otro beneficio que ofrece la biblioteca de inicio de jetpack es que, en lugar de definir un proveedor de contenido separado para cada componente que debe inicializarse, le permite definir un inicializador que comparte un único proveedor de contenido. Esto generalmente le ahorra a cada proveedor de contenido alrededor de 2 milisegundos. No hicimos esto porque solo tenemos 3 proveedores de contenido, por lo que el impacto es mínimo.
7. Evite las operaciones de E / S y la deserialización de JSON en el subproceso principal durante el inicio de la aplicación.
Habilitamos StrictMode para capturar todas las operaciones de E / S en el inicio de la aplicación y repararlas. Algunos de estos ocurrieron en servicios de terceros, y los informamos.
Al invertir mucho en análisis confiables y estar atentos a la identificación de problemas de inicio de aplicaciones, pudimos reducir el porcentaje de inicio en frío del 4% a aproximadamente el 1,2%.
Espero que nuestra experiencia le ayude a reducir el tiempo de inicio en frío de la aplicación. Hoy, en OkCredit, monitoreamos múltiples paneles que nos brindan información sobre el desempeño de las partes más críticas de la aplicación para asegurarnos de que la aplicación OkCredit continúe siendo divertida para nuestros usuarios.
- https://dev.to/pyricau/android-vitals-what-time-is-it-2oih
- https://developer.android.com/topic/performance/vitals/launch-time
- https://developer.android.com/reference/android/os/StrictMode
Si está interesado en construir más de 50 millones de MIPYMES en la India, consulte nuestras oportunidades.