ShareChat resolve problemas de instabilidade para aumentar a rolagem do feed em 60%
Mantenha tudo organizado com as coleções
Salve e categorize o conteúdo com base nas suas preferências.
Introdução
A ShareChat é uma plataforma de mídia social líder na Índia que permite que os usuários compartilhem opiniões, documentem suas vidas e façam novos amigos no próprio idioma nativo. Outros recursos incluem salas de chat e mensagens privadas, permitindo que os usuários compartilhem vídeos, piadas, músicas e outros conteúdos sociais baseados em idioma. Com a missão de liderar a revolução na Internet da Índia, a ShareChat está mudando a forma como o próximo bilhão de usuários vai interagir na Internet.
O app em números
- Mais de 100 milhões de downloads
- Mais de 180 milhões de usuários ativos por mês
- Mais de 32 milhões de criadores de conteúdo
- 15 idiomas indianos diferentes
- Cerca de 1,5 milhão de postagens criadas diariamente
O desafio
Como o ShareChat cresceu e foi adorado por milhares de pessoas diariamente, o app enfrentou um desafio em fornecer novos frames de forma consistente, levando a tempos de resposta ruins que dificultavam a experiência do usuário.
Como resultado, o app observou um aumento no número de frames perdidos ou atrasados (também conhecido como "instabilidade"). Corrigir esses problemas de instabilidade melhorando frames lentos e congelados foi fundamental para oferecer uma experiência perfeita a todos os usuários. Isso também desempenha um papel importante para que os usuários passem mais tempo no app, aumentando o engajamento e, por sua vez, melhorando a classificação do ShareChat na Play Store do Android.
Como foi o processo
A ShareChat trabalhou com a equipe de relações com desenvolvedores do Google para reduzir a instabilidade e gerar um impacto positivo nos negócios, melhorando os frames lentos e congelados (instabilidade) no app. Especificamente, eles trabalharam para melhorar os seguintes problemas:
Pool de RecyclerView compartilhado: por meio da criação de perfil, foi observado que a criação de diferentes detentores de visualização leva mais tempo e, para minimizar isso, um pool de RecyclerView compartilhado foi criado. Isso também ajudou a remover o custo de criação de detentores de visualizações para feeds semelhantes.
Passel de layout excessivo: por meio da criação de perfis, também foi observado que alguns proprietários de visualizações solicitaram requestLayouts adicionais. Para otimizar, o código foi atualizado para ter valor no tempo de criação, em vez de cada vinculação, economizando custos de requestLayout extras.
OverDraw: simplificou os layouts para reduzir as camadas e remover as cores definidas separadamente para cada uma das camadas.
Simplificação da hierarquia: inflação longa observada durante a criação de perfil e inspeção manual de várias telas. A hierarquia foi nivelada usando ConstraintLayout para resolver esse problema.
Inflação excessiva de visualizações: identificou um tempo longo de inflação para determinadas visualizações durante a criação de perfil. Essas visualizações foram convertidas em stubs de visualização.
Remoção de tarefas pesadas da linha de execução de IU: o uso de um criador de perfil permitia observar alguns locais em que tarefas pesadas estavam sendo realizadas na linha de execução principal, como criar SpannableStringBuilder com inclusão de tag e estilo de cada vinculação recyclerView, decodificação de BlurHash etc. Essas tarefas foram removidas da linha de execução de interface e movidas para uma linha de execução em segundo plano.
Migrar de Rx para Corroutine: o consumo de memória também levou a chamadas de GC frequentes e havia contagens muito altas de linhas de execução pela linha de execução mais de 100 RX. Muitos dos casos de uso foram movidos para a corrotina para corrigir esses problemas.
Adoção da Coil para carregamento de imagens: a Glide causava problemas ao carregar imagens, especificamente nos componentes criados com o Jetpack Compose. Também foi identificado que a barra de limite de renderização era alta ao carregar imagens em LazyColumn. Essas ocorrências levaram à adoção da Coil para carregamento de imagens.
Refatoração e limpeza de código antigo: a remoção de código e experimentos antigos ajudou a remover visualizações ocultas desnecessárias da interface e a reescrever algumas das telas de uma maneira melhor.
Resultados
Ao analisar as áreas de melhoria e identificar estratégias de otimização, o ShareChat conseguiu melhorar a experiência geral dos usuários e aumentar a taxa de engajamento e as notas na Play Store. Confira abaixo uma visão geral quantitativa dos resultados alcançados pelo ShareChat:
- Redução de aproximadamente 45% em frames com "renderização lenta" na Play Store
- Redução de aproximadamente 30% em frames "congelados" na Play Store.
- As taxas de frames instáveis a cada 10 mil frames renderizados foram reduzidas de 10,72% para 3,98%.
- A rolagem do feed aumentou em 60%
- As avaliações gerais na Play Store aumentaram de ~4,0 para 4,3
- 10% de aumento no consumo de postagens
"Na ShareChat, nosso objetivo é ser o melhor app de mídia social que
encante nossos usuários.Isso também significa ser o melhor em termos de desempenho.
Nossa colaboração com a equipe de relações com desenvolvedores do Google nos ajudou a identificar
áreas de melhoria nos nossos dispositivos de baixo custo mais usados. Aprendemos as práticas
recomendadas de desempenho e as ferramentas para identificar e corrigir frames congelados, instabilidades,
overdraws e ANRs."
– Vihaan Verma, gerente de engenharia, equipe do Android, ShareChat
O conteúdo e os exemplos de código nesta página estão sujeitos às licenças descritas na Licença de conteúdo. Java e OpenJDK são marcas registradas da Oracle e/ou suas afiliadas.
Última atualização 2025-07-27 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 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**"]]