AndroidのABI(Application Binary Interface)概要
AndroidのABI(Application Binary Interface)は、ABI Management | Android Developersによると
ABI は、アプリケーションのマシンコードが実行時にシステムとやりとりする方法を詳細に定義したものです。 アプリで使用したい CPU アーキテクチャごとに、ABI を指定する必要があります。
とのこと。この文面だと何が何やらですが、その端末のCPUアーキテクチャと、その端末のCPUで使える命令セットの組み合わせ、という理解をしておけばいいみたい。
AndroidでサポートされているABIは以下の通りです。
- ARM系: armeabi, armeabi-v7a, arm64-v8a
- x86系: x86, x86_64
- MIPS系: mips, mips64
ABI名に『64』を含んでいるものは64bit、そうでないものは32bitです。また、一般的には同一系統のABIなら下位互換性があるので、arm64-v8aをサポートしている端末ならarmeabi-v7a向けのアプリを動かせます。逆はNG。
ABIを意識する必要があるのはNDKを使った開発をする場合です。普通にJavaで書いている分にはAndroidの仮想マシンがCPUの差異を吸収してくれますが、NDKを使うと仮想マシンの外側を触ることになるので、どのCPUなのかを意識することになるわけです。
概念としてはこのくらい押さえておけば大丈夫かな。実際に手を動かすときには追加で調べることにします。普段NDKとか全く触らないからこのへん疎いんですよね...
(2019/7/23追記) x86版のAndroidはARMバイナリを動かせることを今更知りました。その秘密は、x86版のAndroidに標準で搭載され、Intelの内部コードネームで「Houdini Binary Translator」と呼ばれるバイナリ変換ソフトウェアが、NDKで作られたARMバイナリをx86に変換しながら実行していく。
x86のAndroid端末はarmeabi-v7aとarm64-v8aがあれば「概ね」OKということですね。
(2019/8/8追記) MIPSのサポートって打ち切られてたんですね。知らなかった…注: これまで NDK は 32 ビットおよび 64 ビットの MIPS をサポートしていましたが、NDK r17 でこのサポートは削除されました。
参考URL
- 【本当に32ビット?】Android端末の CPU の ABI を特定する
- 64bitのネイティブライブラリを含めないでビルドする - Qiita
- armeabi-v7aとarm64-v8aを混在させるとUnsatisfiedLinkExceptionで落ちるらしい
- AndroidのNDKやABIについてのメモ - woshidan’s blog
関連(するかもしれない)記事
おススメ