【Android15】16KBページサイズサポートの対応と確認方法

この記事からわかること
- Android Studio/Kotlinで16KBページサイズの対応方法
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Meerkat
- Kotlin:2.0.21
- Android OS:15以降
参考文献:Android15で追加される16KBページサイズの対応について詳しくみていく
16KBページサイズサポートとは?
これまでAndroidは4KBのメモリページサイズしかサポートしていませんでしたが、Android15以降から16KBのページサイズに対応するように変更になりました。
16KBに引き上がったことでxメモリ使用量は少し増加するようですが、アプリのパフォーマンスが向上するようになります。
- アプリ起動時間の短縮
- アプリ起動時の消費電力の削減
- カメラ起動時間の短縮
- システム起動時間の短縮
- etc...
対応するべきこと
実際ほとんどのAndroidアプリが対応不要の可能性が高いです。対象となるのはネイティブコード(C/C++ / NDK)を使用している(.soファイルがapkに含まれる)場合のみです。これはアプリ内はもちろんサードパーティのライブラリなども含まれるので注意してください。
もし使用している場合は16KBをサポートするようにアプリを修正し、再度アップロードし直す必要があります。実際に16KBに対応していないアプリを起動するとクラッシュしてしまうこともあるようです。
各ツールを最新バージョン(AGP バージョン 8.5.1 以降、NDK バージョン r28 以降)に更新し、16KB互換のビルド済み依存関係を使用すると、アプリはデフォルトで16KBサポートになるようです
確認方法1:APK Analyzerを使用する
自分のアプリが16KB対応しているかどうかを確認する方法をまとめていきます。まずはAPKを解析して.soファイルが存在するかどうかを確認してみます。
公式リファレンス:APK Analyzer を使用してネイティブ ライブラリを特定する
まずはプロジェクトを立ち上げて最新のapkファイルを生成しておきます。
続いて上部メニューの「Build」 > 「Analyze APK...」をクリックし、対象のAPKファイルを選択します。すると以下のようにapkファイル内の構成が表示されます。この中のlib
ディレクトリの中に.so
ファイルがあるかどうかを確認してください。.so
ファイルないまたはlib
ディレクトリ自体がない場合は対応は不要です。

.so
ファイルがあった場合でもすでに対応済みのライブラリなどの場合は特に対応は必要ありません。
確認方法2:soファイルが対応済みかどうかを確認する
公式リファレンス:check_elf_alignment.sh スクリプトを使用する(Linux または macOS)
.so
ファイルが存在した場合は16KBに対応しているかどうかを確認する必要があります。先ほどのAPK Analyzerでは存在するかどうかしか確認ができないので公式が提供しているスクリプトを使用して確認していきます。
まずはcheck_elf_alignment.shスクリプトに記述されている内容をコピーしたファイルを用意し、apkファイルと同階層に設置します。
あとはスクリプトを実行するだけで確認処理が走り対象の.so
ファイルに対してALIGNED
と表示されていれば16KB対応済みになります。UNALIGNED
と出ている場合は対応済みのバージョンにライブラリをアップデートなどする必要があります。
$ ./check_elf_alignment.sh app-debug.apk
Recursively analyzing app-debug.apk
NOTICE: Zip alignment check requires build-tools version 35.0.0-rc3 or higher.
You can install the latest build-tools by running the below command
and updating your $PATH:
sdkmanager "build-tools;35.0.0-rc3"
=== ELF alignment ===
/var/folders/wh/vtp248lx2fs00q111ngnmc2h0000gn/T/app-debug_out_XXXXX.ikb1GrvZes/lib/arm64-v8a/libdatastore_shared_counter.so: \e[32mALIGNED\e[0m (2**14)
ELF Verification Successful
=====================
うまくスクリプトが実行できない場合はパーミッションを確認してみてください。私は実行権限がなかったので付与しておきました。
$ -rw-r--r--@ 1 s staff 51219556 6 26 11:24 app-debug.apk
$ chmod 755 check_elf_alignment.sh
$ -rwxr-xr-x@ 1 s staff 2906 6 26 11:40 check_elf_alignment.sh
確認方法3:16KBデバイスで起動して確認する
16KBサポートのデバイスで実際にアプリを起動させてみて確認してみます。今回はエミュレーターで確認したいのでデバイスマネージャーから新しい仮想デバイスを作成していきます。Android15以上をサポートしているデバイスを選択してPre-Release 16 KB Page Size Google Play ARM 64 v8a System
をダウンロードし、エミューレーターを作成します。
対象のエミュレーターでアプリを起動し、問題なく起動できるかを確認してみてください。またターミナルからadb shell getconf PAGE_SIZE
を実行して16KBデバイスであるかどうかを確認することができます。

$ adb shell getconf PAGE_SIZE
16384
もし4096
と表示されていれば4KBのデバイスなので設定を見直してみてください。
$ adb shell getconf PAGE_SIZE
4096
公式リファレンス:一部のエミュレータ バージョンとシステム イメージの追加手順
16KB対応
対応するべき箇所によりやることは異なります。
AGPバージョン8.5以前
AGPのバージョンが何かしらの理由でアップデートできず、8.5以前の場合は以下を「build.gradle」に追加します。
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Android NDK r27以前
NDKのバージョンが何かしらの理由でアップデートできず、r27以前の場合にndk-build
を使用している場合は以下を「Application.mk」に追加します。
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。