APLICACIÓN iQIYI Optimización del rendimiento de la máquina de gama baja de Android

01

   fondointroducir

En el mercado de los teléfonos inteligentes, los modelos de gama alta suelen atraer la mayor atención, pero los modelos de gama baja también ocupan una cuota que no se puede ignorar. Para satisfacer las necesidades del mercado de gama baja, muchos fabricantes continúan lanzando series de teléfonos móviles de gama baja. Además, los modelos de gama media a alta de los últimos años ahora se han clasificado como modelos de gama baja con la rápida iteración del hardware del sistema. La aplicación iQiyi tiene una enorme base de usuarios, entre los cuales los usuarios de modelos de gama baja también representan una parte considerable. La optimización de máquinas de gama baja puede brindar a estos usuarios una experiencia de usuario estable, fluida y eficiente. A continuación se presentará la estrategia de optimización de la aplicación iQiyi para máquinas de gama baja desde tres dimensiones: arranque en frío, fluidez y velocidad de carga.


Estrategia de clasificación de máquinas de gama baja
Antes de introducir la optimización, veamos los estándares de las máquinas de gama baja. El juicio sobre las máquinas de gama baja suele basarse en factores como el modelo del dispositivo, el tamaño de la memoria y la versión del sistema. La aplicación iQiyi tiene su propia estrategia de calificación de máquinas de gama baja, que puede configurar estrategias de optimización por escenario (inicio, fluidez, etc.) y niveles (memoria, modelo, sistema, etc.) en el fondo de la política para garantizar la mejor experiencia en diferentes escenarios.

02

   Iniciar optimización

El lanzamiento es la primera puerta que una aplicación abre a los usuarios. Su consumo de tiempo afecta directamente la experiencia de visualización y retención posterior del usuario y tiene un impacto significativo en los indicadores comerciales. Por lo tanto, la optimización de la puesta en marcha es un contenido de trabajo clave en la dirección de la optimización técnica.

Introducción relacionada

El punto de partida y el punto final de la fase de inicio: la aplicación iQiyi utiliza Application.attachBaseContext como punto de partida; los datos de la página de inicio muestran el punto final. La duración de esta fase se considera el tiempo normal de inicio en frío en línea. Esto pasa principalmente por la etapa de creación de la aplicación, la etapa de creación y visualización de MainActivity, la publicidad, la carga y representación de datos de navegación superior e inferior de la página de inicio, la carga y representación de datos de la página de inicio.
En este proceso, es necesario clasificar qué trabajo ha realizado la capa empresarial, evaluar la necesidad y el momento de su ejecución y la racionalidad del hilo de programación; es necesario monitorear el estado del hilo principal para ver si; ha caído en un estado de suspensión prolongado; el mensaje del hilo principal/en segundo plano Monitoreo y gestión de mensajes, si se activan tareas que no cumplen con las expectativas, si se utilizan por completo los recursos del sistema, si se utilizan por completo las oportunidades inactivas para la precarga, etc.
Atomización de funciones comerciales: para programar tareas en la fase de inicio de manera ordenada y asignar recursos de manera razonable, se desarrolló un conjunto de marco de administración de tareas TaskManager y la implementación de funciones comerciales se empaquetó en tareas personalizadas, se dividió en suficientes detalles y diseñado Determine las dependencias de ejecución entre Tareas, los subprocesos que se espera que se programen para la ejecución, el tiempo de ejecución, etc., y luego entréguelos al TaskManager para su procesamiento unificado. Esta capa de gestión de tareas es la base para nuestra implementación de la optimización del inicio.


Práctica de optimización

Combinación de página de inicio de pantalla abierta

En los primeros días, la aplicación iQiyi tenía dos actividades: la pantalla de inicio y la página de inicio. Las dos actividades trajeron algunos problemas de experiencia del usuario: la máquina de gama baja obviamente se retrasa cuando se abre la pantalla y se ingresa a la página de inicio. no se muestra inmediatamente y el usuario puede ver los datos de la página de inicio y las imágenes tienen un proceso de carga desde cero.
La mayoría de las escenas en la fase de apertura de pantalla tienen anuncios de apertura de pantalla. Fusione la página de apertura de pantalla y la página de inicio en una sola actividad. Utilice la fase de publicidad de apertura de pantalla para cargar la página de inicio debajo de la página de apertura de pantalla y separe los datos de la página de inicio y la interfaz de usuario. visualización para procesamiento paralelo Al maximizar esta etapa, la página de inicio se puede mostrar inmediatamente al final de la pantalla de inicio y los retrasos en máquinas de gama baja se mejoran significativamente .
La representación de la página de inicio también tiene un cierto impacto en la apertura del anuncio en pantalla. La visualización de la cuenta regresiva de los anuncios es inestable y los efectos de algunos tipos de anuncios no son fluidos. La carga de la página de inicio se divide en muchos pasos para resolver el problema de activar la devolución de llamada del anuncio. La visualización de la cuenta regresiva utiliza la representación de SurfaceView para garantizar su estabilidad.


Optimización de la programación de tareas

Según el tipo de inicio, organice la secuencia de ejecución de la tarea en la fase de inicio para avanzar, retrasar o no ejecutar, de modo que los usuarios puedan ver la página de destino lo antes posible. Los siguientes son ajustes realizados por iQiyi a las tareas bajo la ruta de inicio normal de máquinas de gama baja.


Resolver la disputa por bloqueo

Competencia de bloqueo de carga de biblioteca nativa: la carga de la biblioteca de la capa C está bloqueada. La capa Java abre varios subprocesos para cargar la biblioteca Lib. Después de llegar a la capa C, la carga aún se realizará en secuencia, lo que provocará que el subproceso de la capa Java se bloquee. y espera. iQIYI necesita cargar la biblioteca Lib en la etapa de Aplicación y necesita llamar al método JNI relevante después de que el hilo principal espera a que se complete la carga y cuando se encuentra con la situación en la que el módulo de reproducción abre la página de reproducción para fines externos; Es necesario precargar la reproducción. Se requiere la biblioteca Lib relacionada, lo que hará que el hilo principal entre en un estado de espera. Al identificar la página de inicio de destino durante la fase de inicio, puede decidir si realizar la precarga de la biblioteca Lib relacionada con la reproducción, evitando así el retraso de la mayoría de los usuarios que normalmente comienzan en la página de inicio. (Máquina de prueba Redmi K40, sistema Android12)

Competencia de bloqueo de recursos: antes de que se muestre la página de inicio de iQiyi, otros módulos precargan archivos de diseño en subprocesos, lo que genera una feroz competencia por los bloqueos de capa LayoutInfalter/ResourceManager/AssertsManager. Programe la tarea de precargar el diseño que se ejecutará después de que se muestre la página de inicio y restrinja el diseño precargado para que se ejecute en el mismo subproceso. Puede ver que la cantidad de conflictos de bloqueo se reduce considerablemente después de la mejora, lo que permite la ejecución. La página de inicio se mostrará más rápido.


Perfiles de referencia

Perfiles de referencia: Google lanzará perfiles de referencia en 2022, lo que permitirá a los desarrolladores crear perfiles de referencia de código de punto de acceso personalizados en apk. Durante la instalación de la aplicación, el sistema precompila los códigos de los puntos de acceso por adelantado a través de archivos de configuración. Puede omitir los pasos de interpretación y compilación justo a tiempo de las rutas de código incluidas en el tiempo de ejecución para mejorar la velocidad de la primera ejecución del código de inicio.
Perfiles de inicio: los perfiles de inicio son un subconjunto de los perfiles básicos mencionados anteriormente. El uso de perfiles de inicio puede mejorar el diseño del código en el archivo DEX del APK, optimizando así aún más las clases y métodos incluidos. La aplicación iQiyi crea el código de la fase de inicio en el mismo archivo DEX a través del archivo de configuración de inicio. Utilizando las dos estrategias anteriores, la velocidad de primer inicio de la aplicación iQiyi en algunos modelos aumenta aproximadamente un 10%.



Optimización del lanzamiento de enlaces externos

Obtener enlaces externos también es una forma importante de comenzar. Generalmente se inicia mediante H5, uso compartido, aplicaciones de terceros, etc. La diferencia con el inicio en frío normal es que los enlaces externos a menudo no son la página de inicio, sino un objetivo específico. página. El escenario más común para iQiyi es abrir la página de reproducción. Si identificamos la página de destino con anticipación (etapa de solicitud), podemos ajustar la prioridad de la tarea para la página de inicio. Cuando el enlace externo abre la página de reproducción. Identifique la página de reproducción de antemano y asocie el reproductor con ella. La tarea se inicializa de antemano. A través de esta estrategia, los enlaces externos integrados de gama baja pueden acelerar la transmisión en aproximadamente 1,5 segundos.


03

   Optimización de fluidez

Introducción relacionada
La mayoría de las páginas de la aplicación iQiyi se desarrollan en base al marco Card de desarrollo propio. El marco de la tarjeta es un marco de interfaz de usuario altamente reutilizable. Basado en el uso de código nativo para implementar el diseño de interfaz de usuario básico y la lógica empresarial, el estilo básico del contenedor se controla mediante el control CSS emitido por el backend para lograr la reutilización general y dinámica del bloque de página. ajuste de estilos de contenido. Es una solución para que podamos lograr la reutilización general de la página y el ajuste local en ambos extremos (Android e IOS). Sobre la base de este marco, se optimiza la fluidez de las páginas en la aplicación. El marco de la tarjeta tiene las siguientes características:
  • Alta reutilización: los bloques de contenido (Bloques) se componen de controles, las filas se componen de varios bloques, las Tarjetas se componen de varias filas y la página de lista completa se compone de varias Tarjetas. La unidad de negocio reutilizable más pequeña es Block.
  • Altamente dinámico: admite la configuración de archivos CSS en segundo plano y la modificación dinámica del estilo de una determinada interfaz de usuario (tamaño del texto, color, esquinas redondeadas, etc.).

Práctica de optimización

Estilo Nativo

La dinámica y la reutilización de la página de la Tarjeta generan complejidad en el diseño de la interfaz de usuario. Un tipo de bloque debe ser compatible con múltiples estilos. Por ejemplo, las cuatro esquinas de una imagen deben estar incrustadas con varios tipos de lógica de subíndice. Los tipos de subíndice incluyen imágenes puras, texto sin formato, imágenes + texto y, opcionalmente, seleccione. forma media. La implementación de varios estilos dará como resultado una gran cantidad de vistas y niveles de anidamiento profundos, lo que hará que algunas páginas no sean lo suficientemente fluidas como para deslizarse en máquinas de gama baja.
Para optimizar esta situación, se seleccionaron algunas Tarjetas con formas comerciales estables, se solidificaron los estilos de estas Tarjetas y se simplificó enormemente el diseño. Esto provoca un aumento significativo de la velocidad de cuadros al deslizar hacia arriba y hacia abajo. Por ejemplo, en la tarjeta de flujo en cascada, redujimos el número de Vistas implementadas de 40+ a 17, y redujimos el nivel de diseño de 6 a 2 capas en diferentes máquinas de gama baja , lo que generó entre un 10 % y un 20 % de marco deslizante; tasa aumentada .

Ver dibujo combinado
El efecto de mejora aportado por la estrategia de simplificación del diseño anterior es obvio, pero debido a la diversificación de las formas comerciales, algunas vistas necesarias no se pueden eliminar. Para reducir aún más la cantidad y el nivel de Vistas, varias vistas en diseños de bloques de uso común se fusionan en una Vista personalizada, y el lienzo de la Vista se usa para dibujar texto, imágenes, botones y otra información de estilo. Este método puede reducir efectivamente la cantidad de Vistas y niveles de anidamiento, pero aún necesita manejar el evento de clic y el efecto de presión de cada elemento. En máquinas de gama baja , esta estrategia puede provocar un aumento deslizante de la velocidad de fotogramas de aproximadamente 1 a 2 fps .


Precreación y carga asincrónica

Creación previa del diseño: entre los tres estilos de Tarjetas presentados en la imagen de arriba, se utiliza el mismo tipo de bloque (imagen de arriba y de abajo). Precargamos estos diseños de bloques de uso común y altamente reutilizables en el grupo de caché durante la fase de inicio, de modo que los diseños creados previamente se puedan usar directamente en la lista deslizante, reduciendo así el tiempo de inflación en el dibujo de la interfaz de usuario.
Creación asincrónica de diseño : la creación previa tiene un buen efecto en los diseños de uso común, pero los diseños poco comunes aún representan la mayoría. Este tipo de diseño utiliza AsyncLayoutInflater para crear de forma asincrónica el diseño que aparecerá durante el proceso de desplazamiento, lo que reduce el tiempo de creación del. diseño de desplazamiento en el hilo de la interfaz de usuario Al mismo tiempo, también puede mejorar la eficiencia de la captación previa de RecyclerView.
Captura previa de RecyclerView: muchas páginas de la aplicación iQiyi utilizan RecyclerView anidado para crear formularios de productos de desplazamiento horizontal. La mayoría de las tarjetas en este formulario mostrarán de 3 a 5 elementos en una pantalla. Se establecen diferentes configuraciones de captura previa según los diferentes formularios (setInitialPrefetchItemCount, el valor predeterminado es 2). puede reducir el retraso cuando este tipo de tarjeta está expuesta.
El hilo principal reduce la ejecución de tareas que no son de UI : lleva tiempo detectar el hilo principal durante el proceso de desplazamiento. Se descubre que algunas tareas que no son de dibujo se ejecutan en el hilo principal. El hilo de UI analiza JSON y establece enlaces de bases de datos. , etc. y los coloca en tareas asincrónicas para su ejecución.


Programación de mensajes de UI de arranque en frío

Durante el proceso de arranque en frío de las máquinas de gama baja, el consumo de recursos alcanzará gradualmente un estado máximo; hay una gran cantidad de mensajes de la interfaz de usuario (que deben ejecutarse en el subproceso de la interfaz de usuario) y otras tareas en segundo plano que deben ejecutarse. A través de la interceptación y el análisis de puntos enterrados, en esta etapa es necesario ejecutar más de 4000 mensajes (en 15 segundos) en el hilo de la interfaz de usuario. El tiempo de ejecución de estos mensajes oscila entre 1 ms y 150 ms en máquinas de gama baja. Cuando se ejecutan estos mensajes, los mensajes de representación de la interfaz de usuario del sistema se retrasarán. En las máquinas de gama baja, los usuarios enfrentan problemas como retraso de deslizamiento y respuesta lenta al hacer clic cuando se inicia la aplicación por primera vez.
Para abordar este problema, nuestra solución es interceptar todos los mensajes enviados al hilo de la interfaz de usuario y agregarlos a una cola de mensajes personalizada, luego monitorear si la cola de mensajes de la interfaz de usuario del sistema está inactiva y, cuando esté inactiva, sacar los mensajes de la cola personalizada y redirigirlos; a la cola de mensajes de la interfaz de usuario del sistema para su ejecución; además, se agrega un mecanismo de lista blanca para publicar algunos mensajes de alta calidad. Existe un mecanismo alternativo para manejar excepciones.
Al programar mensajes de interfaz de usuario, el retraso de las máquinas de gama baja durante la fase de arranque en frío se ha mejorado significativamente mediante el monitoreo de big data en línea y la cantidad de fotogramas congelados y perdidos se ha reducido significativamente. Durante la fase de inicio en frío , la velocidad de cuadros aumenta aproximadamente 8 fps .


Estrategia de degradación del rendimiento

En máquinas de gama baja, degradar algunos efectos puede reducir eficazmente el retraso en escenarios específicos. La aplicación iQiyi ha implementado la siguiente estrategia de degradación.
Degradación de efectos de movimiento: efectos de movimiento de navegación superior e inferior degradados a imágenes estáticas, efectos de movimiento de control de reproducción desactivados, efectos de movimiento simplificados para algunas funciones del producto, etc.
Degradación de reproducción: estrategias como continuar la reproducción retrasada y no iniciar algunas escenas.
Degradación de la precarga de ViewPager: desactiva la precarga de las pestañas izquierda y derecha, lo que reduce el tiempo de dibujo de la vista y la sobrecarga de memoria.
Degradación de imagen: algunas animaciones de páginas no se reproducen y las imágenes utilizan el formato de 565 píxeles.


04

   Optimización de la velocidad de carga

Introducción relacionada
Además de la optimización de inicio antes mencionada, también nos centramos en optimizar algunas páginas importantes, porque los usuarios visitan estas páginas con mucha frecuencia y su optimización puede mejorar significativamente la experiencia del usuario. Por ejemplo, la búsqueda es una de las funciones que utilizan con frecuencia los usuarios, por lo que hemos analizado cuidadosamente el comportamiento de búsqueda y optimizado cada paso de la búsqueda.

Práctica de optimización

pre-solicitud

Por lo general, el proceso de representación de la página generalmente comienza desde el método onCreate de la actividad. Luego realice una solicitud de red para obtener los datos necesarios. Después de obtener los datos específicos, la página se representa. También seguimos este proceso en el escenario de búsqueda anterior.
¿Es posible obtener los datos requeridos por adelantado?
De hecho, cuando el usuario hace clic en el cuadro de búsqueda de la página de inicio, ya tiene los parámetros necesarios para la solicitud de red. Luego, puede iniciar una solicitud de red por adelantado al hacer clic. La solicitud de red y el salto de página se realizarán simultáneamente, lo que acorta el tiempo de solicitud de red. Si el rendimiento de la máquina es peor, más tiempo tardará la página en hacer clic en el método onCreate y más tiempo tardará en optimizarse. El tiempo de verificación en máquinas de gama baja se reduce en unos 200 ms.


Emitido en lotes

Cuando el usuario ingresa a la página, solo se mostrarán los datos de la primera pantalla, mientras que los datos en la parte inferior de la página no se pueden mostrar hasta que el usuario realice una operación de deslizamiento. Por lo tanto, damos prioridad a garantizar la visualización de los datos de la primera pantalla. Al reducir el tamaño de la primera entrega de datos, reducimos el tiempo necesario para la adquisición, la transmisión y el análisis de los datos. Una vez completada la representación de los datos de la primera pantalla, iniciaremos una solicitud de interfaz nuevamente para garantizar que los datos posteriores puedan presentarse inmediatamente cuando el usuario realice una operación de deslizamiento. Esta solución se utiliza para la optimización en muchas páginas clave, como la página de inicio, la página de media reproducción y la búsqueda. Por ejemplo, cuando se utiliza esta solución en el escenario de búsqueda, el tiempo de verificación se reduce en aproximadamente 200 ms.


pre-creado

Creación previa del diseño: cuando la página intermedia de búsqueda está inactiva, creamos diseños altamente reutilizables en el caché por adelantado. Cuando la página realmente se representa, el diseño creado previamente se utiliza directamente para evitar el tiempo de inflar la vista.
Creación previa de fragmentos: cuando la página intermedia de búsqueda está inactiva, el contenedor de fragmentos de la página de resultados se crea por adelantado. No es necesario crear el contenedor correspondiente cuando se muestra la página de resultados, lo que reduce el tiempo necesario para crear el contenedor.



Optimización del hilo principal

Cuando se carga la página, se espera que las tareas del hilo principal relacionadas con la página se ejecuten primero tanto como sea posible. Si se adelanta la programación de tareas importantes, el efecto de representación de la página se verá afectado. A través de nuestra herramienta interna Tracepeed de desarrollo propio, que se hace cargo de Looper.loop() del hilo principal, podemos descubrir las tareas que consumen mucho tiempo en el hilo principal. Si descubre que las tareas de baja prioridad que llevan mucho tiempo se ejecutan primero, puede ajustar el cronograma de tareas para que las tareas importantes se ejecuten primero.
Por ejemplo, durante el proceso de carga de la página de resultados de búsqueda, la carga de imágenes es una tarea importante. Sin embargo, en máquinas de gama baja, se encuentra que en algunos casos otra tarea se adelantará al hilo principal, lo que hace que el tiempo de carga de la imagen a veces tarde hasta 1 segundo. Para este escenario, ajuste la programación de tareas para que la tarea de carga de imágenes se ejecute primero y el consumo de tiempo se estabilice en más de 100 ms.

Optimización de la lógica empresarial

Para diferentes negocios, también analizamos la lógica empresarial específica y optimizamos la lógica relevante:
  • Optimización de imágenes vacías: cuando se carga la selección, en algunos escenarios, el backend entregará una imagen vacía y esta imagen vacía también se cargará, lo que aumentará el tiempo de carga de la página. Por lo tanto, limitamos la carga de imágenes vacías.
  • Optimización lógica de alta frecuencia: al optimizar, los métodos de alta frecuencia son un punto en el que debe centrarse. Al optimizar algunos métodos de alta frecuencia de uso común, se puede optimizar el consumo de tiempo de cada página. Por ejemplo: en la inicialización de controles básicos, evita la ejecución de métodos inútiles y reduce el tiempo que consumen estos métodos de alta frecuencia.
  • Ejecución asincrónica de métodos que requieren mucho tiempo: durante el proceso de carga de la página, también habrá cierta lógica empresarial con baja prioridad. Cuando se descubren estas lógicas, se pueden ejecutar a través del marco asincrónico, lo que reduce el tiempo de carga de la página.


Anti-deterioro

Después de una optimización continua, el tiempo de carga de la página ha alcanzado un nivel estable. Sin embargo, durante las iteraciones de desarrollo en curso, notamos algunos aumentos en el consumo de tiempo. ¿Cómo prevenir eficazmente que se produzca este tipo de deterioro?
Al incorporar métodos clave en el código, las tareas de canalización se ejecutan regularmente todos los días y el valor promedio se calcula después de múltiples ejecuciones. Utilice métodos visuales para detectar fluctuaciones en la carga de la página. Si hay deterioro, puede encontrar intuitivamente la diferencia en el tiempo entre las dos tareas mediante la comparación de tareas, y analizar y optimizar la diferencia en el tiempo.


05

  Resumen y perspectivas

La optimización de máquinas de gama baja incluye muchos aspectos. Algunos de los métodos de optimización presentados anteriormente en varios escenarios comerciales centrales priorizan los problemas de rendimiento clave y mejoran efectivamente el rendimiento operativo de las máquinas de gama baja. Entre ellos, se encuentran el análisis de herramientas, el monitoreo en línea y los estándares de medición. Requerido No mencionado aquí, estas también son herramientas importantes para la optimización del rendimiento. Android está seriamente fragmentado y queda un largo camino por recorrer para optimizar los teléfonos de gama baja. En el futuro, continuaremos refinando y encontrando nuevos puntos de avance para la optimización, utilizaremos la innovación tecnológica para brindar a los usuarios una experiencia de usuario estable y fluida y promoveremos un crecimiento de alta calidad.


Este artículo se comparte desde la cuenta pública de WeChat: Equipo de productos de tecnología iQIYI (iQIYI-TP).
Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Este artículo participa en el " Plan de creación de fuentes OSC ". Los que están leyendo pueden unirse y compartir juntos.

¡Compañero pollo deepin-IDE de "código abierto" y finalmente logró el arranque! Buen chico, Tencent realmente ha convertido Switch en una "máquina de aprendizaje pensante" Revisión de fallas de Tencent Cloud del 8 de abril y explicación de la situación Reconstrucción de inicio de escritorio remoto de RustDesk Cliente web Base de datos de terminal de código abierto WeChat basada en SQLite WCDB marcó el comienzo de una actualización importante Lista de abril de TIOBE: PHP cayó a un mínimo histórico, Fabrice Bellard, el padre de FFmpeg, lanzó la herramienta de compresión de audio TSAC , Google lanzó un modelo de código grande, CodeGemma , ¿te va a matar? Es tan bueno que es de código abierto: herramienta de edición de carteles e imágenes de código abierto
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4484233/blog/11052737
Recomendado
Clasificación