Segunda correção voltada ao Samsung Galaxy A06 em dois dias. A versão 1.0.10, lançada ontem, corrigia uma falha na inicialização nesse aparelho; a 1.0.10 estava instalada havia poucas horas quando um novo problema, diferente, apareceu no Google Play Console — desta vez um ANR (app travado por alguns segundos). O relatório detalhado permitiu uma correção rápida, e esta versão também resolve um defeito de exibição do efeito neon dos ícones na gaveta de apps.
1.0.11 — ANR na inicialização no Samsung Galaxy A06
O sintoma
No Samsung Galaxy A06 (Android 16), na primeira abertura do Sola após a instalação, o app travava por 5 a 6 segundos antes que o Android exibisse a caixa de diálogo "Sola não está respondendo — Aguardar / Fechar app". Diferente da falha da 1.0.10, o app não fechava abruptamente: apenas ficava inutilizável por vários segundos.
Tecnicamente, o rastro reportado pelo Play Console indicava um ANR do tipo "Input dispatching timed out" — o Android monitora se a thread principal processa os eventos de entrada (toque, deslize) em até 5 segundos. Passado esse tempo, o sistema considera o app travado e oferece ao usuário a opção de fechá-lo.
A causa
O Samsung Galaxy A06 tem um processador de entrada (Unisoc T606, quatro núcleos a 1,6 GHz) e uma GPU modesta. Ele é várias vezes mais lento que os aparelhos em que o Sola costuma ser testado (Pixel 8 Pro, Pixel Tablet).
Ao iniciar a tela inicial, o Sola carrega em uma única passagem todos os ícones dos apps presentes na grade (tipicamente de 15 a 25 apps, mais os organizados em pastas). Cada ícone passa por PackageManager.getApplicationIcon(), um método do Android que abre o APK alvo, lê a definição XML do ícone adaptativo e depois decodifica duas imagens bitmap (a camada de primeiro plano e o plano de fundo).
No Pixel 8 Pro, cada decodificação leva cerca de dez milissegundos — 20 ícones aparecem em menos de 300 ms, totalmente imperceptível. No A06, a mesma decodificação leva entre 200 e 500 milissegundos por ícone. 20 ícones × 300 ms = 6 segundos de bloqueio. Como esse carregamento acontecia na thread principal (a que processa os toques do usuário), isso disparava o ANR.
A correção
O fluxo que alimenta a grade da tela inicial agora está confinado ao pool de threads de entrada/saída via flowOn(Dispatchers.IO). Na prática, toda a decodificação de ícones agora roda em threads dedicadas, em paralelo. Só a lista final (depois que os 20 ícones são decodificados) chega à thread principal para ser exibida. A thread principal permanece responsiva o tempo todo, mesmo durante um carregamento pesado.
A mesma correção foi aplicada ao fluxo que lista as pastas com seus apps, que sofria do mesmo problema.
Verificado em emulador reproduzindo as especificações do Galaxy A06 (720×1600, 260 dpi, Android 16, GPU por software para simular a lentidão): a tela inicial aparece instantaneamente, nenhum ANR é disparado.
Efeito neon dos ícones ausente na gaveta de apps
O sintoma
Ao selecionar um pacote de ícones integrado (Pixelarticons, Lucide, Game-Icons…) com a opção "efeito neon" ativada, os ícones exibiam corretamente um halo luminoso na tela inicial, nas pastas e no dock. Mas na gaveta de apps, o halo desaparecia: os ícones apareciam com o tom plano, sem o efeito neon.
A causa
O efeito neon é implementado via um drawable-wrapper que envolve o ícone original para adicionar o halo no momento da renderização. Dois caminhos de código diferentes carregam os ícones dos apps: um para a tela inicial e as pastas, outro para a gaveta (que lista todos os apps instalados de uma vez).
O caminho usado pela tela inicial já tinha uma exceção específica para preservar esse wrapper. O caminho usado pela gaveta não tinha essa exceção: ele chamava sistematicamente constantState.newDrawable() para criar uma nova instância do drawable, o que tem como efeito colateral desembrulhar o wrapper neon e manter apenas o ícone plano por baixo.
A correção
A exceção NeonDrawable foi portada para o caminho da gaveta: quando o ícone carregado é um wrapper neon, ele é mantido como está em vez de ser clonado. O efeito halo agora é preservado na gaveta como em qualquer outro lugar.
Três testes unitários foram adicionados para travar os dois caminhos (tela inicial e gaveta) além do comportamento inverso (os drawables comuns devem ser clonados normalmente para evitar efeitos colaterais ao trocar de pacote). Uma regressão futura desse tipo será detectada antecipadamente.
Como obter a atualização
A 1.0.11 está sendo lançada gradualmente pela Play Store (começando com 20% dos usuários, depois subindo progressivamente até 100% em 24 a 48 horas). Deve estar disponível para todos em até dois dias. Também é possível forçar a verificação pelo app Play Store, na seção "Gerenciar apps e dispositivo".
Abrir no Google Play