CPUアーキテクチャの互換性

1. アーキテクチャの紹介

初期の Android システムはほぼ ARMv5 CPU アーキテクチャのみをサポートしていましたが、後に 7 つの異なる CPU アーキテクチャをサポートするように開発されました: ARMv5、ARMv7 (2010 年以降)、x86 (2011 年以降)、MIPS (2012 年以降)、ARMv8 、MIPS64 および x86_64 (2014 年以降) )、それぞれが対応する ABI に関連付けられています。
アプリケーション バイナリ インターフェイスは、使用される命令セット、メモリ アライメント、利用可能なシステム関数ライブラリに至るまで、対応するシステム プラットフォーム上でバイナリ ファイル (特に .so ファイル) がどのように実行されるかを定義します。
Android システムでは、各 CPU アーキテクチャは ABI (armeabi、armeabi-v7a、x86、mips、arm64-v8a、mips64、x86_64) に対応します。
しかし、最新の Google 公式ドキュメントでは、図に示すように mips と armv5 が削除されています。

  • x86 / x86_64: x86 アーキテクチャの携帯電話には、arm .so との互換性を実現するために Intel が提供する Houdini と呼ばれる命令セット動的トランスコーディング ツールが含まれます。x86 の市場シェアが 1% 未満であることを考慮すると、x86 に関連するものは 2 つあります。したがって無視することもできます
  • armeabi: ARM v5 これは非常に古いバージョンであり、浮動小数点計算のハードウェア サポートが不足しており、大量の計算が必要な場合にパフォーマンスのボトルネックがあります。
  • armeabi-v7a: ARM v7
  • arm64-v8a: 64 ビットのサポート、現在の主流バージョン。インターネット上の多くのブログでは v7 が主流バージョンであると述べていますが、私は個人的に多くの携帯電話をテストしましたが、それらはすべて arm64-v8a アーキテクチャを備えています。テスト モデルには Xiaomi が含まれます5-Xiaomi 9. Huawei P30、Huawei mate10、Meilan 2 などはすべて v8 アーキテクチャを使用しています

携帯電話の CPU コマンド ラインをクエリします。

adb shell getprop ro.product.cpu.abi

2. ABI の仕組み

Android デバイスは、デバイスのメイン ABI と補助 ABI という複数の ABI をサポートできます。メイン ABI として arm64-v8a を備えたデバイスの場合、補助 ABI は armeabi-v7a および armeabi です。メイン ABI として armeabi-v7a を備えたデバイスの場合、補助 ABI はABIはアルメアビです。
さらに、x86 ベースの携帯電話には、arm.so との互換性を実現するために Intel が提供する Houdini と呼ばれる命令セット動的トランスコーディング ツールが含まれます。これは、armeabi プラットフォームに適応する APP が x86 携帯電話上で実行できることを意味します。

3. ABI 固有の適応プロセス

ここに画像の説明を挿入します

CPU が arm64-v8a アーキテクチャの携帯電話の場合、アプリを実行して jnilibs に入り、ライブラリ ファイルを読み取るときに、まず arm64-v8a フォルダーがあるかどうかを確認します。そのようなフォルダーがない場合は、armeabi-v7a に移動します。 「いいえ」の場合は、armeabi フォルダーを探します。そのようなフォルダーがない場合は、例外がスローされます
。arm64-v8a フォルダーがある場合は、特定の名前の .so ファイルを探します。必要なファイルが見つからないため、その下 (armeabi-v7a フォルダー) にファイルは見つかりませんが、例外が直接スローされます。

4. プロジェクトに適応する方法

Q1: armeabi-v7a のみに対応していますが、arm64-v8a などの他のアーキテクチャの携帯電話にアプリをインストールするとクラッシュしますか?
A: いいえ、しかしそれは逆になります。
armeabi-v7a と arm64-v8a には下位互換性があるため、次のようになります。

  • armeabi にのみ適応するアプリは、armeabi、x86、x86_64、armeabi-v7a、arm64-v8 で実行できます。
  • armeabi-v7a にのみ適応し、armeabi-v7a および arm64-v8a で実行可能
  • arm64-v8a にのみ適合し、arm64-v8a 上で実行可能

では、どのように適応すればよいのでしょうか? 次のオプションが提供されます。

  • アルメアビのみに適しています

        長所: 基本的にすべての CPU アーキテクチャに適合します (省略された mips と mips_64 を除く)
        短所: パフォーマンスが低いため、ほとんどの携帯電話と互換性を持たせるために補助 ABI または動的トランスコーディングが必要になるのと同じです。

  • armeabi-v7a にのみ適しています

        同様に、プラン 1 では一部の古い機器のみが除外され、パフォーマンスと互換性の点でよりバランスが取れています。

  • arm64-v8 にのみ適しています

        長所: 最高のパフォーマンス
        短所: arm64-v8 でのみ実行可能. 一部の古い機器ユーザーを諦めたい場合は、
3 つのオプションすべてが利用可能. 現在、大手メーカーの APP 対応では、3 つのオプションすべてが利用可能です。最初の 2 つのオプションです。パフォーマンスと互換性をトレードオフにする場合は arm64-v8 を選択し、パフォーマンスと互換性をトレードオフする場合は armeabi を選択しますが、両者のバランスがわずかに優れているのは armeabi-v7a です。

今年(2019年)1月の時点で、Googleは今年8月1日から、店頭にあるアプリは32ビット版の提供に加えて64ビット版も提供する必要があるとの通知を出しました。

したがって、プロジェクトに armeabi アーキテクチャのみの使用を強制する以前の方法は、もはや実現できません。
では、ここで言う 64 ビット版のサポートとは具体的に何でしょうか?
アプリケーションが完全に Java または Kotlin でコーディングされており、ネイティブ サポートが含まれていない場合、アプリケーションはすでに 64 ビットをサポートしていることを意味します。
ただし、アプリケーションでネイティブ サポート (so ライブラリ) が使用されている場合は、これらの so ファイルの異なる CPU アーキテクチャに対して異なるバージョンの so サポートを提供する必要があります。
独自のコードではネイティブ サポートを使用しない場合もありますが、アプリで使用される一部のサードパーティ ライブラリにはネイティブ サポートが含まれていることに注意してください。
現時点で最も信頼できる方法は、最終的にパッケージ化され生成された APK ファイルを分析して、64 ビット アーキテクチャのサポートが必要かどうかを判断することです。

5. 梱包形態

分割サブコントラクト
このコマンドは、abi、画面密度 (つまり、ldpi、hdpi など) に従ったサブコントラクトなど、さまざまなルールに従ってサブコントラクトできます。

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

ndk{abiFilters:} フィルタリング
このコマンドは、設定した so ライブラリのみをパッケージ化するように設定できます。設定されていない場合、パッケージ化されません。非常に柔軟です。
サードパーティの AAR ファイル。SDK が ABI を比較的完全にサポートしている場合、SDK には armeabi、armeabi-v7a、x86、arm64-v8a、および x86_64 の 5 つの ABI が含まれる可能性がありますが、適用する他の SO は armeabi、armeabi-v7a、 x86 の 3 種類は、SDK の aar を直接参照し、5 種類の abi をサポートするパッケージを自動的にコンパイルします。ただし、アプリケーションの他の 2 つの ab​​i はサポートされていないため、arm64-v8a および x86_64 を優先 abi として使用するデバイスでアプリケーションを実行するとクラッシュするため、アプリで abiFilter 構成を構成する必要があります。いくつかの不明なエラーを回避するため

// x86 so ライブラリをフィルタリングします

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

この構成では、パッケージごとに apk をパックする分割とは異なり、armeabi、armeabi-v71、および arm64-v8a の 3 つのパッケージの下にある so ライブラリを 1 つの apk にパッケージ化します。

転載元:Android arm64-v8a、armeabi-v7a、armeabi 詳細説明

おすすめ

転載: blog.csdn.net/u010263943/article/details/125321339