O que significa zipalign e como ele se encaixa na maneira como usamos nossos dispositivos Android?

19

O que significa "zipalign" e qual é o seu significado?

Quando uma ROM afirma ser "zipaligned", o que isso significa e qual a diferença de uma ROM que não é "zipaligned"?

Matt
fonte

Respostas:

21

Esse mecanismo é descrito no site de desenvolvedores do Android da seguinte maneira:

O zipalign é uma ferramenta de alinhamento de arquivamento que fornece otimização importante para arquivos de aplicativos (.apk) do Android. O objetivo é garantir que todos os dados não compactados iniciem com um alinhamento específico em relação ao início do arquivo. Especificamente, faz com que todos os dados não compactados no .apk, como imagens ou arquivos brutos, sejam alinhados nos limites de 4 bytes. Isso permite que todas as partes sejam acessadas diretamente com mmap (), mesmo que contenham dados binários com restrições de alinhamento. O benefício é uma redução na quantidade de RAM consumida ao executar o aplicativo.

Em resumo: o .apkconteúdo pode ser mais fácil / rápido / mais otimizado acessado devido à ordem dos dados dentro do arquivo compactado.

Para obter informações mais detalhadas, há um "guia completo" disponível em AddictiveTips: O que é Zipalign no Android e como criar aplicativos Zipaligned , que responde à segunda parte da sua pergunta:

Muito compreensivelmente, a situação seria reservada para pacotes de aplicativos desalinhados. A leitura de recursos seria lenta e o uso de memória estaria na extremidade superior do espectro. Também dependeria de quantos aplicativos desalinhados estão presentes. Por exemplo, se um número menor de aplicativos com um aplicativo doméstico não alinhado, você verá tempos de inicialização mais lentos. Este é o melhor cenário. Para o pior cenário, ter um número de aplicativos não alinhados resultará no sistema repetidamente iniciando e encerrando processos, lutando com atrasos e grande consumo de bateria.

Izzy
fonte
Para programadores, é mais ou menos semelhante ao alinhamento de estruturas em C. Não faça isso struct x { uint16_t id; uint32_t data[100]; };se desejar que ele seja alinhado em 32 bits; usestruct x { uint16_t id; uint16_t padding; uint32_t data[100]; };
Matthew Leia
Parece que não há desvantagem, por que todos os aplicativos não estão alinhados? Isso também é realmente uma preocupação para os usuários finais ou é relevante apenas para os desenvolvedores?
Matt
1
É uma etapa adicional para o desenvolvedor, eu diria. E, claro, o desempenho é uma preocupação para os usuários finais;)
Izzy
1

Para adicionar acima como exatamente o zipalign funciona -

Em um ambiente operacional Android, os arquivos de dados armazenados em cada pacote de aplicativos são acessados ​​por vários processos; por exemplo, o instalador lê o manifesto dos dados para determinar as permissões associadas; o servidor do sistema pode ler esses recursos por vários motivos, como exibir notificações; o aplicativo Home, por exemplo, lerá recursos para obter o nome e o ícone do aplicativo. Como o Android é baseado em uma verdadeira infraestrutura operacional multitarefa, esses arquivos são acessados ​​contínua e repetidamente. Finalmente, mas não menos importante, o próprio aplicativo lê os dados do manifesto.

Como o Android é baseado em Linux, o mapeamento de memória desempenha um papel fundamental no manuseio eficiente de processos. Essencialmente, o alinhamento ideal para o código de manipulação de recursos do sistema operacional Android são os limites de 4 bytes. O que isso significa é que, se os APKs estiverem mapeados na memória para os limites de 4 bytes e alinhados de acordo, o sistema operacional não precisará 'ler' todo o pacote de aplicativos para obter o manifesto de dados desejado. Todo processo do sistema saberá com antecedência onde procurar os recursos desejados e, portanto, executará muito mais suave e rapidamente.

Resumindo, o zipaligning de um APK faz com que todos os dados não compactados do pacote sejam alinhados nos limites de 4 bytes, permitindo que todas as partes sejam acessadas diretamente com o mapa da memória. O consumo de RAM é reduzido durante a execução porque o código de consulta não precisa ler todo o pacote de aplicativos.

Fonte

Aniket Thakur
fonte
Por que ele não lê todo o pacote de aplicativos? Os manifestos são garantidos em um deslocamento específico?
Kenneth Worden