Estou com um problema com o termo de código de bits incorporado.
O que é código de bits incorporado?
Quando ativar, ENABLE_BITCODE
no novo Xcode?
O que acontece com o binário quando ativado, ENABLE_BITCODE
no Xcode 7?
Código de bits refere-se ao tipo de código: "Código de bits LLVM" enviado ao iTunes Connect. Isso permite que a Apple use certos cálculos para otimizar ainda mais os aplicativos (por exemplo: tamanhos de executáveis possivelmente reduzidos). Se a Apple precisar alterar seu executável, poderá fazer isso sem que uma nova compilação seja carregada.
Isso difere de: Fatiar, que é o processo da Apple para otimizar seu aplicativo para o dispositivo de um usuário com base na resolução e na arquitetura do dispositivo. O fatiamento não requer Bitcode. (Por exemplo: incluindo apenas imagens @ 2x nos 5s)
O App Thinning é a combinação de fatia, código de bits e recursos sob demanda
Bitcode é uma representação intermediária de um programa compilado. Os aplicativos enviados para o iTunes Connect que contêm código de bits serão compilados e vinculados na App Store. A inclusão de código de bits permitirá que a Apple otimize novamente o binário do seu aplicativo no futuro, sem a necessidade de enviar uma nova versão do seu aplicativo para a loja.
O que é código de bits incorporado?
De acordo com os documentos :
Atualização: esta frase em "Novos recursos no Xcode 7" me fez pensar por um longo tempo que o Bitcode é necessário para o Slicing para reduzir o tamanho do aplicativo:
No entanto, isso não é verdade, o Bitcode e o Slicing funcionam independentemente: Slicing consiste em reduzir o tamanho do aplicativo e gerar variantes de pacote de aplicativos, e o Bitcode trata de certas otimizações binárias. Verifiquei isso verificando as arquiteturas incluídas nos executáveis de aplicativos que não são de código de bits e constatando que eles incluem apenas os necessários.
O Bitcode permite que outro componente do App Thinning chamado Slicing gere variantes de pacotes de aplicativos com executáveis específicos para arquiteturas específicas, por exemplo, a variante do iPhone 5S incluirá apenas o executável arm64, o iPad Mini armv7 e assim por diante.Quando ativar ENABLE_BITCODE no novo Xcode?
O que acontece com o binário quando ENABLE_BITCODE está ativado no novo Xcode?
Da referência do Xcode 7:
Aqui estão alguns links que ajudarão a entender melhor o Bitcode :
fonte
Como a pergunta exata é "o que permite o código de bits", eu gostaria de fornecer alguns detalhes técnicos que eu descobri até agora. É praticamente impossível descobrir com 100% de certeza até que a Apple libere o código-fonte desse compilador
Primeiro, o código de bits da Apple não parece ser a mesma coisa que o bytecode do LLVM. Pelo menos, não consegui descobrir nenhuma semelhança entre eles. Parece ter um cabeçalho proprietário (sempre começa com "xar!") E provavelmente alguma mágica de referência de tempo de link que evita a duplicação de dados. Se você gravar uma sequência codificada, ela será inserida nos dados apenas uma vez, em vez de duas vezes o que seria esperado se fosse o bytecode normal do LLVM.
Segundo, o código de bits não é realmente enviado no arquivo binário como uma arquitetura separada, como seria de esperar. Ele não é enviado da mesma maneira que digamos x86 e ARM são colocados em um binário (arquivo FAT). Em vez disso, eles usam uma seção especial no binário MachO específico da arquitetura chamado "__LLVM", que é enviado com todas as arquiteturas suportadas (isto é, duplicadas). Eu suponho que essa é uma breve vinda do sistema do compilador e pode ser corrigida no futuro para evitar a duplicação.
Código C (compilado com
clang -fembed-bitcode hi.c -S -emit-llvm
):Saída IR LLVM:
A matriz de dados que está no IR também muda dependendo da otimização e de outras configurações de geração de código do clang. É completamente desconhecido para mim em que formato ou qualquer coisa que esteja.
EDITAR:
Seguindo a dica no Twitter, decidi revisitar e confirmar. Segui esta postagem do blog e usei sua ferramenta extratora de código de bits para obter o binário do Apple Archive fora do executável do MachO. E depois de extrair o Apple Archive com o utilitário xar, obtive isso (convertido em texto com o llvm-dis, é claro)
A única diferença notável realmente entre o IR sem código de bits e o IR com código de bits é que os nomes de arquivos foram reduzidos para apenas 1, 2 etc. para cada arquitetura.
Também confirmei que o código de bits incorporado em um binário é gerado após otimizações. Se você compilar com -O3 e extrair o código de bits, será diferente do que se você compilar com -O0.
E apenas para obter crédito extra, também confirmei que a Apple não envia código de bit para dispositivos quando você baixa um aplicativo iOS 9. Eles incluem várias outras seções estranhas que não reconheci como __LINKEDIT, mas não incluem o pacote __LLVM .__ e, portanto, não parecem incluir código de bits no binário final executado em um dispositivo. Curiosamente, a Apple ainda envia binários gordos com código separado de 32 / 64bit para dispositivos iOS 8.
fonte
xar!
é o formato de arquivo da Apple.Basicamente, esse conceito é um pouco semelhante ao java, onde o código de bytes é executado em diferentes JVMs e, nesse caso, o código de bits é colocado na loja iTune e, em vez de fornecer o código intermediário para diferentes plataformas (dispositivos), fornece o código compilado que não precisa qualquer máquina virtual para executar.
Portanto, precisamos criar o código de bits uma vez e ele estará disponível para dispositivos existentes ou futuros. É a dor de cabeça da Apple compilar e torná-lo compatível com cada plataforma que eles têm.
Os desenvolvedores não precisam fazer alterações e enviar o aplicativo novamente para dar suporte a novas plataformas.
Vamos dar o exemplo do iPhone 5s quando a Apple introduziu um
x64
chip nele. Embora osx86
aplicativos sejam totalmente compatíveis com ax64
arquitetura, mas para utilizar totalmente ax64
plataforma, o desenvolvedor precisa alterar a arquitetura ou algum código. Depois que ele termina, o aplicativo é enviado à loja de aplicativos para revisão.Se esse conceito de código de bit foi lançado anteriormente, nós, os desenvolvedores, não precisamos fazer alterações para dar suporte à
x64
arquitetura de bits.fonte
Atualizar
A Apple esclareceu que a fatia ocorre independentemente da ativação do código de bits. Também observei isso na prática, onde um aplicativo sem código de bit será baixado apenas como a arquitetura apropriada para o dispositivo de destino.
Original
Mais especificamente :
Da maneira que eu li isso, se você oferecer suporte a código de bits, os downloaders do seu aplicativo obterão apenas a arquitetura compilada necessária para o seu próprio dispositivo.
fonte