Android CPU アーキテクチャ (ABI) について: arm64-v8a、armeabi-v7a、および x86 が重要な理由
分割された 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-v8a | 64ビットARM | ほぼ 2019 年以降に販売されたほぼすべての携帯電話 | 新しいアプリのデフォルトのターゲット。 Google は数年前から、Play ストアの新規申請に 64 ビットのサポートを要求してきました。 |
| armeabi-v7a | 32ビットARM | 古い端末や低価格端末、一部の低価格携帯電話は新興市場で依然として販売されている | ほとんどのアクティブなデバイスでは下位互換性が必要なくなったにもかかわらず、多くのアプリが下位互換性のために依然として出荷しています。 |
| x86 | 32ビットインテル | 古い Intel ベースのタブレット、レガシー エミュレータ | ほとんどが時代遅れです。現在、本物の 32 ビット x86 スマートフォンに出会うことはほとんどありません。 |
| x86_64 | 64ビットインテル | 一部の 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 が埋め込まれます。これは典型的な「変換してインストールしたらすぐに閉じてしまう」という話で、ほとんどの場合、ファイルの破損ではなくアーキテクチャの問題です。
自分の携帯電話のアーキテクチャを確認する方法
大多数の人にとって、これは簡単です。お使いの携帯電話が 2019 年以降の場合は、arm64-v8a を想定して次に進みます。確実に確認したい場合、または古いデバイスや珍しいデバイスを扱っている場合は、いくつかの実用的なオプションがあります。
- 携帯電話の正確なチップセット モデル (箱、マニュアル、GSMArena などのサイトに表示されます) を調べ、そのチップセットが 32 ビット ARM か 64 ビット ARM かを検索します。
- CPU アーキテクチャを直接レポートする軽量のシステム情報アプリをインストールします。この目的のために、いくつかの無料アプリが存在します。
- 電話機が元の OS バージョンとして Android 9 以降を搭載して出荷されたかどうかを確認します。その頃の Google の 64 ビット要件により、条件を満たしたものについては 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 の不一致のリスクが非常に低い | 間違ったものを選択すると失敗またはクラッシュします |
分割パッケージでよくある間違い
- すべての分割がオプションであると仮定します。 密度と言語は通常分割されますが、アーキテクチャは分割されません。マージ中には決してスキップしないでください。
- ミラー サイトから分割された 1 つのアーキテクチャのみを取得します。 サードパーティのダウンロードが、たとえば armeabi-v7a スライスのみを提供する場合、アプリ自体は正規であっても、代わりに arm64-v8a を必要とするデバイスでは単に失敗する可能性があります。
- タブレットや Chromebook が必ずしも ARM であるとは限らないことを忘れてください。 Android アプリを実行する多くの Chromebook と一部の古いタブレットは、ARM ではなく x86 または x86_64 です。
- x86 エミュレーター内で ARM のみの APK をテストします。 一部の古いエミュレータ ビルドは x86 で実行され、ARM ネイティブ ライブラリのみを同梱する APK は、APK のパッケージ化方法に関係なく、x86 内で起動できません。
- 「ユニバーサル」と「単一 ABI」を混同しています。 ユニバーサル APK はすべてが含まれるため、意図的に大きくなっています。シングル ABI APK は小さく、意図的に 1 つのチップ ファミリに限定されます。
重要なポイント
- 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 つです。