これまで、Android は 4 KB のメモリページサイズしかサポートしていませんでした。 システムメモリのパフォーマンスを最適化 Android デバイスでは通常、これが行われています。Android 15 以降、AOSP は 16 KB(16 KB)のページサイズを使用するように設定されているデバイス 。アプリで NDK ライブラリを直接使用している場合は、 または SDK を介して間接的に行う場合、アプリを再ビルドして 16 KB のデバイスで使用できます。
デバイス メーカーは次々と、より多くのデバイスで 物理メモリ(RAM)に加え、これらのデバイスの多くに 16 KB( ページサイズを拡大して、デバイスのパフォーマンスを最適化します。追加しています 16 KB ページサイズのデバイスをサポートしているため、アプリはこれらの 関連するパフォーマンスの恩恵をアプリに提供するため 改善されています。16 KB デバイスでは、再コンパイルしないとアプリが動作しない可能性があります 将来の Android リリースで製品化される際の要件です。
アプリのサポートを追加できるように、 アプリが影響を受ける場合は、 アプリを再構築し(該当する場合)、アプリをテスト エミュレータ(Android 15 を含む)を使用した 16 KB 環境 Android Emulator 用のシステム イメージ)を作成します。
メリットとパフォーマンスの向上
ページサイズが 16 KB に設定されたデバイスは、平均でわずかに多くのメモリを使用しますが、システムとアプリの両方でさまざまなパフォーマンスの向上が得られます。
- システムがメモリ不足の状況にあるときのアプリの起動時間が短縮: 平均で 3.16% 短縮され、テストした一部のアプリでは大幅な改善(最大 30%)を達成
- アプリ起動時の消費電力の削減: 平均 4.56% を削減
- カメラの起動の高速化: ホットスタートが平均 4.48% 高速化、コールド スタートが平均 6.60% 高速化
- システムの起動時間の改善: 平均 1.5%(約 0.8 秒)改善
これらの改善は初期テストに基づくため、実際のデバイスでの結果とは異なる可能性があります。Google はテストを継続し、アプリの潜在的な利点に関して追加の分析を提供します。
アプリが影響を受けるかどうかを確認する
アプリでネイティブ コードを使用している場合は、16 KB デバイスをサポートするようにアプリを再ビルドする必要があります。アプリがネイティブ コードを使用しているかどうか不明な場合は、APK Analyzer を使用して、ネイティブ コードが存在するかどうかを確認できます。
すべてのライブラリや SDK を含め、Java プログラミング言語または Kotlin で記述されたコードのみを使用しているアプリの場合、すでに 16 KB のデバイスをサポートしています。それでも、16 KB 環境でアプリをテストし、アプリの動作に予期しない回帰がないことを確認することをおすすめします。
アプリがネイティブ コードを使用しているか?
次のいずれかに該当する場合は、アプリでネイティブ コードが使用されています。
- アプリで C/C++(ネイティブ)コードが使用されている。アプリが NDK を使用している場合、アプリはネイティブ コードを使用します。
- アプリがサードパーティのネイティブ ライブラリまたは依存関係にリンクしていて、 使用します。
- お客様のアプリは、Google Cloud 上のネイティブ ライブラリを使用するサードパーティ製アプリビルダーで構築されています ダウンロードします
APK Analyzer を使用してネイティブ ライブラリを特定する
APK Analyzer は、ビルドされたアプリのさまざまな要素を評価するためのツールです。 ダウンロードします。アプリでネイティブ コードとライブラリのどちらを使用しているかを特定する手順は次のとおりです。 手順:
- Android Studio を開き、[File >開く] をクリックし、任意のプロジェクトを選択します。
メニューバーで、[Build] >APK を分析...
分析する APK を選択します。
lib
フォルダ内を確認します。このフォルダは、共有オブジェクト(.so
)ファイル(存在する場合)をホストしています。 あります。共有オブジェクト ファイルが存在する場合、アプリはネイティブ 説明します。共有オブジェクト ファイルが存在しない場合、またはlib
フォルダがない場合は、 ネイティブコードを使用していないからです
16 KB デバイスに対応したアプリをビルドする
16 KB のデバイスをサポートするには、ネイティブ コードを使用するアプリで、 各ステップの概要を説明します
共有ライブラリのパッケージを更新する
AGP バージョン 8.3 以降にアップグレードし、非圧縮 使用します。
AGP バージョン 8.3 以降
16 KB のデバイスでは、リリース時に圧縮されていない共有ライブラリをアプリで使用する必要があります。 16 KB の zip 境界で揃えます。そのためには、まず Android Gradle プラグイン(AGP)バージョン 8.3 以降。詳しくは、Android Gradle プラグイン Upgrade Assistant セクションをご覧ください。
AGP バージョン 8.2 以前
AGP をバージョン 8.3 以降にアップグレードできない場合は、代わりに 圧縮共有ライブラリを使用するように切り替えるGradle の構成を次のように更新します。 アプリをパッケージ化する際に Gradle が共有ライブラリを圧縮するように設定して、 調整されていない共有ライブラリによるインストールの問題
Groovy
build.gradle
ファイルに次のオプションを追加します。
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging true
}
}
}
Kotlin
build.gradle.kts
ファイルに次のオプションを追加します。
android {
...
packagingOptions {
jniLibs {
useLegacyPackaging = true
}
}
}
16 KB ELF アライメントを使用してアプリをコンパイルする
16 KB のデバイスには共有ライブラリが必要です。調整する ELF セグメント 適切に実装する必要があります。
16 KB ELF アライメントを使用してアプリをコンパイルするには、 使用している Android NDK のバージョンに応じて、以下のセクションを確認してください。 できます。
Android NDK r26 以前
Android NDK での 16 KB 対応の共有ライブラリのコンパイルをサポートする
バージョン r26 以前では、ndk-build
または cmake
を更新する必要があります。
次のように構成します。
ndk-build
Android.mk
を更新して 16 KB ELF アライメントを有効にします。
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
CMake
CMakeLists.txt
を更新して 16 KB ELF アライメントを有効にします。
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
Android NDK r27 以降
Android NDK による 16 KB 対応の共有ライブラリのコンパイルをサポートする
バージョン r27 以降では、ndk-build
、build.gradle
、
build.gradle.kts
、またはリンカーフラグは次のようになります。
ndk-build
Application.mk
で以下を行います。
APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
Groovy
build.gradle
ファイルで、次の引数を設定します。
-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
}
}
}
}
Kotlin
build.gradle.kts
ファイルで、次の引数を設定します。
-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON
:
android {
...
defaultConfig {
...
// This block is different from the one you use to link Gradle
// to your CMake or ndk-build script.
externalNativeBuild {
// For ndk-build, instead use the ndkBuild block.
cmake {
// Passes optional arguments to CMake.
arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
}
}
}
}
他のビルドシステム
次のリンカーフラグを指定します。
-Wl,-z,max-page-size=16384
特定のページサイズを参照しているコード インスタンスを確認する
アプリが 16 KB 単位で調整されていても、 コードでは、デバイスが特定のページサイズを使用していることを想定しています。これを回避するには 次の手順に沿って操作します。
PAGE_SIZE
を参照するハードコードされた依存関係を削除します。 コードロジック内の定数またはインスタンスを使用して、 サイズが 4 KB(4096
)である。代わりに
getpagesize()
またはsysconf(_SC_PAGESIZE)
を使用してください。mmap()
とページ調整を必要とするその他の API の使用状況を探す 必要に応じて代替テキストに置き換えます。
アプリが PAGE_SIZE
を
基になるページサイズに関連している場合、
16 KB モードで使用する場合。ただし、この値がカーネルに
MAP_FIXED
を指定せずに mmap
を指定しても、カーネルはページ全体を使用します。
メモリが無駄になりますこうした理由により、16 KB の場合、PAGE_SIZE
は未定義になります。
NDK r27 以降で有効になっています。
アプリがこの方法で PAGE_SIZE
を使用し、この値を
次に、PAGE_SIZE
を使用する代わりに、新しい変数属性で新しい変数を作成します。
他の目的で使用されていることがわかるような名前を付け、実際の
表示されます。
16 KB の環境でアプリをテストする
16 KB デバイスをサポートするアプリをビルドした後で、 16 KB の環境でアプリをテストし、以下の問題があるかどうかを確認する 予測します手順は次のとおりです。
次のいずれかのテスト環境を設定します。
テストデバイスを起動してから、次のコマンドを実行して、 16 KB の環境を使用している場合:
adb shell getconf PAGE_SIZE
このコマンドは
16384
の値を返します。共有ライブラリの場合、共有ライブラリのELF セグメントは 16 KB ELF 配置を使用して適切に配置されます。このスクリプトを使用して、 このプロセスに関するヘルプ:
#!/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
スクリプトを
alignment.sh
などのファイルに保存します。アプリの APK ファイルを抽出します。
unzip APK_NAME.apk -d /tmp/my_apk_out
/tmp/my_apk_out
内の抽出されたファイルに対してスクリプトを実行します。 ディレクトリ:alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
このスクリプトは、すべてのテーブルに対して
ALIGNED
またはUNALIGNED
を出力します。arm64-v8a
個の共有ライブラリ。arm64-v8a
共有ライブラリのいずれかがUNALIGNED
の場合、次の操作を行う必要があります。 それらのライブラリのパッケージを更新してから、アプリケーションを アプリに移動し、このセクションの手順に沿って再テストします。
次の
zipalign
コマンドを実行して、アプリが 16 KB で揃え。APK_NAME は名前 アプリの APK ファイルを次のように変更します。zipalign -c -P 16 -v 4 APK_NAME.apk
影響を受ける可能性のある部分を中心に、アプリを徹底的にテストする 特定のページサイズを参照するコード インスタンスを変更するをご覧ください。
16 KB ベースの Android 15 システム イメージを使用して Android Emulator をセットアップする
Android Emulator を使用して 16 KB の環境をセットアップする手順は次のとおりです。 手順:
16 KB ベースの Android 15 Emulator のシステム イメージは、 Android Studio Jellyfish |2023.3.1 以降。ただし、 使用する場合は、Android 15 ベータ版の最新の プレビュー版です。
なお、Android Studio の既存のバージョンをそのままお使いいただけます。 複数のバージョンを一緒にインストールできます。
Android Studio で [Tools] > [SDK Manager] をクリックします。
[SDK Platforms] タブで、[Show Package Details] チェックボックスをオンにして展開します。 [Android VanillaIceCream Preview] セクションで、次のいずれかまたは両方を選択します。 仮想デバイスに応じて、次のエミュレータ システム イメージが必要です。 作成します。
- Google API 試験運用版 16k ページサイズ ARM 64 v8a システム イメージ
- Google API 試験運用版 16k ページサイズ Intel x86_64 Atom システム イメージ
[適用 >選択したシステム イメージをダウンロードします。
手順に沿って Android 15 の仮想デバイスをセットアップします。また、 システム イメージを選択するよう求められたら、そのイメージに必要な 16 KB のシステム イメージ 表示されます。自動的におすすめされない場合は、 [Other Images] タブの 16 KB システム イメージ。