2020-06-17

Android 11をEmulatorで動かす際はx86_64を考える必要がなくなった。

https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html

Android 11のリリースに向けて、開発していたところ、こんな記事を見つけました。

Android NDKで開発している場合、ABIの種類として、x86_64arm64-v8a を使うことが多いと思いますが、x86_64 はバイナリのサイズが膨れ上がるので、なるべくアプリに同梱させたくありません。

しかし、 x86_64 がない場合、ARMをエミュレーションを備えたシステムイメージを使う必要がありました。このイメージは、ARMの命令を全て x86_64 に逐一変換しているため、パフォーマンスがあまり良くなく、使っている人はほぼいなかったと思います。

Android 11からは、x86_64 のシステムイメージに、ARMのエミュレーションが統合されました。通常は x86_64 ネイティブで実行されますが、ARMバイナリがあった場合に x86_64 バイナリに変換されて動くことができます。

ちなみに、Virtual Device Configuration で x86_64 のイメージを使う際は、Recommended ではなく、x86 Images のタブを選択しないと出てこないので要注意です。 x86_64 のイメージを使うことで、Emulator実行時のパフォーマンスが x86 と比べて向上するので推奨です。

スクリーンショット 2020-06-17 17 16 06

これにより、Android NDKのABIに x86_64 は不要になり、 arm64-v8a だけでもEmulatorで快適に動くことが出来ました。

現状、 x86_64 のAndroid端末もほぼ見かけなくなったので、これを気に、 x86_64 を落として、APKのサイズを小さくしようかなと思い始めました。

また、Android 11では、OpenSL ESが廃止され、AAudioに統合されたり、ANGLEが正式にサポートされたり、色々機能が盛り沢山ですね。

MediaCodecでも、Google Stadiaサポートのために、メモリアクセスのサポートや、バッファを小さくして低遅延デコードする機能も追加されました。

この内容はまたどこかでご紹介できればと思います。