Voltar para o Blog

Aerial em 2026: O Launcher Open Source Que Deixa a Android TV com Cara de Apple TV

Olá HaWkers, um projeto criado em 20 de outubro de 2026 chegou a 8.188 estrelas no GitHub em 11 dias, e ele não é framework, não é modelo de IA e não é agente de código. É uma tela inicial para televisão. O Aerial, de pengchujin, é um launcher em Kotlin, sob licença MIT, que copia a calma da Apple TV: seus aplicativos, um papel de parede e os filmes aéreos como protetor de tela, sem anúncio e sem fileira de recomendação.

O que me chamou atenção não foi a estética. Foi a pergunta que o projeto responde: como um aplicativo de 3 MB, sem root e sem mexer em aplicativo de sistema, continua sendo a tela inicial de uma TV cujo fabricante faz de tudo para que ele não seja? Neste artigo você vai ver o que o Aerial entrega, como funciona a engenharia por trás disso, o que os riscos custam de verdade e o que esse crescimento ensina sobre produto.

O Que É o Aerial e Por Que Ele Cresceu Tão Rápido

A tese do produto cabe em uma frase do próprio README: uma tela inicial calma para Android TV. Na prática, a versão v1.75, publicada em 31 de outubro de 2026, traz:

  • Tela inicial: uma fileira de favoritos em uma prateleira de vidro e todos os aplicativos logo abaixo, incluindo apps de sistema que costumam ficar escondidos.
  • Organização: segurar OK move, agrupa em pasta, oculta ou desinstala. Dá para fixar uma entrada HDMI com nome e ícone próprios.
  • Controle pelo celular: você escaneia um QR code na TV e arrasta os blocos pela tela do telefone.
  • Protetor de tela: os 114 filmes aéreos da Apple TV, em 4K ou 4K Dolby Vision quando a TV suporta, além de fotos, relógio e vídeos locais.
  • Papel de parede: foto do dia do Bing, 14 imagens prontas ou fotos enviadas do celular.

Os filmes pertencem à Apple e são reproduzidos a partir dos servidores dela, como o próprio projeto explica. O Aerial também deixa claro que é independente e não tem relação com Apple, Xiaomi ou TCL.

O público importa aqui

O alvo declarado são as TVs vendidas na China: Xiaomi, TCL, Skyworth, Sony e outras. Lá, a tela inicial do fabricante vem cheia de recomendação de séries e selos de assinatura, e o sistema costuma aceitar só o launcher da própria marca. Esse detalhe explica toda a arquitetura que vamos ver, e também limita o que você deve esperar se tem uma TV comprada no Brasil.

Quem já passou por esse incômodo por aqui provavelmente conhece outro caminho. No guia do tv-vibehack para tirar anúncios da Android TV com ADB, a estratégia é desativar pacotes. O Aerial segue a direção oposta: não desliga nada do sistema, apenas se coloca na frente. São abordagens diferentes para o mesmo problema, e vale entender qual delas faz sentido para a sua TV.

O Primeiro Problema: Convencer o Sistema de Que Você É a Tela Inicial

Em Android, uma tela inicial é só uma Activity que declara a categoria HOME. Na Android TV padrão, isso resolve quase tudo: você aperta Home, o sistema pergunta qual aplicativo usar, você escolhe Sempre e acabou. O README é direto: nesse cenário, nada do que vem a seguir é necessário.

O interessante é o que acontece nas TVs modificadas. Cada firmware inventa sua própria forma de disparar o botão Home, e o manifesto do Aerial virou um catálogo dessas variações. Este é um trecho adaptado do manifesto real do projeto:

<!-- Um único filtro cobre as variações de cada firmware -->
<activity android:name="app.orchard.tv.MainActivity">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <!-- O caso padrão de qualquer launcher Android -->
        <category android:name="android.intent.category.HOME" />
        <category android:name="android.intent.category.DEFAULT" />

        <!-- Firmware CVTE envia Home com esta categoria extra -->
        <category android:name="android.intent.category.COMMON_HOME" />

        <!-- O NEWBOX da China Mobile envia Home com LAUNCHER -->
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <!-- Categoria privada usada pelo firmware da Coocaa -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.HOME.CC" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Repare em um detalhe que passa fácil: para uma Intent casar com um filtro, todas as categorias da Intent precisam estar no filtro. Por isso listar categorias a mais não atrapalha o caso comum, e uma única categoria faltando deixa o botão Home sem resposta. Foi exatamente o que aconteceu no NEWBOX, segundo o comentário do manifesto: Home simplesmente não fazia nada.

O mesmo arquivo guarda outra pérola. O verificador de instalação de firmwares da TCL só deixa passar um APK que declara HOME se ele tiver a mesma assinatura da tela inicial atual e carregar uma tag com.tcl.app.type. E há TVs que recusam de vez instalar aplicativos de tela inicial, razão de o projeto distribuir, além do APK standard, uma variante guard para esses casos.

O Segundo Problema: Quando o Fabricante Não Aceita Outro Launcher

A maioria das TVs vendidas na China ignora a sua preferência. Se não dá para ser a tela inicial oficial, a saída é voltar para a frente toda vez que a oficial aparecer. É isso que o HomeGuardService faz, usando um serviço de acessibilidade.

A versão abaixo é uma simplificação didática minha para mostrar a ideia. O serviço real do projeto trata dezenas de casos por aparelho:

import android.accessibilityservice.AccessibilityService
import android.content.Intent
import android.view.accessibility.AccessibilityEvent

class HomeGuardSimplificado : AccessibilityService() {

    // Pacotes das telas iniciais do fabricante, descobertos ao conectar
    private val launchersDeFabrica = setOf("com.mitv.tvhome")

    override fun onAccessibilityEvent(evento: AccessibilityEvent) {
        // Só interessa saber qual janela foi para a frente
        if (evento.eventType != AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) return

        val pacote = evento.packageName?.toString() ?: return
        if (pacote !in launchersDeFabrica) return

        // O launcher do fabricante apareceu: traz o nosso de volta
        val intent = packageManager
            .getLaunchIntentForPackage(packageName)
            ?.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        startActivity(intent)
    }

    override fun onInterrupt() = Unit
}

O nome do pacote nesse exemplo é ilustrativo. O código real descobre a lista consultando quem responde a HOME, e só age enquanto o Aerial não for o aplicativo resolvido para essa Intent. Quando ele é o padrão, o próprio sistema faz o trabalho.

O ponto mais delicado é a privacidade. Serviço de acessibilidade é uma das permissões mais poderosas do Android, e o projeto afirma que lê apenas qual janela está na frente, nunca o conteúdo da tela. Como o código é aberto, essa é uma afirmação que você consegue conferir, e não precisa aceitar por fé.

Quando nem a acessibilidade funciona

Em aparelhos Xiaomi antigos com Android 6, a tela inicial PatchWall não dispara evento nenhum de troca de janela. A solução do projeto foi consultar as estatísticas de uso do sistema uma vez por segundo para descobrir o que está na frente. Polling de um segundo em uma TV não é bonito, mas funciona onde o caminho elegante não existe.

O Terceiro Problema: Sobreviver ao Modo de Espera

Esta é a parte de que mais gostei. Segundo os comentários no código do projeto, a Xiaomi força a parada de todo aplicativo de terceiros quando a TV entra em espera. E o Android, ao forçar a parada de um app, remove os serviços de acessibilidade dele da lista de habilitados. Resultado: você desliga a TV, liga de novo e o guardião sumiu.

O Aerial usa duas peças para resolver isso:

  1. WRITE_SECURE_SETTINGS: permissão de desenvolvimento, concedida apenas via ADB, que permite recolocar o próprio serviço na lista de habilitados.
  2. NotificationListenerService: o sistema mantém a aprovação de um ouvinte de notificações e religa esse serviço pouco depois que o processo morre. O projeto usa esse religamento só para acordar. Nenhuma notificação é lida.

Veja a ideia em uma versão simplificada, novamente feita por mim para fins didáticos:

import android.provider.Settings
import android.service.notification.NotificationListenerService

class ReviverSimplificado : NotificationListenerService() {

    // O sistema religa este serviço depois que o processo morre
    override fun onListenerConnected() {
        val servico = "$packageName/$packageName.HomeGuardSimplificado"
        val chave = Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES

        // Lê a lista atual de serviços habilitados
        val atual = Settings.Secure.getString(contentResolver, chave).orEmpty()
        if (servico in atual) return

        // Exige WRITE_SECURE_SETTINGS, concedida antes via ADB
        val nova = listOf(atual, servico)
            .filter { it.isNotEmpty() }
            .joinToString(":")
        Settings.Secure.putString(contentResolver, chave, nova)
    }
}

É um uso criativo de uma API para algo que ela não foi feita para fazer. Como engenharia de sobrevivência, é brilhante. Como dependência de longo prazo, é frágil: uma atualização de firmware pode fechar essa porta, e o próprio projeto registra modelos em que ela já não funciona. Em uma TV Thunderbird com Android 14, o firmware limpa a acessibilidade cerca de uma vez por minuto, e a tomada da tela inicial não é possível.

Como Instalar e Como Conferir o Resultado

Antes de tudo, habilite a depuração ADB na TV. Em uma Android TV comum, o caminho costuma ser Configurações, Sobre, sete toques em Build e depois Depuração USB nas opções do desenvolvedor. Em TVs com Android 11 ou superior que só oferecem Depuração sem fio, é preciso parear com adb pair primeiro.

A instalação manual do README é curta. Comentei cada passo para você saber exatamente o que está autorizando:

# Conecta na TV pela rede local (troque pelo IP da sua TV)
adb connect 192.168.1.20:5555

# Instala o APK baixado da página de releases do projeto
adb install -r aerial-standard.apk

# Permite recolocar o serviço de acessibilidade depois de uma parada forçada
adb shell pm grant app.orchard.tv android.permission.WRITE_SECURE_SETTINGS

# Autoriza o ouvinte que só serve para reviver o app
adb shell cmd notification allow_listener app.orchard.tv/app.orchard.tv.guard.RevivalListener

# Libera o desenho sobre outros apps e abre o launcher
adb shell appops set app.orchard.tv SYSTEM_ALERT_WINDOW allow
adb shell am start -n app.orchard.tv/.MainActivity

# Uns 5 segundos depois de abrir, compila para deixar a interface mais fluida
adb shell cmd package compile -m speed -f app.orchard.tv

Depois, confira de verdade, em vez de confiar na impressão visual:

# Qual aplicativo o sistema resolve como tela inicial
adb shell "cmd package resolve-activity --brief -a android.intent.action.MAIN -c android.intent.category.HOME"

# Quais serviços de acessibilidade estão ativos
adb shell settings get secure enabled_accessibility_services

# Aperte Home no controle e veja quem está em foco: deve aparecer app.orchard.tv
adb shell "dumpsys window | grep mCurrentFocus"

Para desfazer, o projeto oferece um modo restore no script de instalação, que devolve a tela inicial original sem desinstalar o Aerial, e o guia dele lista os comandos adb um a um para quem prefere fazer à mão. Segundo o README, nada de sistema é alterado, e por isso seus aplicativos, assinaturas e contas continuam como estavam.

Os Riscos Reais Antes de Você Instalar

Esta é a parte que os vídeos de "TV nova em 5 minutos" pulam. Pese cada ponto:

ADB ligado é uma porta aberta. Com a opção KEEP_ADB=1, o Aerial religa o ADB quando a TV o desliga em espera, o que ajuda em atualizações, mas mantém um serviço de depuração acessível na rede local. Se a sua rede tem convidados ou dispositivos em que você não confia, considere deixá-lo desligado.

curl | bash exige confiança. O projeto oferece um comando de instalação em uma linha. Prefira baixar o script, ler e só então rodar, ou siga os passos manuais acima.

Instalar por agente de IA também. O README sugere colar um prompt em um agente que executa comandos no seu computador. É prático, mas você está entregando um terminal a uma instrução que vem de uma página externa. Leia o guia antes, e confira o resultado com os comandos acima.

Efeitos colaterais existem. O comentário do HomeGuardService registra que, com o filtro de teclas ligado, algumas teclas passam pelo serviço e certos apps enxergam um toque como pressionado, movendo duas vezes. Por isso esse filtro só opera até o Android 11.

Nem tudo some. O anúncio de inicialização vem do firmware e continua lá, como o README admite. E a tabela de TVs suportadas é, em boa parte, formada por relatos de usuários em modelos do mercado chinês. Eu não encontrei validação específica para modelos vendidos no Brasil, então trate a sua TV como território não testado.

Aerial ou Outro Launcher: Qual Faz Sentido

Se a sua TV roda Android TV ou Google TV de mercado global, o Aerial não é a única opção:

Launcher Licença Ponto forte Ponto de atenção
Aerial MIT, aberto Visual tipo Apple TV e filmes aéreos Foco declarado em TVs do mercado chinês
Projectivy Freemium, pagamento único O mais recomendado em reviews Exige acessibilidade para forçar a troca e consome mais recursos, segundo usuários
FLauncher Aberto Leve, bom para TV com pouco armazenamento Confira a compatibilidade com a sua TV antes de instalar

Uma ressalva vale para todos: trocar o launcher muda o que você vê, mas o launcher original continua instalado e pode seguir rodando em segundo plano. Quem quer economizar memória precisa combinar a troca com a desativação de pacotes, e aí os riscos são outros.

O Que Quem Constrói Produto Pode Aprender com Isso

Mesmo que você nunca instale o Aerial, o repositório é uma aula, e estas são as três lições que levo dele.

Dor específica vence promessa genérica. O projeto não diz "o launcher mais personalizável". Diz que entrega uma tela limpa. A tabela de comparação no topo do README, com a tela original ao lado da nova, vende mais do que qualquer lista de recursos.

Compatibilidade pode virar comunidade. A tabela de TVs é mantida com relatos de usuários, ligados a issues públicas. O comentário no manifesto já cita a issue #983, e o formulário de suporte a dispositivos transforma cada TV estranha em teste de campo. Um dev sozinho nunca teria todos esses aparelhos na mesa.

Agente de IA virou canal de instalação. O projeto trata o agente como usuário de primeira classe: tem um guia próprio, pede a saída crua dos comandos e diz o que conferir no fim. Instalar exige ADB, IP e permissões, o que afastaria quase todo mundo. Terceirizar essa complexidade para um agente é uma decisão de distribuição, não de código. Independentemente de você gostar da ideia, ela é um sinal de para onde a experiência de instalação de ferramentas técnicas está indo, e traz junto os riscos que citei.

O Que Esperar Daqui Para Frente

O crescimento rápido cobra um preço. A v1.74 e a v1.75 saíram com poucas horas de diferença em 31 de outubro, o que indica um ritmo intenso, mas também um projeto ainda em movimento e dependente de quem o mantém. Uma atualização de firmware pode quebrar a estratégia em certas marcas, e a própria Android pode endurecer as permissões usadas aqui. Se a sua TV aceita um launcher padrão pelo caminho normal, você fica menos exposto a isso, porque não precisa do guardião.

A lição maior é que a tela inicial da TV virou espaço publicitário, e 8.188 estrelas em 11 dias mostram quanta gente quer de volta o controle daquilo que comprou.

Bora pra cima! 🦅

📚 Quer Acompanhar o Que Vem Por Ai?

Este artigo cobriu o launcher Aerial e a engenharia para manter uma tela inicial limpa na Android TV, mas o ecossistema muda toda semana e nem tudo vira artigo aqui.

No X eu compartilho o que estou testando, os bastidores dos projetos e as novidades que aparecem antes de virarem post.

Me Segue La

👉 Seguir @jeffbruchado no X

💡 Conteudo diario sobre desenvolvimento, carreira e as ferramentas que eu realmente uso

Comentários (0)

Esse artigo ainda não possui comentários 😢. Seja o primeiro! 🚀🦅

Adicionar comentário