Android

【Android】16KB対応をしてみて

はじめに

Googleから16KBページサイズについての情報が公開されています。
16 KB ページサイズのサポート

参画中のプロジェクトでも16KBの調査が必要だったので、調べた内容を記しておこうと思います。

16KBページサイズとは

いままでAndroidは4KBのページサイズでメモリを管理してきましたが、Android15からは16KBのページサイズが使用できるようになります。これにより、以下のようなパフォーマンスの向上が見込めるようです。

  • システムのメモリ負荷が高いときのアプリ起動時間の短縮: 平均 3.16% 短縮、テストした一部のアプリでは大幅な改善(最大 30%)
  • アプリ起動時の消費電力の削減: 平均 4.56% 削減
  • カメラの起動が速くなる: ホット スタートが平均 4.48%、コールド スタートが平均 6.60% 高速化
  • システムの起動時間の短縮: 平均で 8%(約 950 ミリ秒)短

(公式の情報より)

アプリへの影響は、OSが16KBで動作している場合4KBしか対応していないアプリでは動作しない(クラッシュする)ため、必要であれば対応が必要です。

調査

アプリがjava/kotlinのみで作られている場合は、16KB対応されたAndroid15で動作確認をするだけで特に対応は不要です。
対応が必要なケースは、アプリ/ライブラリがC++(ネイティブ)コードを使用している場合になります。
以下のケースのいずれかに該当する場合は対応が必要と思われます。

  • アプリで C/C++(ネイティブ)コードを使用している。
  • アプリで Android NDK を使用している場合は、アプリでネイティブ コードを使用しています。
  • アプリが、サードパーティのネイティブ ライブラリまたは依存関係(SDK など)とリンクしている
  • デバイス上のネイティブ ライブラリを使用するサードパーティ製アプリビルダーでビルドされたアプリ

(公式より)

参画しているプロジェクトでは

該当するケースを1つ1つ確認していきます。

確認事項 結果
アプリで C/C++(ネイティブ)コードを使用しているか? コードを確認したところ、ネイティブコードは使用していない。
アプリが、サードパーティのネイティブ ライブラリまたは依存関係(SDK など)とリンクしているか? 参画しているプロジェクトでは、ネイティブライブラリとリンクしているため、ここの対応は必要そう。
(調べ方についてはネイティブコードを使っているかどうかを調べる方法を参照)
デバイス上のネイティブ ライブラリを使用するサードパーティ製アプリビルダーでビルドされたアプリか? 関係はなさそう。

上記結果となったため、ネイティブライブラリを作成したところへ問い合わせを行いました。

同時に、アプリ側でもライブラリが16KB対応をしているかを調べることはできそうだったので調査しました。(ライブラリが16KB対応をしているかどうかを調べるにはを参照)

あとはライブラリ側の対応待ちにはなるのですが、16KB対応のデバイスでアプリを動作させるためには、AGP(Android Gradle Plugin)のバージョンを上げる必要があったので、その対応を行なっています。

AGPのバージョンは、8.5.1に上げています。8.5.1未満ではGoogle Playからアプリをインストールできないためです。
詳しくは 16 KB デバイスをサポートするようにアプリをビルドするを参照

対応後、pixel8系向けに16KB対応されたOSのベータ版が配信されているので、それをインストールし、動作確認を行いました。
16KB対応がされていないライブラリが入っている場合は、そのライブラリが動作する画面に遷移したときにクラッシュします。

ネイティブコードを使っているかどうかを調べる方法

アプリがネイティブコードを使用しているかどうかは、Android StudioのAPK Analyzerを使用することで確認できます。ライブラリの中に「.so」が存在している場合が該当します。
調べ方はAPK Analyzer を使用してネイティブ ライブラリを特定するを参照

ライブラリが16KB対応をしているかどうかを調べるには

アプリ側でもライブラリが16KB対応しているかどうかを調べることはできます。
調査方法はreadelfコマンド使用しました。
このコマンドはELFファイルの情報を確認できるコマンドで、このコマンドを使用してとある情報を見ることでライブラリが16KB対応をされているかを確認しました。

コマンド

readelf -Wl <.soファイルのファイルパス> | grep LOAD

出力結果

LOAD 0x000000 0x0000000000000000 0x0000000000000000 0xXXXXXX 0xXXXXXX X X 0x10000
LOAD 0xXXXXXX 0x00000000000XXXXX 0x00000000000XXXXX 0xXXXXXX 0xXXXXXX XX 0x10000

上記のような出力がされます。このうち最後の値が「0x4000」の倍数であれば16KB対応がされていることになります。上記の場合「0x10000」は16進数表記で「0x4000」の倍数になるので対応されていることになります。
※10進数表記に直すと「0x10000」= 65536、 「0x4000」= 16384

「0x1000」となっている場合は10進数表記で「4096」になるので対応はされていないことになります。

最後に

今回はアプリ観点で調査をしていますが、デバイス向けの情報も公開されています。
なので、そう遠くないうちに16KB対応が必須になったり、デバイスも16Kbモードが標準になったりするのかもしれません。


Latest最新記事

Popular人気の記事