Como funciona a instalação de aplicativos Android nos bastidores

A smartphone on engineering blueprints with gears, illustrating how app installation works

Quando você toca em “Instalar” em um arquivo APK ou baixa um aplicativo da Play Store, uma sequência complexa de operações começa nos bastidores. O que parece ser uma barra de progresso simples, na verdade representa dezenas de etapas envolvendo análise de pacotes, verificação criptográfica, gerenciamento de permissões, extração de arquivos e otimização de código. Compreender esse processo ajuda a explicar por que as instalações às vezes falham e o que você pode fazer a respeito.

Neste artigo, percorreremos todas as principais etapas do pipeline de instalação do Android, desde o momento em que o sistema recebe um APK até o ponto em que o aplicativo está pronto para ser iniciado.

Etapa 1: iniciando a instalação

O processo de instalação começa de forma diferente dependendo da fonte:

  • Loja de jogos: O aplicativo Play Store baixa o APK (ou APKs divididos) e chama o instalador do pacote do sistema com privilégios especiais que ignoram algumas confirmações do usuário.
  • Carregamento lateral: Quando você abre um arquivo APK, o Android inicia a atividade do instalador do pacote. No Android 8.0 e posterior, o aplicativo instalador deve ter a permissão "Instalar aplicativos desconhecidos" para sua fonte específica.
  • BAD: O comando adb install se comunica diretamente com o serviço gerenciador de pacotes via USB, ignorando totalmente o instalador gráfico.

Independentemente da origem, todas as instalações eventualmente chegam ao mesmo serviço do sistema: o PackageManagerService (PMS). Esta é a autoridade central para todas as operações de pacotes no Android.

Etapa 2: análise de pacote

Antes de mais nada, o sistema precisa entender o que vai instalar. O PackageManagerService invoca Parser de pacotes para ler o arquivo APK e extrair seus metadados.

O analisador lê o arquivo AndroidManifest.xml no APK. Este arquivo XML binário contém informações críticas:

  • Nome do pacote: O identificador exclusivo do aplicativo (por exemplo, com.example.myapp)
  • Código e nome da versão: Usado para determinar se esta é uma atualização ou uma nova instalação
  • Versões mínimas e de destino do SDK: Determina a compatibilidade com o dispositivo
  • Permissões declaradas: Permissões que o aplicativo solicita e permissões personalizadas que ele define
  • Componentes: Atividades, serviços, receptores de transmissão e provedores de conteúdo registrados pelo aplicativo
  • Recursos de hardware e software: Requisitos como câmera, GPS ou versões específicas do OpenGL

Se o manifesto estiver malformado ou a estrutura do APK for inválida, a instalação falhará neste estágio com uma mensagem "Erro de análise". Este é um dos motivos mais comuns pelos quais os APKs transferidos por sideload não conseguem ser instalados.

Etapa 3: verificações de compatibilidade

Depois que o manifesto for analisado, o sistema realizará uma série de verificações de compatibilidade:

  • Versão do SDK: Se o minSdkVersion do aplicativo for superior ao nível de API do dispositivo, a instalação será rejeitada.
  • Compatibilidade ABI: Se o APK contém bibliotecas nativas, o sistema verifica se elas correspondem à arquitetura da CPU do dispositivo. Um APK com apenas bibliotecas armeabi-v7a não será instalado em um dispositivo somente x86.
  • Recursos necessários: Se o aplicativo declarar recursos de hardware necessários (como android.hardware.telephony), o sistema verificará se o dispositivo os suporta.
  • Armazenamento disponível: O sistema verifica se há espaço livre suficiente para instalar o aplicativo, incluindo espaço para as bibliotecas nativas extraídas e arquivos DEX otimizados.

Etapa 4: verificação de assinatura

Esta é uma das etapas mais críticas no processo de instalação. O Android verifica a assinatura criptográfica do APK para garantir sua integridade e autenticidade.

O processo de verificação depende de quais esquemas de assinatura estão presentes:

Assinatura V1 (Assinatura JAR)

O sistema verifica o diretório META-INF/ em busca de arquivos de assinatura (.SF, .RSA ou .DSA). Cada arquivo no APK é verificado em relação aos resumos listados no manifesto. Isso é lento porque cada arquivo deve ter hash individual.

Assinatura V2 (esquema de assinatura APK v2)

Introduzido no Android 7.0, esse esquema assina todo o APK como um blob binário. O bloco de assinatura é inserido entre o diretório central ZIP e o registro de fim do diretório central. A verificação é muito mais rápida porque opera nos bytes brutos sem a necessidadescompactar entradas individuais.

Assinatura V3 (Rotação de Chave)

Disponível a partir do Android 9.0, o V3 estende o V2 ​​com suporte para rotação de teclas. Ele inclui uma estrutura de prova de rotação que vincula chaves de assinatura novas e antigas, permitindo que os desenvolvedores alterem suas chaves de assinatura enquanto mantêm a compatibilidade de atualização.

Assinatura V4 (Incremental)

O Android 11 introduziu o V4 para instalações incrementais. Ele fornece uma assinatura baseada em árvore Merkle que permite a verificação de blocos individuais à medida que são transmitidos para o dispositivo.

Se a verificação da assinatura falhar por qualquer motivo, a instalação será imediatamente abortada. Você pode verificar a assinatura de um APK antes da instalação usando nosso Ferramenta verificador de APK.

Atualizar correspondência de assinatura

Se um app com o mesmo nome de pacote já estiver instalado, o sistema realizará uma verificação adicional: o certificado de assinatura do novo APK deverá corresponder ao certificado da instalação existente. Isso evita que uma parte mal-intencionada substitua um aplicativo legítimo por uma versão adulterada. Se as assinaturas não corresponderem, você verá o erro "Aplicativo não instalado: o pacote está em conflito com um pacote existente com o mesmo nome".

Etapa 5: confirmação do usuário

Para instalações transferidas por sideload, o sistema exibe uma caixa de diálogo de confirmação de instalação mostrando:

  • O nome e o ícone do aplicativo (extraídos dos recursos do APK)
  • Permissões solicitadas pelo aplicativo (em versões mais antigas do Android)
  • Quer esta seja uma nova instalação ou uma atualização
  • Quaisquer avisos sobre a origem do aplicativo ou riscos potenciais

No Android 12 e posterior, a tela de confirmação é mais simples, pois as permissões de tempo de execução são concedidas individualmente quando o aplicativo precisa delas pela primeira vez, e não no momento da instalação.

Etapa 6: extração e posicionamento de arquivos

Assim que o usuário confirmar (ou para instalações da Play Store, automaticamente), o sistema começa a extrair e colocar os arquivos:

Armazenamento de APKs

O próprio arquivo APK é copiado para /data/app/[package-name]-[random]/base.apk. Para instalações de APK dividido, arquivos adicionais como split_config.arm64_v8a.apk são colocados ao lado do APK base. O APK original na pasta Downloads não é modificado ou excluído.

Extração de biblioteca nativa

Se o APK contiver bibliotecas nativas (no diretório lib/, elas serão extraídas para /data/app/[package-name]-[random]/lib/[abi]/). Nas versões mais recentes do Android, os aplicativos podem optar por manter as bibliotecas nativas compactadas no APK e carregá-las diretamente usando android:extractNativeLibs="false", o que economiza espaço de armazenamento.

Criação de diretório de dados

O sistema cria o diretório de dados privados do aplicativo em /data/data/[package-name]/ (ou /data/user/0/[package-name]/ em dispositivos multiusuário). Este diretório pertence a um UID Linux exclusivo atribuído ao aplicativo, garantindo que nenhum outro aplicativo possa acessá-lo sem privilégios de root.

Etapa 7: Otimização DEX

É nesta etapa que o Android transforma o bytecode do aplicativo em um formato otimizado para o hardware específico do dispositivo. O processo evoluiu significativamente ao longo da história do Android:

A Era Dalvik (Android 4.4 e anteriores)

A máquina virtual Dalvik original usava compilação Just-In-Time (JIT). Durante a instalação, o arquivo classes.dex foi otimizado em um arquivo ODEX que continha bytecode verificado e otimizado. Isso foi relativamente rápido, mas significou que o aplicativo ficou mais lento em tempo de execução, já que a maior parte do código ainda era interpretada.

ART com AOT (Android 5.0 a 6.0)

O Android Runtime (ART) substituiu Dalvik e introduziu a compilação Ahead-Of-Time (AOT). Durante a instalação, todo o bytecode DEX foi compilado em código de máquina nativo. Isso fez com que os aplicativos rodassem mais rápido, mas aumentou significativamente o tempo de instalação e o uso de armazenamento. Alguns aplicativos levaram vários minutos para serem instalados.

Compilação guiada por perfil (Android 7.0+)

O Android moderno usa uma abordagem híbrida. Durante a instalação, apenas os caminhos críticos de inicialização são compilados. À medida que o usuário executa o aplicativo, o sistema coleta perfis de execução que identificam os caminhos de código usados com frequência. Durante a manutenção ociosa (normalmente durante o carregamento durante a noite), o sistema compila esses caminhos ativos para o código nativo. Isso equilibra a velocidade de instalação, o uso do armazenamento e o desempenho do tempo de execução.

O código compilado é armazenado em /data/dalvik-cache/ ou junto com o APK como arquivos .odex, .vdex e .art. O arquivo .vdex contém código DEX verificado, o arquivo .odex contém código nativo compilado e o arquivo .art contém imagens heap pré-inicializadas para inicialização mais rápida.

Etapa 8: Registro de Permissão

O PackageManagerService registra as permissões e os componentes declarados do aplicativo no sistema:

  • Permissões no momento da instalação (como INTERNET ou VIBRATE são concedidos automaticamente sem interação do usuário).
  • Permissões de tempo de execução (como CAMERA ou LOCATION são registrados, mas não concedidos). O aplicativo deve solicitá-los em tempo de execução.
  • Filtros de intenção são registrados para que o sistema saiba quais aplicativos podem realizar quais ações (como abrir um URL ou compartilhar conteúdo).
  • Provedores de conteúdo são registrados com suas autoridades para que outros aplicativos possam consultá-los.

Etapa 9: Integração do Sistema

As etapas finais integram o aplicativo ao sistema Android:

  • Atualização do banco de dados de pacotes: O banco de dados de pacotes do sistema (/data/system/packages.xml) é atualizado com as informações do novo aplicativo, incluindo seu UID atribuído, permissões e declarações de componentes.
  • Notificação do iniciador: O iniciador da tela inicial é notificado sobre o novo aplicativo para poder exibir o ícone do aplicativo.
  • Transmissão: O sistema envia uma transmissão PACKAGE_ADDED, permitindo que outros aplicativos reajam à nova instalação (por exemplo, aplicativos de backup podem agendar um backup).
  • Contexto SELinux: Os arquivos do aplicativo são rotulados com o contexto de segurança SELinux apropriado com base na versão do SDK de destino e nas permissões declaradas.

Por que as instalações falham

Compreender o pipeline de instalação ajuda a diagnosticar falhas comuns:

  • "Erro de análise": O APK está corrompido, incompleto ou possui um manifesto malformado. Isso geralmente acontece com downloads incompletos ou arquivos convertidos incorretamente.
  • "Aplicativo não instalado" (incompatibilidade de assinatura): You are trying to update an app with an APK signed by a different key. Você deve desinstalar a versão existente primeiro.
  • "Armazenamento insuficiente": Espaço insuficiente para APK, bibliotecas extraídas e saída de otimização DEX. O espaço real necessário é normalmente 2 a 3 vezes o tamanho do APK.
  • "O pacote entra em conflito com o pacote existente": Mesmo nome de pacote, mas assinatura diferente. Comum ao alternar entre a Play Store e as versões transferidas.
  • Downgrade de versão bloqueado: Por padrão, o Android impede a instalação de uma versão mais antiga em vez de uma mais recente. ADB pode substituir isso por adb install -d.

Instalação de APK dividido

Ao instalar APKs divididos (de App Bundles), o processo é um pouco diferente. O sistema usa uma API instalação baseada em sessão:

  1. Uma nova sessão de instalação é criada
  2. Cada APK dividido é gravado na sessão
  3. A sessão é confirmada, acionando o pipeline de verificação completo
  4. Todas as divisões devem ter nomes de pacotes, códigos de versão e certificados de assinatura correspondentes

Este é o mecanismo usado por instaladores XAPK e ferramentas como nosso Fusão de APKS para APK para lidar com instalações de vários arquivos.

Instalação via ADB

Ao usar adb install, o processo ignora o instalador gráfico, mas segue o mesmo pipeline interno. O ADB se comunica com o serviço gerenciador de pacotes por meio de uma conexão de soquete. Ele oferece suporte a sinalizadores adicionais que não estão disponíveis na GUI:

  • -r: Substitua o aplicativo existente (permitir reinstalação)
  • -d: Permitir downgrade de versão
  • -g: Conceda todas as permissões de tempo de execução imediatamente
  • -t: permitir instalação de APKs somente de teste
  • --install-multiple: Instale APKs divididos em uma única sessão

O que acontece durante a desinstalação

Para completar, aqui está o que acontece quando um aplicativo é removido:

  1. Os processos do aplicativo são eliminados
  2. O APK e as bibliotecas extraídas são excluídos de /data/app/
  3. O diretório de dados privados do aplicativo é removido (a menos que o usuário opte por manter os dados)
  4. Arquivos de cache DEX compilados são excluídos
  5. O banco de dados do pacote é atualizado
  6. Uma transmissão PACKAGE_REMOVED é enviada
  7. O iniciador remove o ícone do aplicativo

Observe que os arquivos específicos do aplicativo no armazenamento externo (/Android/data/[package]/ e /Android/obb/[package]/ também são excluídos no Android 10 e versões posteriores, graças à aplicação do armazenamento com escopo definido).

Por que compreender o PackageManager economiza tempo de depuração

O processo de instalação do Android é uma sequência cuidadosamente orquestrada de verificações de segurança, operações de arquivos e integrações de sistema. Cada etapa tem um propósito, desde proteger os usuários contra aplicativos adulterados até otimizar o desempenho do hardware específico. Quando as instalações falham, o erro geralmente aponta para uma etapa específica desse pipeline, e a compreensão do processo ajuda a diagnosticar e resolver problemas rapidamente.

Instalar a partir da Play Store, fazer o sideload de um APK manualmente e enviar uma compilação com ADB, todo o funil através do mesmo pipeline subjacente, aquele que garante que todos os aplicativos em seu dispositivo foram verificados, colocados corretamente e otimizados para seu hardware.

Projetado e documentado por Mst Shaefale Desenvolvedor líder e arquiteto de pacotes Android • Verificado no Android 12–15

Mst Shaefale mantém a fusão XAPK/APKS do lado do cliente, analisador de manifesto binário e ferramentas de assinatura APK v1+v2 em xapktoapk.com. Identificou um comando desatualizado ou uma alteração no sistema operacional? Envie uma nota editorial.