Impacto das opções de criação do Xcode “Ativar código de bits” Sim / Não

239

Ontem reconheci uma tonelada de avisos sobre a biblioteca parse.com:

URGENTE: todo o código de bit será descartado porque '[path] /Parse.framework/Parse (PFAnalytics.o)' foi criado sem o código de bit. Você deve reconstruí-lo com o código de bits ativado (configuração ENABLE_BITCODE do Xcode), obter uma biblioteca atualizada do fornecedor ou desativar o código de bit para este destino. Nota: Este será um erro no futuro.

Estou ciente do fato de que posso remover os avisos com esta resposta, mas agora estou me perguntando se isso terá algum impacto negativo em relação ao envio da AppStore e / ou ao desempenho real do meu aplicativo.

Xcode informa sobre o código de bit

A ativação dessa configuração indica que o destino ou projeto deve gerar código de bits durante a compilação para plataformas e arquiteturas que o suportam. Para compilações de arquivo morto, o código de bit será gerado no binário vinculado para envio à loja de aplicativos. Para outras compilações, o compilador e o vinculador verificarão se o código está em conformidade com os requisitos para geração de código de bit, mas não gerará código de bit real. [ENABLE_BITCODE]

Mas não estou obtendo nenhuma informação realmente útil deste texto.

  • Posso usar a resposta vinculada para contornar o problema sem nenhum impacto negativo e sem comprometer um futuro envio da AppStore?
  • O que ENABLE_BITCODErealmente faz, será um requisito não opcional no futuro?
  • Há algum impacto no desempenho se eu o ativar / desativar?
luk2302
fonte

Respostas:

399
  • O que o ENABLE_BITCODE realmente faz, será um requisito não opcional no futuro?

Não tenho certeza em que nível você está procurando uma resposta, então vamos fazer uma pequena viagem. Parte disso você já deve saber.

Quando você constrói seu projeto, o Xcode chama os clangdestinos Objective-C e swift/ swiftcSwift. Ambos os compiladores compilam o aplicativo em uma representação intermediária (IR), um desses IRs é o código de bits. A partir desse IR, um programa chamado LLVM assume e cria os binários necessários para os modos x86 de 32 e 64 bits (para o simulador) e arm6 / arm7 / arm7s / arm64 (para o dispositivo). Normalmente, todos esses binários diferentes são agrupados em um único arquivo chamado binário gordo .

A opção ENABLE_BITCODE corta esta etapa final. Ele cria uma versão do aplicativo com um binário de código de bits IR. Isso tem vários recursos interessantes, mas uma desvantagem gigante: ele não pode ser executado em lugar nenhum. Para que um aplicativo com um binário de código de bits seja executado, ele precisa ser recompilado ( talvez montado ou transcodificado ... não tenho certeza do verbo correto ) em um binário x86 ou ARM.

Quando um aplicativo de código de bit é enviado à App Store, a Apple executa esta etapa final e cria os binários concluídos.

No momento, os aplicativos de código de bits são opcionais, mas o histórico mostrou que a Apple transforma coisas opcionais em requisitos (como suporte a 64 bits). Isso geralmente leva alguns anos, para que os desenvolvedores de terceiros (como o Parse) tenham tempo para atualizar.

  • posso usar o método acima sem nenhum impacto negativo e sem comprometer um envio futuro da appstore?

Sim, você pode desativar ENABLE_BITCODE e tudo funcionará como antes. Até a Apple tornar os aplicativos de código de bit um requisito para a App Store, você ficará bem.

  • Há algum impacto no desempenho se eu o ativar / desativar?

Nunca haverá impactos negativos no desempenho para habilitá-lo, mas a distribuição interna de um aplicativo para teste pode ficar mais complicada.

Quanto aos impactos positivos ... bem, isso é complicado.

Para distribuição na App Store, a Apple criará versões separadas do seu aplicativo para cada arquitetura de máquina (arm6 / arm7 / arm7s / arm64) em vez de um aplicativo com um binário gordo. Isso significa que o aplicativo instalado em dispositivos iOS será menor.

Além disso, quando o código de bits é recompilado ( talvez montado ou transcodificado ... novamente, não tenho certeza do verbo correto ), ele é otimizado. O LLVM está sempre trabalhando para criar novas otimizações melhores. Em teoria, a App Store poderia recriar a versão separada do aplicativo na App Store a cada nova versão do LLVM, para que seu aplicativo pudesse ser otimizado novamente com a mais recente tecnologia LLVM.

Jeffery Thomas
fonte
19
"A Apple criará versões separadas do seu aplicativo para cada arquitetura de máquina (arm6 / arm7 / arm7s / arm64) em vez de um aplicativo com um binário gordo. Isso significa que o aplicativo instalado nos dispositivos iOS será menor." É isso que Slicing faz. Isso não está relacionado ao Bitcode.
user102008
10
"A opção ENABLE_BITCODE corta esta etapa final." Não corta nenhum passo. Todos os binários de arquitetura ainda são produzidos. As informações de código de bit PLUS são adicionadas para CADA arquitetura. Veja stackoverflow.com/a/31030741/102008
user102008
6
Consulte developer.apple.com/library/prerelease/watchos/documentation/… "Slicing é o processo de criação e entrega de variantes do pacote de aplicativos para diferentes dispositivos de destino. Uma variante contém apenas a arquitetura executável e os recursos necessários para o destino dispositivo."
precisa saber é o seguinte
7
Não é uma afirmação verdadeira que ativar o Bitcode tornará o aplicativo instalado no dispositivo menor em comparação com quando o Bitcode está desativado. Em nenhum lugar diz isso.
precisa saber é o seguinte
7
@ onmyway133 Nem todos os fornecedores fornecem fonte. Se tudo que o fornecedor fornecer for uma lib estática e arquivos de cabeçalho (ou um Framework), o fornecedor precisará compilar o material com o código de bits ativado.
Jeffery Thomas
65

Certifique-se de selecionar "Todos" para encontrar as configurações de criação de código de bits ativadas:

Configurações de compilação

Ponto Gama
fonte
35

Bitcode é um novo recurso do iOS 9

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.

Nota: Para aplicativos iOS, o código de bits é o padrão, mas opcional. Se você fornecer código de bits, todos os aplicativos e estruturas no pacote de aplicativos precisarão incluir código de bits. Para aplicativos watchOS, o código de bit é necessário

Portanto, você deve desativar o código de bits até que todas as estruturas do seu aplicativo tenham o código de bit ativado.

agy
fonte
'Otimize novamente o seu binário de aplicativo no futuro' - você pode explicar um pouco mais?
Genaks
Aqui diz o seguinte: "Bitcode é um novo recurso do iOS 9" e que "[...] para aplicativos watchOS, o código de bit é necessário [...]". Então, e se eu quiser criar um aplicativo WatchOS no iOS 8?
Superpuccio
33

O código de bits torna mais difícil o relatório de falhas . Aqui está uma citação do HockeyApp (que também vale para outras soluções de relatórios de falhas):

Ao fazer o upload de um aplicativo na App Store e deixar a caixa de seleção "Bitcode" ativada, a Apple utilizará esse código de compilação e o recompilará antes de distribuí-lo aos dispositivos. Isso fará com que o binário obtenha um novo UUID e há uma opção para baixar um dSYM correspondente através do Xcode.

Nota: a resposta foi editada em janeiro de 2016 para refletir as alterações mais recentes

Alexander Vasenin
fonte
2
Entre setembro e dezembro, este conseguiu ficar fixo via nova opção Xcode Organizer exportação (ver a atualização no citado howto HA) e quebrado novamente (ver o meu resolvido questão HA )
Pavel Zdenek
13

@ vj9 thx. Eu atualizo para o xcode 7. Isso me mostra o mesmo erro. Crie bem após o conjunto "NÃO"

insira a descrição da imagem aqui

definir "NÃO" funciona bem.

insira a descrição da imagem aqui

zszen
fonte
1
@Strtronic Se você deseja selecionar SIM. Você precisa verificar se todo o terceiro framework suporta isso.
zszen 29/09/2015
A versão mínima suportada do iOS para sua segmentação deve ser iOS 6 ou superior.
shallowThought
9

Aqui você encontra toda a solução referente ao Bitcode

Conforme Apple Doc

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 loja. 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 Xcode oculta símbolos gerados durante o tempo de compilação por padrão, para que não sejam legíveis pela Apple. Somente se você optar por incluir símbolos ao enviar seu aplicativo para o iTunes Connect, os símbolos serão enviados para a Apple. Você deve incluir símbolos para receber relatórios de falhas da Apple.

Nota: Para aplicativos iOS, o código de bit é o padrão, mas opcional. Para aplicativos watchOS e tvOS, é necessário um código de bits. Se você fornecer código de bits, todos os aplicativos e estruturas no pacote de aplicativos (todos os destinos no projeto) precisarão incluir código de bits. Depois de distribuir seu aplicativo usando o iTunes Connect, você pode fazer o download do arquivo dSYMs da compilação, descrito em Exibindo e importando falhas na janela Dispositivos

A implantação inicial da Apple do serviço de redução de código de bits e aplicativos foi suspensa, porque os problemas na atualização de um tipo de hardware para um tipo diferente de hardware não restauravam as versões corretas dos binários. Esse problema foi corrigido posteriormente com o iOS 9.0.2 e o recurso reativado.

O código de bits sempre fez parte das fases de compilação e otimização do LLVM, mas ao mover a lógica de back-end para os servidores da Apple, ele move as fases de otimização e montagem do tempo de compilação do desenvolvedor para a implantação da App Store. Isso libera o potencial de futura otimização ou reconversão para oferecer suporte a processadores mais novos e mais rápidos no futuro. As implantações de código de bit são necessárias para os deplos watchOS e tvOS e podem ser ativadas condicionalmente para implantações existentes do iOS com a opção "Ativar código de bit" nas configurações do projeto. Isso adicionará um marcador embed-bitcode-marker para compilações de depuração e embed-bitcode para compilações de arquivamento / dispositivo. Eles podem ser passados ​​para o compilador Swift com -embed-bitcode ou usando clang com -fembed-bitcode.

O código de bits também tem algumas desvantagens.Os desenvolvedores podem depurar relatórios de falhas de aplicativos armazenando cópias dos símbolos de depuração correspondentes ao binário enviado para a Apple. Quando ocorre uma falha em uma determinada pilha, o desenvolvedor pode restaurar o rastreamento da pilha original simbolizando o relatório de falha, usando esses símbolos de depuração. No entanto, os símbolos são um subproduto da tradução da forma intermediária para o binário; mas se essa etapa for realizada no servidor, essas informações serão perdidas. A Apple fornece um serviço de relatório de falhas que pode desempenhar o papel de depurador, desde que o desenvolvedor tenha carregado os símbolos de depuração no momento da publicação do aplicativo. O fato de o desenvolvedor nunca ver o binário exato significa que ele pode não conseguir testar problemas específicos à medida que o novo hardware evolui.

Por fim, o código de bits no servidor pode ser traduzido para suportar novas arquiteturas e conjuntos de instruções à medida que evoluem. Desde que eles mantenham a convenção de chamada e o tamanho do alinhamento e das palavras, um aplicativo de código de bits pode ser traduzido em diferentes tipos de arquitetura e otimizado especificamente para um novo processador. Se forem usadas bibliotecas padrão para rotinas matemáticas e vetoriais, elas poderão ser otimizadas em instruções vetoriais específicas do processador para obter o melhor desempenho para um determinado aplicativo. Os otimizadores podem até gerar várias codificações diferentes e julgar com base no tamanho ou na velocidade de execução.

Para mais informações, verifique aqui e aqui

Rex
fonte
6

Dos documentos

  • posso usar o método acima sem nenhum impacto negativo e sem comprometer um envio futuro da appstore?

O código de bits permitirá que a Apple otimize o aplicativo sem que você precise enviar outra compilação. Porém, você só pode ativar esse recurso se todas as estruturas e aplicativos no pacote de aplicativos tiverem esse recurso ativado. Tê-lo ajuda, mas não tê-lo não deve ter nenhum impacto negativo.

  • O que o ENABLE_BITCODE realmente faz, será um requisito não opcional no futuro?

Para aplicativos iOS, o código de bits é o padrão, mas opcional. Se você fornecer código de bits, todos os aplicativos e estruturas no pacote de aplicativos precisarão incluir código de bits. Para aplicativos watchOS, é necessário um código de bits.

  • Há algum impacto no desempenho se eu o ativar / desativar?

A App Store e o sistema operacional otimizam a instalação dos aplicativos iOS e watchOS, adaptando a entrega dos aplicativos aos recursos do dispositivo específico do usuário, com um espaço mínimo. Essa otimização, chamada redução de aplicativo, permite criar aplicativos que usam mais recursos do dispositivo, ocupam espaço mínimo em disco e acomodam atualizações futuras que podem ser aplicadas pela Apple. Downloads mais rápidos e mais espaço para outros aplicativos e conteúdos oferecem uma melhor experiência ao usuário.

Não deve haver nenhum impacto no desempenho.

vj9
fonte