過去 Android 僅支援 4 KB 的記憶體分頁大小,這已針對 Android 裝置通常擁有的平均總記憶體量,最佳化系統記憶體效能。從 Android 15 開始,AOSP 支援設定為使用 16 KB 頁面大小的裝置 (16 KB 裝置)。如果應用程式使用任何 NDK 程式庫 (直接或透過 SDK 間接使用),您必須重建應用程式,才能在這些 16 KB 裝置上運作。
隨著裝置製造商持續打造實體記憶體 (RAM) 容量更大的裝置,許多裝置將採用 16 KB (最終會更大) 的分頁大小,以最佳化裝置效能。為 16 KB 頁面大小的裝置新增支援功能,可讓應用程式在這些裝置上執行,並享有相關的效能提升優勢。如果沒有重新編譯,應用程式就無法在日後的 Android 版本中,於 16 KB 裝置上運作。
為協助您為應用程式新增支援功能,我們提供了相關指南,說明如何檢查應用程式是否受到影響、如何重建應用程式 (如適用),以及如何使用模擬器 (包括 Android Emulator 的 Android 15 系統映像檔),在 16 KB 環境中測試應用程式。
優點和效能提升
配置为使用 16 KB 页面大小的设备平均会使用略多一些的内存,但系统和应用的性能也会得到各种提升:
- 缩短了系统内存压力时的应用启动时间:平均降低了 3.16%;对于我们测试的某些应用而言,改进幅度更大(最高可达 30%)
- 应用启动期间的功耗降低:平均降低了 4.56%
- 相机启动更快:热启动速度平均提高了 4.48%,冷启动速度平均提高了 6.60%
- 缩短了系统启动时间:平均缩短了 8%(约 950 毫秒)
这些改进基于我们的初始测试,实际设备上的结果可能会有所不同。随着测试的继续进行,我们将进一步分析应用的潜在收益。
檢查您的應用程式是否受到影響
如果應用程式使用任何原生程式碼,請重新建構應用程式,支援 16 KB 裝置。如果您不確定應用程式是否使用原生程式碼,可以使用 APK 分析工具找出是否有任何原生程式碼,然後檢查找到的任何共用程式庫的 ELF 區段是否對齊。Android Studio 也提供相關功能,可協助您自動偵測對齊問題。
如果應用程式只使用以 Java 程式設計語言或 Kotlin 編寫的程式碼 (包括所有程式庫或 SDK),則應用程式已可支援 16 KB 裝置。不過,我們建議您在 16 KB 環境中測試應用程式,確認應用程式行為沒有發生非預期的迴歸。
應用程式是否使用原生程式碼?
如果符合下列任一條件,即表示應用程式使用原生程式碼:
- 應用程式使用任何 C/C++ (原生) 程式碼。如果應用程式使用 Android NDK,則表示應用程式使用原生程式碼。
- 您的應用程式與使用這些程式庫的任何第三方原生程式庫或依附元件 (例如 SDK) 連結。
- 您的應用程式建構工具為使用裝置原生程式庫的第三方應用程式。
使用 APK 分析工具找出原生程式庫
APK 分析工具可用來多方評估已建構的 APK。如要檢查應用程式是否使用原生程式碼 (無論是否支援 16 KB),請按照下列步驟操作:
- 開啟 Android Studio,然後依序點選「File」>「Open」,並選擇任一專案。
在選單列中,依序點選「Build」>「Analyze APK...」
選擇要分析的 APK。
查看「
lib
」資料夾,查看有否代管的共用物件 (.so
) 檔案。如果存在任何共用物件檔案,應用程式就會使用原生程式碼。「對齊」欄會顯示有對齊問題的檔案警告訊息。如果沒有共用物件檔案或lib
資料夾,表示應用程式未使用原生程式碼。
透過自動檢查功能偵測對齊問題
如果預先建構的程式庫或 APK 不符合 16 KB 的規定,Android Studio 會主動顯示警告。使用 APK 分析器工具,查看哪些程式庫需要更新,或是否需要進行任何程式碼變更。

Android Studio 中的 Lint 也會醒目顯示未對齊 16 KB 的原生程式庫。

檢查共用程式庫的 ELF 區段對齊方式
對於任何共用程式庫,請使用 16 KB ELF 對齊方式,確認共用程式庫的 ELF 區段已正確對齊。如果您在 Linux 或 macOS 上開發,可以使用 check_elf_alignment.sh
指令碼,詳情請見下一節。您也可以直接使用指令列工具。
使用 check_elf_alignment.sh 指令碼 (Linux 或 macOS)
請按照下列步驟,使用 check_elf_alignment.sh
指令碼檢查 ELF 區段的對齊方式:
將
check_elf_alignment.sh
指令碼儲存至檔案。在應用程式的 APK 檔案上執行指令碼:
check_elf_alignment.sh APK_NAME.apk
指令碼會為所有
arm64-v8a
共用程式庫輸出ALIGNED
或UNALIGNED
。如果任何
arm64-v8a
或x86_64
共用程式庫是UNALIGNED
,您需要更新這些程式庫的封裝,然後重新編譯應用程式,並按照本節中的步驟重新測試。
直接使用指令列工具
請按照下列步驟,直接使用指令列工具檢查 ELF 區段的對齊方式:
- 請務必使用 Android Studio 中的 SDK 管理工具或
sdkmanager
指令列工具,安裝 Android SDK Build-Tools 35.0.0 以上版本和 Android NDK。 解壓縮應用程式的 APK 檔案:
Linux 或 macOS
unzip APK_NAME.apk -d /tmp/my_apk_out
Windows (PowerShell)
Expand-Archive -Path .\APK_NAME.apk -DestinationPath ~\tmp\my_apk_out
在您解壓縮 APK 檔案的暫時目錄中,檢查
lib
目錄的內容,找出共用物件 (.so
) 檔案。這些是您使用 APK 分析工具識別原生程式庫時看到的相同共用物件檔案。在每個共用物件檔案上執行下列指令:Linux 或 macOS
SDK_ROOT_LOCATION/Android/sdk/ndk/NDK_VERSION/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-objdump -p SHARED_OBJECT_FILE.so | grep LOAD
Windows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\ndk\NDK_VERSION\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-objdump.exe -p SHARED_OBJECT_FILE.so | Select-String -Pattern "LOAD"
其中
SDK_ROOT_LOCATION
是您安裝 Android SDK 的目錄路徑,SHARED_OBJECT_FILE
是您檢查的共用物件檔案名稱,NDK_VERSION
是您安裝的 Android NDK 版本 (例如28.0.12433566
)。您檢查的每個檔案輸出內容如下所示:LOAD off 0x0000000000000000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**14 LOAD off 0x0000000000042a90 vaddr 0x0000000000043a90 paddr 0x0000000000043a90 align 2**14 LOAD off 0x0000000000046230 vaddr 0x0000000000048230 paddr 0x0000000000048230 align 2**14
檢查輸出行,確保負載區隔的值不小於
2**14
。如果任何載入區段是2**13
、2**12
或更低的值,您需要更新這些程式庫的封裝,然後重新編譯應用程式,並按照本節中的步驟重新測試。接著,在應用程式的 APK 檔案上執行
zipalign
指令列工具:Linux 或 macOS
SDK_ROOT_LOCATION/Android/sdk/build-tools/35.0.0/zipalign -v -c -P 16 4 APK_NAME.apk
Windows (PowerShell)
SDK_ROOT_LOCATION\Android\sdk\build-tools\35.0.0\zipalign.exe -v -c -P 16 4 APK_NAME.apk
其中
SDK_ROOT_LOCATION
是您安裝 Android SDK 的目錄路徑,APK_NAME
則是應用程式 APK 檔案的名稱。如果所有共用程式庫都正確對齊,輸出內容的最後一行會顯示「驗證成功」。如果驗證失敗,您需要重新對齊部分共用程式庫,因此請更新這些程式庫的封裝,然後重新編譯應用程式,並按照本節中的步驟重新測試。
建構應用程式,支援 16 KB 裝置
如果應用程式使用原生程式碼,請完成下列各節所述步驟,確保應用程式支援 16 KB 裝置:
更新共用程式庫的封裝
建議您將 AGP 升級至 8.5.1 以上版本,並使用未壓縮的共用程式庫。
AGP 8.5.1 以上版本
如果應用程式隨附未壓縮的共用程式庫,則必須在 16 KB 的 zip 對齊邊界上對齊,才能在 16 KB 裝置上運作。如要這麼做,您必須升級至 Android Gradle 外掛程式 (AGP) 8.5.1 以上版本。如要瞭解升級程序詳情,請參閱「Android Gradle 外掛程式升級小幫手」一節。
AGP 8.5 以下版本
如果無法將 AGP 升級至 8.5.1 以上版本,則可改用壓縮共用程式庫。更新 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 對齊方式正確對齊。
遊戲開發人員:如果您的遊戲是透過 Unity 遊戲引擎執行,請參閱 Unity 指南。如果遊戲是透過 Unreal 遊戲引擎執行,請參閱 Unreal 指南。如為原生遊戲引擎,請繼續參閱本指南。
如要使用 16 KB ELF 對齊方式編譯應用程式,請根據您使用的 Android NDK 版本,完成下列其中一節的步驟。
Android NDK r28 以上版本
NDK 版本 r28 以上預設會編譯 16 KB 對齊。
Android NDK r27
如要支援使用 Android NDK r27 以上版本編譯 16 KB 對齊的共用程式庫,請依下列方式更新 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
Android NDK r26 以下版本
如要使用 Android NDK r26 以下版本編譯 16 KB 對齊的共用程式庫,請按照下列方式更新 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 r22 以下版本
除了 NDK r26 以下版本所述的步驟外,如果您使用 NDK r22 以下版本,還必須設定 common-page-size=16384
。由於舊版 GNU ld 和 LLVM lld 連接器存在錯誤,因此需要設定 common-page-size=16384
。不過,我們強烈建議您將工具更新至較新版本,徹底避免這些錯誤。
如要使用 Android NDK r22 以下版本編譯與 16 KB 相容的共用程式庫,請按照下列方式更新 ndk-build
或 cmake
設定:
ndk-build
更新 Android.mk
,建構支援 16 KB 的 ELF:
LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"
CMake
更新 CMakeLists.txt
,建構支援 16 KB 的 ELF:
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")
target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,common-page-size=16384")
修正程式碼並解決執行階段問題
即使應用程式已調整為 16 KB 對齊,如果程式碼中的位置假設裝置使用特定頁面大小,應用程式仍可能發生錯誤。如要避免這種情況,請完成下列步驟:
移除參照
PAGE_SIZE
常數的任何硬式編碼依附元件,或程式碼邏輯中假設裝置網頁大小為 4 KB (4096
) 的例項。找出
mmap()
和其他需要頁面對齊引數的 API 用法,並視需要替換為替代方案。
在某些情況下,如果應用程式使用 PAGE_SIZE
做為與基礎頁面大小無關的便利值,則在 16 KB 模式下使用時,不會導致應用程式中斷。不過,如果這個值傳遞至核心時使用 mmap
,但沒有 MAP_FIXED
,核心仍會使用整個頁面,導致部分記憶體浪費。因此,在 NDK r27 以上版本中啟用 16 KB 模式時,PAGE_SIZE
會是未定義。
如果您的應用程式以這種方式使用 PAGE_SIZE
,且從未直接將這個值傳遞至核心,請建立具有新名稱的新變數,反映該變數用於其他用途,且不代表實際的記憶體頁面,而非使用 PAGE_SIZE
。
檢查 SDK 是否支援 16 KB
許多 SDK 都與 16 KB 的分頁大小相容,尤其是您自行建構或取得近期預先建構的 SDK。不過,由於部分 SDK 預先建構或 SDK 版本不相容於 16 KB,因此您應查看各個 SDK 供應商的網站,判斷要搭配 16 KB 使用哪個版本。
在 16 KB 環境中測試應用程式
建構支援 16 KB 裝置的應用程式後,請在 16 KB 環境中測試應用程式,確認應用程式是否發生任何回歸問題。如要採用這種方式,請按照下列步驟進行:
設定下列其中一種測試環境:
啟動測試裝置,然後執行下列指令,確認裝置使用的是 16 KB 環境:
adb shell getconf PAGE_SIZE
指令應傳回
16384
值。執行下列
zipalign
指令,確認應用程式是否已與 16 KB 對齊,其中 APK_NAME 是應用程式 APK 檔案的名稱:zipalign -c -P 16 -v 4 APK_NAME.apk
請徹底測試應用程式,著重於可能受到變更參照特定頁面大小的程式碼例項影響的任何區域。
使用以 16 KB 為基礎的 Android 15 系統映像檔設定 Android 模擬器
如要使用 Android 模擬器設定 16 KB 環境,請按照下列步驟操作:
以 16 KB 為基礎的 Android 15 模擬器系統映像檔,與 Android Studio Jellyfish | 2023.3.1 以上版本相容。不過,為了在處理 16 KB 裝置時獲得最佳體驗,請使用 Android Studio Ladybug | 2024.2.1 以上版本。
我們不斷推出新功能,因此建議您下載新版或最新預先發布版的 Android Studio。
請記住,系統支援同時安裝多個版本,因此您不必解除安裝現有的 Android Studio 版本。
在 Android Studio 中,按一下「Tools」(工具) >「SDK Manager」。
在「SDK Platforms」分頁中,勾選「Show Package Details」,然後展開「Android VanillaIceCream」或更高版本的部分,並根據要建立的虛擬裝置,選取下列一或多個模擬器系統映像檔:
- Google APIs Experimental 16 KB Page Size ARM 64 v8a System Image
- Google API 實驗性 16 KB 頁面大小 Intel x86_64 Atom 系統映像檔
依序按一下「Apply」>「OK」,下載所選的系統映像檔。
按照步驟設定 Android 15 的虛擬裝置,並在系統提示選取系統映像檔時,選取您下載的 16 KB 系統映像檔。如果系統未自動建議,您可以在「其他圖片」分頁中找到 16 KB 的系統映像檔。
部分模擬器版本和系統映像檔的額外步驟
如果是 Android 模擬器 35.1.5 至 35.1.20 版,以及 SDK 管理工具提供的 Android 15.0 16 KB 分頁大小系統映像檔修訂版本 4 之前,如要在 x86_64 系統上模擬 16 KB 環境,還需要完成下列步驟。在 35.1.21 以上版本,以及 Android 15.0 16 KB 分頁大小系統映像檔修訂版本 4 以上,就不需要執行這些步驟。
- 在裝置管理員中,按一下 16 KB 圖片旁邊的 3 點圖示,然後按一下「在磁碟上顯示」。
- 在這個資料夾中,找出
config.ini
檔案。 在
config.ini
檔案中新增下列程式碼,然後儲存變更:kernel.parameters = androidboot.page_shift=14
如要驗證變更,請執行下列指令,系統應會傳回
16384
:adb shell getconf PAGE_SIZE
啟動模擬器
設定完 Android 模擬器和虛擬裝置後,請從目標裝置選單或指令列啟動模擬器。
使用開發人員選項在裝置上啟用 16 KB 模式

切換「以 16KB 頁面大小啟動」開發人員選項,即可在 16 KB 模式下啟動裝置。
從 Android 15 QPR1 開始,您可以使用特定裝置上的開發人員選項,以 16 KB 模式啟動裝置,並執行裝置端測試。使用開發人員選項前,請依序前往「設定」>「系統」>「軟體更新」,並套用所有可用的更新。
這項開發人員選項適用於下列裝置:
Pixel 8 和 8 Pro (搭載 Android 15 QPR1 以上版本)
警告:由於 Android 15 QPR2 Beta 版 3 有已知問題,在 Pixel 8 裝置上安裝 Android 15 QPR2 Beta 版 3 後,如果以 16 KB 模式啟動裝置,觸控螢幕將無法運作。Pixel 8 Pro 裝置不受這個問題影響。
Pixel 8a (搭載 Android 15 QPR1 以上版本)
警告:由於 Android 15 QPR2 Beta 版 3 有已知問題,在 Pixel 8a 裝置上安裝 Android 15 QPR2 Beta 版 3,並以 16 KB 模式啟動裝置後,觸控螢幕會無法運作。
Pixel 9、Pixel 9 Pro 和 Pixel 9 Pro XL (搭載 Android 15 QPR2 Beta 2 以上版本)
Google Play 相容性規定
裝置製造商為裝置配備更多 RAM 來提升效能時,許多裝置會採用較大的分頁大小,例如 16 KB。為因應這些裝置即將推出,Google Play 將推出新的相容性規定:自 2025 年 11 月 1 日起,凡是提交至 Google Play 的新應用程式和現有應用程式更新,如果指定目標為搭載 Android 15 (API 級別 35) 以上版本的裝置,就必須支援 16 KB 的頁面大小。
如要進一步瞭解這項相容性規定,請參閱這篇網誌文章。