16 KB ページサイズのサポート

従来、Android は 4 KB のメモリページサイズのみをサポートしていました。そのため、システムメモリのパフォーマンスは、Android デバイスの通常の合計メモリ量の平均に合わせて最適化されていました。

ただし、デバイス メーカーは今後も大量の物理メモリ(RAM)を搭載したデバイスを開発し続けているため、デバイスのパフォーマンスを最適化するために、これらのデバイスの多くは 16 KB(最終的にはより大きなページサイズ)で設定されるようになるでしょう。デバイス メーカーは、今後の 16 KB デバイスでも、4 KB デバイスと同様にパフォーマンスをさらに最適化する予定です。16 KB デバイスのサポートを追加すると、これらのデバイスでアプリを実行できるようになり、関連するパフォーマンスの向上によるメリットが得られます。

メリットとパフォーマンスの向上

ページサイズが 16 KB に設定されたデバイスは、平均でわずかに多くのメモリを使用しますが、システムとアプリの両方でさまざまなパフォーマンスの向上が得られます。

  • システムがメモリ不足の状況にあるときのアプリの起動時間が短縮: 平均で 3% 短縮
  • アプリ起動時の消費電力の削減: 平均 4.56% を削減
  • カメラの起動の高速化: ホットスタートが平均 4.48% 高速化、コールド スタートが平均 6.60% 高速化
  • システムの起動時間の改善: 平均 1.5%(約 0.8 秒)改善

これらの改善は初期テストに基づくため、実際のデバイスでの結果とは異なる可能性があります。Google はテストを継続し、アプリの潜在的な利点に関して追加の分析を提供します。

アプリが影響を受けるかどうかを確認する

アプリでネイティブ コードを使用している場合は、16 KB デバイスをサポートするアプリを再ビルドする必要があります。アプリがネイティブ コードを使用しているかどうか不明な場合は、APK Analyzer を使用して、ネイティブ コードが存在するかどうかを確認できます。

すべてのライブラリや SDK を含め、Java プログラミング言語または Kotlin で記述されたコードのみを使用しているアプリの場合、すでに 16 KB のデバイスをサポートしています。それでも、16 KB 環境でアプリをテストし、アプリの動作に予期しない回帰が発生していないことを確認することをおすすめします。

アプリがネイティブ コードを使用しているか?

次のいずれかに該当する場合は、アプリでネイティブ コードを使用しています。

  • アプリで C/C++(ネイティブ)コードを使用している。アプリで Android NDK を使用している場合、アプリはネイティブ コードを使用します。
  • アプリがサードパーティのネイティブ ライブラリとリンクしていること。
  • デバイスでネイティブ ライブラリを使用するサードパーティのアプリビルダーによってアプリがビルドされている。

APK Analyzer を使用してネイティブ ライブラリを特定する

APK Analyzer は、ビルドされた APK のさまざまな要素を評価するためのツールです。アプリがネイティブ コードまたはライブラリを使用しているかどうかを確認する手順は次のとおりです。

  1. Android Studio を開き、[File] > [Open] をクリックして、任意のプロジェクトを選択します。
  2. メニューバーで、[Build] > [Analyze APK...] をクリックします。

    APK Analyzer を起動する Studio の [ビルド] メニュー オプション

  3. 分析する APK を選択します。

  4. lib フォルダ内を調べます。共有オブジェクト(.so)ファイルが存在する場合は、このフォルダがホストされています。共有オブジェクト ファイルが存在する場合、アプリはネイティブ コードを使用します。共有オブジェクト ファイルが存在しない場合、または lib フォルダが存在しない場合、アプリはネイティブ コードを使用しません。

    共有オブジェクト ファイルが存在することを示している APK Analyzer ビュー

16 KB デバイスをサポートするアプリをビルドする

16 KB デバイスをサポートするには、ネイティブ コードを使用するアプリで次のセクションで説明する手順を完了する必要があります。

16 KB ELF アライメントを使用してアプリをコンパイルする

16 KB のデバイスでアプリを実行するには、16 KB の ELF アライメントを使用して ELF セグメントを適切に配置する必要があります。16 KB ELF アライメントを使用してアプリをコンパイルするには、使用している Android NDK のバージョンに応じて、次のいずれかのセクションの手順を行います。

Android NDK r26 以前

リンク時に次のフラグを指定します。

-Wl,-z,max-page-size=16384

Android NDK r27 以降

ndk-build

Application.mk で次のようにします。

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

CMake

CMake の引数で -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON を渡します。

他のビルドシステム

リンク時に次のフラグを指定します。

-Wl,-z,max-page-size=16384

特定のページサイズを参照するコード インスタンスを確認する

アプリが 16 KB に整列していても、コード内の箇所でデバイスが特定のページサイズを使用していると想定すると、アプリでエラーが発生する可能性があります。これを回避するには、次の操作を行います。

  1. PAGE_SIZE 定数を参照するハードコードされた依存関係、またはデバイスのページサイズが 4 KB(4096)であると想定するコードロジック内のインスタンスをすべて削除します。

    代わりに getpagesize() または sysconf(_SC_PAGESIZE) を使用してください。

  2. mmap() と、ページ整列した引数を必要とするその他の API の使用方法を探し、必要に応じて代替手段に置き換えます。

16 KB 環境でアプリをテストする

16 KB デバイスをサポートするアプリをビルドしたら、16 KB 環境でアプリをテストし、リグレッションが発生するかどうかを確認します。これを行うには、次のいずれかのテスト環境を使用します。