Android CPU アーキテクチャ (ABI) について: arm64-v8a、armeabi-v7a、および x86 が重要な理由

Diagram showing one app bundle splitting into arm64-v8a, armeabi-v7a, and x86 architecture-specific APKs

分割された APK ファイルのセットを結合し、携帯電話で「アプリがインストールされていません」というメッセージが表示されるのを見たことがあれば、あるいはさらに悪いことに、アイコンをタップした瞬間にクラッシュするだけで正常にインストールされたのを見たことがあれば、実際の問題は破損したダウンロードとは何の関係もない可能性が十分にあります。それはほぼ間違いなくアーキテクチャに関するものでした。携帯電話が動作する CPU と、アプリのネイティブ コードがコンパイルされた CPU の間の不一致です。ほとんどの Android ユーザーは、静かに何かを壊すその瞬間まで、このことについて考える必要はありませんでしたが、その後、すぐに関連するようになります。ここでは、APK にとって CPU アーキテクチャが何を意味するのか、Play ストア上の 1 つのアプリがそれ自体の複数の異なるビルドとして密かに出荷される理由、および何かをインストールする前に互換性を確認する方法を説明します。

ABI とは

ABI はアプリケーション バイナリ インターフェイスの略です。実際には、これはチップが理解できる命令セット、つまりプロセッサが直接実行できる生のマシンコード形式です。 Android アプリの大部分 (Java または Kotlin で書かれた部分) は、Android ランタイム (ART) 内で実行されるバイトコードにコンパイルされます。ART は、それがどのチップに搭載されているかを特に気にしません。この層は設計上アーキテクチャに依存しないため、Android アプリが通常、これほど幅広いハードウェアで「正常に動作する」理由の大きな部分を占めています。

ネイティブコードは別の話です。多くのアプリ、特にゲーム、カメラ アプリ、機械学習ツール、および大量のオーディオやビデオ処理を行うものは、Android NDK を通じて C または C++ で書かれたネイティブ ライブラリを出荷しています。これらのライブラリは、特定の命令セット用のマシンコードに事前にコンパイルされており、ある命令セット用に構築されたチップは、通常、別の命令セット用に書かれたマシンコードを実行できません。これが、ABI が理解に値するものとして存在する理由のすべてです。アプリにネイティブ .so ライブラリが 1 つでも含まれると、その互換性は、そのライブラリが構築されたアーキテクチャに関連付けられるようになります。

あなたが出会うであろうアーキテクチャ

以前はこの分野にはもっと多様性がありました (単純な armeabi、または MIPS を覚えていますか?) が、2026 年までに、この分野は知っておく価値のある 4 つの ABI に絞り込まれました。

アビビット幅代表的なデバイス注意事項
arm64-v8a64ビットARMほぼ 2019 年以降に販売されたほぼすべての携帯電話新しいアプリのデフォルトのターゲット。 Google は数年前から、Play ストアの新規申請に 64 ビットのサポートを要求してきました。
armeabi-v7a32ビットARM古い端末や低価格端末、一部の低価格携帯電話は新興市場で依然として販売されているほとんどのアクティブなデバイスでは下位互換性が必要なくなったにもかかわらず、多くのアプリが下位互換性のために依然として出荷しています。
x8632ビットインテル古い Intel ベースのタブレット、レガシー エミュレータほとんどが時代遅れです。現在、本物の 32 ビット x86 スマートフォンに出会うことはほとんどありません。
x86_6464ビットインテル一部の Chromebook、デスクトップ Android エミュレータ、数台の x86 タブレットx86 ベースの Android Studio AVD や特定の BlueStacks ビルドなどのエミュレーターでアプリをテストする場合は重要です。

過去 5 ~ 6 年以内に購入した携帯電話を持っている場合、それはほぼ確実に arm64-v8a です。覚えておく価値のある例外は、エミュレータと Chromebook です。これらは、基盤となるラップトップまたはデスクトップ CPU と一致するため、代わりに x86_64 で実行されることがよくあります。

そもそもアプリがわざわざ複数のビルドを配布する理由

明らかな疑問の 1 つは、開発者がなぜすべてのアーキテクチャのネイティブ ライブラリを 1 つの APK に詰め込んで終わりにしないのかということです。一部のアプリはまさにそれを行い、ユニバーサル APK または「ファット」APK と呼ばれます。欠点はサイズです。 arm64-v8a、armeabi-v7a、x86、および x86_64 のネイティブ ライブラリがすべてバンドルされているゲームは、デバイスに必要な 1 つのアーキテクチャのみを含むビルドと比較して、サイズが簡単に 2 倍または 3 倍になります。これを数百万回のインストールに掛け合わせると、そのデバイス上で決して実行されないコードのために、本当に大量の帯域幅とストレージが無駄になることになります。

その無駄を避けるために、Google Play と Android App Bundle 形式では、アプリを小さな基本 APK と一連の構成 APK に分割し、そのうちの 1 つはアーキテクチャ専用です。携帯電話がアプリをリクエストすると、Play ストアは、チップに一致するアーキテクチャ分割のみと、一致する画面密度と言語分割を備えたベース APK を配信します。最終的には、単一のアプリのように動作するインストールが行われますが、舞台裏ではいくつかの専用の部分から組み立てられています。

分割 APK と App Bundle でのこれの使用方法

.apks または .xapk パッケージを開いて、split_config.arm64_v8a.apk、split_config.armeabi_v7a.apk、split_config.xxhdpi.apk、split_config.en.apk などのファイル名が base.apk の隣にあることに気付いた場合は、まさにこのシステムが動作しており、Play ストアによってサイレント配信されるのではなく、ファイルのセットとしてエクスポートされるだけです。電話機は必要のないリソースを単に無視するため、密度と言語の分割は通常、無差別にインストールしても安全です。アーキテクチャの分割は異なります。間違ったものをインストールするか、一致するものをインストールしないと、大きな問題が発生します。

コンバーターを使用して分割パッケージを 1 つのインストール可能な APK にマージし直す場合、マージ プロセスでは、どのアーキテクチャー分割を組み込むかを選択する必要があります。優れたコンバーターは、本当に役立つすべてのアーキテクチャー分割を保持するか、1 つだけを黙って保持してデバイスに一致することを期待するのではなく、ユーザーが選択できるようにします。

アーキテクチャが一致しない場合に何が起こるか

通常のユーザーにとっては見た目も感触も異なるため、区別して知っておく価値のある 2 つの異なる障害モードがあります。

1 つ目は完全なインストールの失敗です。アプリが意味のあるフォールバックを持たずにほぼ完全にネイティブ コードを中心に構築されている場合、Android のパッケージ マネージャーはそのインストールをまったく拒否し、通常は INSTALL_FAILED_NO_MATCHING_ABIS のようなエラーが表示されます。アプリを開くことさえできません。設置業者が玄関であなたを呼び止めます。

2 番目の、よりもどかしい結果は、静かに部分的に成功することです。アプリに Java または Kotlin エントリ ポイントがあり、それ自体は正常に読み込まれますが、アーキテクチャに存在しないネイティブ ライブラリを呼び出そうとした場合、インストールは正常に完了します。アイコンをタップするまではすべて問題がないように見えますが、タップするとアプリはほぼ即座にクラッシュし、多くの場合、ログに UnsatisfiedLinkError が埋め込まれます。これは典型的な「変換してインストールしたらすぐに閉じてしまう」という話で、ほとんどの場合、ファイルの破損ではなくアーキテクチャの問題です。

Diagram comparing a matching arm64 APK that installs and runs successfully against an x86-only APK that fails to install on an arm64 phone with error INSTALL_FAILED_NO_MATCHING_ABIS

自分の携帯電話のアーキテクチャを確認する方法

大多数の人にとって、これは簡単です。お使いの携帯電話が 2019 年以降の場合は、arm64-v8a を想定して次に進みます。確実に確認したい場合、または古いデバイスや珍しいデバイスを扱っている場合は、いくつかの実用的なオプションがあります。

APK がサポートするアーキテクチャを確認する方法

Play ストアの外部からファイルをインストールする前に、推測するのではなく、その中に何が入っているかを確認する価値があります。 APK のネイティブ ライブラリは、lib/ ディレクトリ内のアーキテクチャにちなんで名付けられたフォルダー (lib/arm64-v8a/ や lib/armeabi-v7a/ など) に存在します。 APK の内部構造を検査できるツールであれば、これらのフォルダーのどれが存在するかを正確に知ることができ、それによってファイルがどのデバイスで実行されるかを正確に知ることができます。

インストールする前に確認してください

私たちの APK情報ツール は、APK の内部 lib/ フォルダーを読み取り、それが構築されたすべてのアーキテクチャをリストするため、何かをサイドロードする前に互換性を確認できます。 XAPKSからAPKへのコンバーター を使用して分割パッケージを変換すると、各変換後にこれが自動的に表示され、マージされたファイル内で見つかったアーキテクチャがリストされ、ビルドに一般的なデバイスに必要なスライスが欠けていると思われる場合にフラグが付けられます。

ユニバーサル APK とシングル ABI APK: どちらを使用するべきですか?

項目ユニバーサル/ファット APKシングル ABI APK
ファイルサイズより大きく、場合によっては 2 ~ 4 倍小型で、デバイスに必要なものだけが含まれています
互換性ほぼすべてのデバイスで動作します一致するアーキテクチャ上でのみ動作します
こんな方に最適どこでも機能するはずの 1 つのファイルを共有するが、受信者が不明自分のデバイスのアーキテクチャがすでにわかっている場合
リスクABI の不一致のリスクが非常に低い間違ったものを選択すると失敗またはクラッシュします

分割パッケージでよくある間違い

重要なポイント

  • ABI はチップが理解できる命令セットです。これは、ネイティブ (C/C++) コードを含むアプリの場合にのみ重要です。
  • arm64-v8a は、最新のほぼすべての電話をカバーします。 armeabi-v7a は古いデバイス用です。 x86/x86_64 は主にエミュレータと Chromebook に表示されます。
  • 不要なネイティブ コードをすべてのデバイスに配布することを避けるために、アプリはアーキテクチャごとに分割されるのが一般的です。
  • アーキテクチャが一致しないと、インストールが完全にブロックされるか、一見成功したように見えたインストールの直後にクラッシュが発生します。
  • 何かをインストールする前に、デバイスのアーキテクチャと APK でサポートされているアーキテクチャの両方を確認できるため、推測に頼ることは完全に避けられます。

よくある質問 (FAQ)

通常の Play ストア アプリをインストールするには、携帯電話のアーキテクチャを知る必要がありますか?

いいえ。Play ストアはデバイスを自動的に検出し、一致するアーキテクチャ分割のみを配信するため、これは Play ストアの外部から APK をサイドロードする場合にのみ関係します。

1 つの APK で複数のアーキテクチャを同時にサポートできますか?

はい。 ユニバーサルAPK(ファットAPK)は、サポートされているすべてのアーキテクチャのネイティブライブラリを1つのファイルにまとめています。ファイルサイズは大きくなりますが、チップの種類に関係なく互換性のあるすべてのデバイスにインストールできます。

変換した APK をインストールしてもすぐにクラッシュしてしまうのはなぜですか?

これは通常、アプリに問題なくインストールされる少量の Java コードが含まれているが、デバイスのアーキテクチャに含まれていないネイティブ ライブラリをロードしようとして、実行時に UnsatisfiedLinkError がスローされる場合に発生します。

arm64-v8a は armeabi-v7a アプリと下位互換性がありますか?

一般的にはそうです。ほとんどの arm64-v8a チップは 32 ビット ARM 命令も実行できるため、armeabi-v7a 専用 APK は通常、最新の arm64 携帯電話でも実行できますが、その逆はありません。

x86 Android デバイスは 2026 年でも存在しますか?

現在の携帯電話では x86 または x86_64 が使用されることはほとんどありませんが、一部の古い Intel ベースのタブレット、Android アプリを実行する少数の Chromebook、およびほとんどのデスクトップ Android エミュレーターではまだ x86 または x86_64 が使用されています。

これを暗記する必要はありません。短いバージョン: 最近の携帯電話はほとんどの場合 arm64-v8a であり、アプリはスペースを節約するためにアーキテクチャごとに分割されており、何かがインストールを拒否したり、開いた直後にクラッシュしたりした場合、ファイル自体が壊れていると考える前に、アーキテクチャの不一致は最初に除外する価値のあるものの 1 つです。

Mst Shaefale による設計と文書化 リード開発者兼 Android パッケージ アーキテクト • Android 12 ~ 15 で検証済み

Mst Shaefale は、クライアント側の XAPK/APKS マージ、バイナリ マニフェスト パーサー、APK v1+v2 署名ツールを xapktoapk.com で保守しています。古いコマンドや OS の変更を見つけましたか?編集メモを送信します。