概要
ページサイズは、OSがメモリを管理する方法を決定する単位です。小さいページサイズは、メモリ管理のオーバーヘッドを削減できますが、より多くのメモリフラグメントが発生する可能性があります。一方、大きいページサイズは、フラグメント化を削減できますが、メモリ管理のオーバーヘッドが増加します。
Androidは従来、4KBのページサイズを使用していましたが、Android 15では、デバイスが16KBページサイズをサポートする場合、オプションで16KBページサイズを使用できるようになりました。
なお、iOSはずいぶん前から16KBサイズに対応しています。
対応
Java/Kotlinだけでプロジェクトが構成されている場合、特にやることはないです。NDK、C/C++を用いたコードを含む場合(.soファイルがapkに含まれる)対応が必要になります。
対応の概要は、公式に詳細が記載されていますが、用いるビルド設定において、16KBを有効化するフラグを付けて再ビルドを行います。
一例ですが、NDK buildを用いて構成されている場合、以下のフラグ地を設定するだけでOKです。
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
動作チェック
まず、Apkが正常に16KB対応でビルドできているかをチェックします。公式にチェックスクリプトがありますので利用しますが、おそらくMacでしか動かないので注意です。
#!/bin/bash
# usage: alignment.sh path to search for *.so files
dir="$1"
RED="\e[31m"
GREEN="\e[32m"
ENDCOLOR="\e[0m"
matches="$(find $dir -name "*.so" -type f)"
IFS=$'\n'
for match in $matches; do
res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)"
if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then
echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)"
else
echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)"
fi
done
含まれるすべての.soがALIGNED
と表示されればOK。
次に動作確認に移りますが、問題は16KB対応の実端末はまだこの世にないことです。(※[追記] Pixel8/8Pro限定で実機テストができるようです。)必然的にエミュレータを用いたチェックとなります。
以下の2つのイメージが用意されていますので、利用している環境に対するエミュレータを構築します。
- Google APIs Experimental 16k Page Size ARM 64 v8a System Image
- Google APIs Experimental 16k Page Size Intel x86_64 Atom System Image
エミュレータ上でまずアプリが起動できれば、一安心。落ちる場合、16KB対応できていない.soが含まれています。C/C++で構成されている部分の機能を総合定期に動作確認します。
最後に
過去64bit対応をしたときと同じようなものですが、実機がない分テストがし辛いかもしれません。
品質テスト部門にどうやって評価してもらうかも含めて今後要検討かなと思います。
追加情報 - 実機での動作確認 ※
16KB対応でデバイスが存在しないと上記で記載しましたが、Android 15 QPR1 ベータ版から Pixel 8 と Pixel 8 Proにて開発者オプションで、16KBを有効化することができすそうです。実機を持っていないので確かめてはいないですが、事実ならば本質テスト部門にはこれらでのデバイスでのテストを依頼すれば良さそう。
参考リンク
https://developer.android.com/guide/practices/page-sizes
https://android-developers.googleblog.com/2024/08/adding-16-kb-page-size-to-android.html