ShareChat soluciona los problemas de bloqueo para aumentar el desplazamiento del feed en un 60%
Organiza tus páginas con colecciones
Guarda y categoriza el contenido según tus preferencias.
Introducción
ShareChat es una plataforma de redes sociales líder en la India que permite a los usuarios compartir sus opiniones, documentar sus vidas y hacer nuevos amigos en su lengua materna. Otras funciones incluyen salas de chat y mensajería privada, que permiten a los usuarios compartir videos, chistes, canciones y otro contenido social basado en el idioma. Como misión para encabezar la revolución de Internet en la India, ShareChat está cambiando la forma en que los próximos mil millones de usuarios interactuarán en Internet.
La app en cantidades
- Más de 100 millones de descargas
- Más de 180 millones de usuarios activos por mes
- Más de 32 millones de creadores de contenido
- 15 idiomas diferentes de la India
- ~1.5 millones de publicaciones creadas a diario
El desafío
A medida que miles de personas atraían a ShareChat a diario, la app se enfrentaba al desafío de entregar nuevos fotogramas de manera constante, lo que generaba tiempos de respuesta deficientes, lo que impedía la experiencia del usuario.
Como resultado, la app experimentó una mayor cantidad de fotogramas perdidos o retrasados (también conocidos como “Bloqueos”). Corregir estos problemas de bloqueo mejorando los fotogramas lentos y congelados fue fundamental para brindar una experiencia fluida a todos sus usuarios. Esto también desempeñaría un papel importante para lograr que los usuarios pasen más tiempo en la app, aumentar la participación y, a su vez, mejorar la calificación de ShareChat en Play Store de Android.
Cómo lo lograron
ShareChat trabajó con el equipo de relaciones con desarrolladores de Google para reducir los bloqueos y generar un impacto comercial positivo mejorando los fotogramas lentos y congelados (bloqueo) en la app. Específicamente, trabajaron en la mejora de los siguientes problemas:
Grupo de RecyclerView compartido: Mediante la generación de perfiles, se observó que la creación de diferentes contenedores de vistas lleva más tiempo y, para minimizarlo, se creó un grupo de RecyclerView compartido. Esto también ayudó a quitar el costo de creación de contenedores de vistas para feeds similares.
Pases de diseño excesivos: Mediante el generación de perfiles, también se observó que algunos contenedores de vistas solicitaban requestLayouts adicionales. Para optimizarlo, se actualizó el código a fin de que tenga valor en el tiempo de creación en lugar de cada vinculación, lo que ahorra costos adicionales de requestLayout.
OverDraw: Se simplificaron los diseños para reducir las capas y quitar los colores que se configuraban por separado para cada una de las capas.
Aplanamiento de jerarquía: se observó un aumento prolongado a través de la generación de perfiles y la inspección manual de muchas pantallas. Para solucionar este problema, se acopló la jerarquía con ConstraintLayout.
Aumento excesivo de vistas: Se identificó el tiempo de aumento prolongado para ciertas vistas durante la generación de perfiles. Estas vistas se convirtieron en viewstubs.
Eliminación de tareas pesadas del subproceso de IU: El uso de un generador de perfiles permite observar algunos lugares en los que se realizaban tareas pesadas en el subproceso principal, como la creación de SpannableStringBuilder con etiquetas y estilos de todas las vinculaciones de recyclerView, decodificación de BlurHash, etc. Se quitaron del subproceso de IU y se movieron a un subproceso en segundo plano.
Migración de Rx a Corrutinas: El consumo de memoria también generó llamadas de recolección de elementos no utilizados frecuentes, y había un alto recuento de subprocesos a través del subproceso de RX superior a 100. Muchos de los casos de uso se trasladaron a Corrutina para solucionar estos problemas.
Adopción de Coil para la carga de imágenes: Glide causaba problemas durante la carga de imágenes, específicamente en los componentes compilados a través de la composición del jetpack. También se identificó que mientras se cargaban imágenes en LazyColumn, la barra del umbral de renderización estaba alta. Estos casos llevaron a la adopción de Coil para la carga de imágenes.
Limpieza y refactorización de código antiguo: Quitar el código y los experimentos antiguos ayudó a quitar las vistas ocultas innecesarias de la IU y ayudó a reescribir mejor algunas de las pantallas.
Resultados
Al analizar las áreas de mejora e identificar las estrategias de optimización, ShareChat pudo mejorar la experiencia general de los usuarios y aumentar su tasa de participación y las calificaciones de Play Store. A continuación, encontrarás una descripción general cuantitativa de los resultados que obtuvo ShareChat:
- Una reducción de aproximadamente un 45% en los fotogramas con "renderización lenta" en Play Store.
- ~ Un 30% de reducción en los fotogramas de “Frozen” en Play Store
- La velocidad de fotogramas con bloqueos por cada 10,000 fotogramas renderizados se redujo del 10.72% al 3.98%.
- El desplazamiento del feed aumentó un 60%
- Las calificaciones generales en la tienda aumentaron de aproximadamente 4.0 a 4.3.
- Aumento del 10% en el consumo de publicaciones
"En ShareChat, nuestro objetivo es ser la mejor app de redes sociales
que deleite a nuestros usuarios.Esto también significa ser la mejor app en términos de rendimiento.
Nuestra colaboración con el equipo de Relaciones con Desarrolladores de Google nos ayudó a identificar áreas de mejora en nuestros dispositivos de baja gama más usados. Conocimos las prácticas recomendadas y las herramientas de rendimiento para identificar y corregir fotogramas congelados, bloqueos, superposiciones y ANR”.
– Vihaan Verma, gerente de Ingeniería, equipo de Android en ShareChat
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-07-27 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-07-27 (UTC)"],[],[],null,["# ShareChat addresses Jank issues to increase feed scrolling by 60%\n\nIntroduction\n------------\n\nShareChat is a leading social media platform in India that allows users to share their opinions, document their lives, and make new friends in their native language. Other features include chatrooms, and private messaging, enabling users to share videos, jokes, songs and other language-based social content. On a mission to spearhead India's internet revolution, ShareChat is changing how the next billion users will interact on the internet.\n\nThe app in numbers\n\n- **100 Million+** downloads\n- **180 Million+** Monthly Active Users\n- **32 Million+** content creators\n- **15** different Indian languages\n- **\\~1.5** Million posts created daily\n\nThe Challenge\n-------------\n\nAs ShareChat grew to be loved by thousands of people daily, the app faced a challenge in consistently delivering new frames leading to poor response times that impeded user experience.\n\nAs a result, the app saw an increased number of dropped or delayed frames (also known as \"Jank\"). Fixing these jank issues by improving slow \\& frozen frames was critical in delivering a seamless experience to all its users. This would also play an important role in making users spend more time on the app, increasing engagement and, in turn, improving ShareChat's rating on the Android Play Store.\n\nHow They Did It\n---------------\n\nShareChat worked with Google's developer relations team to reduce Jank and yield a positive business impact by improving slow \\& frozen frames (Jank) on the app. Specifically they worked on improving the following issues -\n\n- **Shared RecyclerView Pool** - Through profiling, it was observed that creating different viewholders takes longer and to minimize that, a Shared RecyclerView Pool was created. This also helped in removing the viewholders creational cost for similar feeds.\n\n- **Excessive Layout Passesl** - Through [profiling](https://perfetto.dev/), it was also observed that some viewholders were requesting additional requestLayouts. To optimize, the code was updated to take value in creation time instead of every bind, thus saving extra requestLayout costs.\n\n- **[OverDraw](https://developer.android.com/topic/performance/rendering/inspect-gpu-rendering)** - Simplified the layouts to reduce layering and removing colors that were being set separately for each of the layers.\n\n- **Flattening of hierarchy** - Observed long inflation through profiling and manual inspection of many screens. The hierarchy was flattened using [ConstraintLayout](https://developer.android.com/reference/androidx/constraintlayout/widget/ConstraintLayout) to solve for this.\n\n- **Excessive View Inflation** - Identified long inflation time for certain views while profiling. These views were converted to viewstubs.\n\n- **Removing heavy tasks from UI thread** - Using a profiler allowed for observation of a couple of places where heavy tasks were being done on the main thread, such as creating SpannableStringBuilder with tagging and styling of every recyclerView bind, BlurHash decoding, etc. These tasks were removed from the UI thread and moved to a background thread.\n\n- **Migrating from Rx to [Coroutine](https://developer.android.com/kotlin/coroutines#:%7E:text=A%20coroutine%20is%20a%20concurrency,established%20concepts%20from%20other%20languages)** - Memory consumption also led to frequent GC calls, and there were very high thread counts via the \\\u003e100 RX thread. Many of the use cases were moved to Coroutine to fix these issues.\n\n- **Adoption of [Coil](https://coil-kt.github.io/coil/) for image loading** - Glide was causing issues while loading images, specifically in the components built via jetpack compose. It was also identified that while loading images in LazyColumn, the rendering threshold bar was high. These occurrences led to the adoption of Coil for image loading.\n\n- **Old code cleanup and refactoring** - Removal of old code and experiments helped to remove unnecessary hidden views from the UI and helped rewrite some of the screens in a better way.\n\nResults\n-------\n\nBy analyzing improvement areas and identifying optimization strategies, ShareChat could improve the overall experience for users while increasing its engagement rate and Play Store ratings. Below is the quantitative overview of the results ShareChat achieved -\n\n- \\~45% reduction in 'Slow rendered' frames on Play Store\n- \\~30% reduction in 'Frozen' frames on Play Store\n- Janky frame rates for every 10K frames rendered reduced from 10.72% to 3.98%\n- Feed-scrolling increased by 60%\n- The overall ratings on the Store increased from \\~4.0 to 4.3\n- 10% increase in consumption of posts\n\n\u003e \"At ShareChat, our goal is to be the best social media app out there that\n\u003e delights our users.This also means being the best in terms of app performance.\n\u003e Our collaboration with Google's developer relations team helped us identify\n\u003e areas of improvement on our most used low-end user devices. We learned the best\n\u003e performance practices and tools to identify and fix frozen frames, janks,\n\u003e overdraws, and ANRs.\"\n\u003e\n\u003e **-- Vihaan Verma, Engineering Manager, Android Team at ShareChat**"]]