Arquitetura de CPU compatível

1. Introdução à arquitetura

O primeiro sistema Android quase só suportava a arquitetura de CPU ARMv5, e mais tarde foi desenvolvido para suportar sete arquiteturas de CPU diferentes: ARMv5, ARMv7 (de 2010), x86 (de 2011), MIPS (de 2012), ARMv8, MIPS64 e x86_64 (de 2014). ), cada um associado a uma ABI correspondente.
A Interface Binária do Aplicativo define como os arquivos binários (especialmente arquivos .so) são executados na plataforma do sistema correspondente, desde o conjunto de instruções usado, alinhamento da memória até as bibliotecas de funções do sistema disponíveis.
No sistema Android, cada arquitetura de CPU corresponde a uma ABI: armeabi, armeabi-v7a, x86, mips, arm64-v8a, mips64, x86_64.
Mas o último documento oficial do Google removeu mips e armv5, conforme mostrado na figura:

  • x86 / x86_64: Os telefones celulares com arquitetura x86 incluirão uma ferramenta de transcodificação dinâmica de conjunto de instruções chamada Houdini fornecida pela Intel para obter compatibilidade com arm .so. Considerando que o x86 tem uma participação de mercado inferior a 1%, há dois relacionados ao x86. então também pode ser ignorado
  • armeabi: ARM v5 Esta é uma versão muito antiga que não possui suporte de hardware para cálculos de ponto flutuante e apresenta gargalos de desempenho quando uma grande quantidade de cálculos é necessária.
  • armeabi-v7a: ARM v7
  • arm64-v8a: suporte a 64 bits, a versão principal atual. Embora muitos blogs na Internet digam que v7 é a versão principal, testei pessoalmente muitos telefones celulares, todos com a arquitetura arm64-v8a. Os modelos de teste incluem Xiaomi 5-Xiaomi 9. Huawei P30, Huawei mate10, Meilan 2, etc., todos usam arquitetura v8

Consulte a linha de comando da CPU do celular:

adb shell getprop ro.product.cpu.abi

2. Como funciona a ABI

Um dispositivo Android pode suportar várias ABIs, a ABI principal e a ABI auxiliar do dispositivo. Para dispositivos com arm64-v8a como ABI principal, a ABI auxiliar é armeabi-v7a e armeabi. Para dispositivos com armeabi-v7a como ABI principal, a auxiliar ABI é armeabi.
Além disso, os telefones celulares baseados em x86 incluirão uma ferramenta de transcodificação dinâmica de conjunto de instruções chamada Houdini, fornecida pela Intel para obter compatibilidade com arm.so, o que significa que os APPs que se adaptam à plataforma armeabi podem ser executados em telefones celulares x86.

3. Processo de adaptação específico da ABI

Insira a descrição da imagem aqui

Para um telefone celular cuja CPU é arquitetura arm64-v8a, quando ele executa o aplicativo e entra em jnilibs para ler o arquivo da biblioteca, primeiro verifique se existe uma pasta arm64-v8a. Se não existir tal pasta, vá para armeabi-v7a pasta. Se não, procure a pasta armeabi. Se essa pasta não existir, uma exceção será lançada.
Se houver uma pasta arm64-v8a, procure o arquivo .so com um nome específico. Observação: se a pasta o arquivo desejado não foi encontrado, então o arquivo não será encontrado mais abaixo (pasta armeabi-v7a), mas uma exceção será lançada diretamente.

4. Como se adaptar no projeto

Q1: Só é adaptado para armeabi-v7a.Se o APP for instalado em um celular com outras arquiteturas, como arm64-v8a, ele travará?
R: Não, mas funcionará ao contrário.
Porque armeabi-v7a e arm64-v8a serão compatíveis com versões anteriores:

  • Aplicativos que se adaptam apenas ao armeabi podem ser executados em armeabi, x86, x86_64, armeabi-v7a, arm64-v8
  • Adapta-se apenas ao armeabi-v7a e pode rodar em armeabi-v7a e arm64-v8a
  • Adaptado apenas para arm64-v8a e pode ser executado em arm64-v8a

Então, como devemos nos adaptar? As seguintes opções são fornecidas:

  • Adequado apenas para armeabi

        Vantagens: Basicamente adaptado a todas as arquiteturas de CPU (exceto os mips e mips_64 eliminados)
        Desvantagens: baixo desempenho, o que equivale a exigir ABI auxiliar ou transcodificação dinâmica para ser compatível com a maioria dos telefones celulares

  • Adequado apenas para armeabi-v7a

        Da mesma forma, o Plano 1 apenas filtra alguns equipamentos antigos e é mais equilibrado em termos de desempenho e compatibilidade.

  • Adequado apenas para arm64-v8

        Vantagens: Melhor desempenho
        Desvantagens: Só pode rodar em arm64-v8. Se você quiser abrir mão de alguns usuários de equipamentos antigos, todas as
três opções estão disponíveis. Hoje em dia, na adaptação de APP dos principais fabricantes, todas as três opções estão disponíveis, a maioria das quais são as 2 primeiras opções. Qual você escolhe depende de suas próprias considerações. Se você troca desempenho por compatibilidade, arm64-v8 é a escolha; se compatibilidade é troca por desempenho, armeabi, aquele com um equilíbrio um pouco melhor entre os dois é armeabi-v7a.

Já em janeiro deste ano (2019), o Google divulgou um aviso que a partir de 1º de agosto deste ano, além de disponibilizar versões de 32 bits, os aplicativos nas prateleiras também deverão disponibilizar versões de 64 bits.

Portanto, o método anterior de forçar o projeto a usar apenas a arquitetura armeabi não é mais viável.
Então, qual é exatamente o suporte à versão de 64 bits mencionado aqui?
Se o seu aplicativo for totalmente codificado em Java ou Kotlin e não contiver nenhum suporte nativo, significa que o aplicativo já oferece suporte a 64 bits.
No entanto, se qualquer suporte nativo (biblioteca so) for usado no aplicativo, diferentes versões de suporte so precisarão ser fornecidas para diferentes arquiteturas de CPU para esses arquivos so.
Ressalta-se que às vezes, em nosso próprio código, não utilizamos suporte nativo, mas ele está incluído em algumas bibliotecas de terceiros utilizadas no App.
A maneira mais confiável neste momento é analisar o arquivo APK final empacotado e gerado para determinar se o suporte para arquitetura de 64 bits é necessário.

5. Configuração de embalagem

subcontratação dividida
Este comando pode subcontratar de acordo com várias regras, como subcontratação de acordo com abi, densidade de tela (ou seja, ldpi, hdpi, etc.)

splits {
        abi {
            enable true
            reset()
            include 'x86','armabi'
            exclude 'armeabi', 'armeabi-v7a', "arm64-v8a"
            universalApk true
        }
    }

Filtragem ndk{abiFilters:}
Este comando pode ser configurado para empacotar apenas a biblioteca so que você configurou. Se não estiver configurado, não será empacotado. É muito flexível.
Arquivos AAR de terceiros, se o SDK tiver suporte completo para ABI, ele poderá incluir armeabi, armeabi-v7a, x86, arm64-v8a e x86_64. Outros SOs aplicados são compatíveis apenas com armeabi, armeabi-v7a e x86. Três tipos , consulte diretamente o aar do SDK, compilará automaticamente um pacote que suporta 5 tipos de abi. No entanto, outras partes do aplicativo não têm suporte para os outros dois abi, portanto, se o aplicativo for executado em um dispositivo com arm64-v8a e x86_64 como abi preferido, ele irá travar, então precisamos definir a configuração do abiFilter em nosso aplicativo para evitar alguns erros desconhecidos

//Filtrar x86 para biblioteca

//过滤x86的so库
ndk {
    abiFilters 'armeabi', 'armeabi-v7a', 'arm64-v8a'
}

Esta configuração empacotará as bibliotecas so nos três pacotes armeabi, armeabi-v71 e arm64-v8a em um apk, ao contrário das divisões que empacotarão um apk para cada pacote.

Reimpresso de: Android arm64-v8a, armeabi-v7a, explicação detalhada armeabi

Acho que você gosta

Origin blog.csdn.net/u010263943/article/details/125321339
Recomendado
Clasificación