支援 16 KB 網頁大小

以往 Android 僅支援 4 KB 的記憶體頁面大小, 最佳化系統記憶體效能 通常 Android 裝置都有這樣的功能。從 Android 15 開始,Android 開放原始碼計畫會支援 已設定頁面大小為 16 KB (16 KB) 的裝置 裝置)。如果應用程式直接使用任何 NDK 程式庫 或者間接透過 SDK 來重建應用程式, 支援這些 16 KB 裝置

隨著裝置製造商持續開發數量更多 實體記憶體 (RAM),這類裝置中有許多 16 KB ( ,以便最佳化裝置效能。正在新增 網頁大小支援 16 KB 頁面大小的裝置,可讓您的應用程式在這些裝置上執行 ,有助應用程式享有相關效能 如未重新編譯,應用程式可能無法在 16 KB 裝置上運作 。

為協助您為應用程式添加支援服務,我們提供了指南說明 如果您的應用程式受到影響,您可以瞭解如何 重新建構應用程式 (如適用),以及如何在 使用模擬器的 16 KB 環境 (包括 Android 15) Android Emulator 的系統映像檔)。

優點與效能提升

設定為 16 KB 頁面大小的裝置平均使用的記憶體平均會略高一些,但同時也能提升系統和應用程式的效能:

  • 系統處於記憶體壓力時,縮短應用程式啟動時間:平均降低 3.16%,針對部分我們測試的應用程式效能更顯著提升 (最高 30%),
  • 應用程式啟動時的耗電量降低:平均降低 4.56%
  • 相機啟動速度更快:熱啟動速度平均加快 4.48%,冷啟動速度平均加快 6.60%
  • 改善系統開機時間:平均可提高 1.5% (約 0.8 秒)

這些改善項目是以我們的初始測試結果為依據,因此實際裝置的結果可能會有所不同。我們會在持續測試的過程中,提供有關應用程式潛在收益的其他分析。

確認應用程式是否受到影響

如果您的應用程式使用任何原生程式碼,則應重建應用程式並支援 16 KB 裝置。如果您不確定應用程式是否使用原生程式碼,可以使用 APK 分析工具判斷是否有任何原生程式碼

如果應用程式只使用以 Java 程式設計語言或 Kotlin 編寫的程式碼 (包括所有程式庫或 SDK),則應用程式已支援 16 KB 裝置。不過,建議您在 16 KB 環境中測試應用程式,確認應用程式行為並未發生非預期的迴歸問題。

應用程式是否使用原生程式碼?

如果符合下列任一情況,您的應用程式就會使用原生程式碼:

  • 應用程式使用任何 C/C++ (原生) 程式碼。如果您的應用程式使用 NDK,然後您的應用程式會使用原生程式碼。
  • 您的應用程式連結的第三方原生程式庫或依附元件 以便使用。
  • 您的應用程式是由第三方應用程式製作工具所建構,該工具會在應用程式中使用原生資料庫 裝置。

使用 APK 分析工具找出原生資料庫

APK 分析工具是一項可讓您評估版本各面向的工具 APK。如要確認應用程式是否使用原生程式碼或程式庫,請按照下列步驟操作: 步驟:

  1. 開啟 Android Studio,然後依序點選「File」>「開啟」並選擇任一專案。
  2. 在選單列中,依序按一下「Build」>「Build」正在分析 APK...

    用來啟動 APK 的 Studio「Build」選單選項
揮桿分析儀

  3. 選擇要分析的 APK。

  4. 查看 lib 資料夾,其中會代管共用物件 (.so) 檔案 (如果有的話) 。如果有任何共用物件檔案,應用程式會使用原生檔案 再也不是件繁重乏味的工作如果不存在共用物件檔案,或是沒有 lib 資料夾, 系統不會使用原生程式碼

    APK 分析工具檢視畫面,顯示共用物件檔案
目前任職公司/就讀學校

建構支援 16 KB 裝置的應用程式

如要支援 16 KB 裝置,採用原生程式碼的應用程式必須完成 步驟。

更新共用資料庫的套件

建議您升級至 AGP 8.3 以上版本,並使用未壓縮方式 共用程式庫

AGP 8.3 以上版本

16 KB 裝置需要含有未壓縮共用程式庫的應用程式,才能 對齊 16 KB 壓縮邊界的邊界。為此,您必須升級 Android Gradle 外掛程式 (AGP) 8.3 以上版本。請參閱 Android Gradle 外掛程式升級小幫手有關升級程序的詳細資訊。

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 對齊,這樣才能順利執行您的應用程式。

如要使用 16 KB ELF 對齊來編譯應用程式,請完成以下任一步驟: 根據您使用的 Android NDK 版本,查看下列各節內容 使用方式。

Android NDK r26 以下版本

為了支援使用 Android NDK 編譯符合 16 KB 的共用程式庫 r26 以下版本,請更新您的 ndk-buildcmake 方法如下:

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-buildbuild.gradlebuild.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,若應用程式發生當機問題, 程式碼,假設裝置使用特定的頁面大小。為避免這種情況發生 請完成下列步驟:

  1. 移除任何參照 PAGE_SIZE 的硬式編碼依附元件 程式碼邏輯中的常數或例項,會假設裝置的頁面 大小為 4 KB (4096)。

    請改用 getpagesize()sysconf(_SC_PAGESIZE)

  2. 找出 mmap() 和其他需要頁面對齊的 API 使用情形 並視情況替換替代項目

在某些情況下,如果您的應用程式使用 PAGE_SIZE 做為便利值, 與基礎頁面大小相關聯 這並不會導致應用程式無法正常運作 在 16 KB 模式下使用時的效果更佳不過,如果這個值傳遞至核心 如果 mmap 沒有 MAP_FIXED,核心仍會使用整個網頁, 會浪費一些記憶體因此,16 KB 時未定義 PAGE_SIZE NDK r27 以上版本會啟用模式。

如果應用程式以這種方式使用 PAGE_SIZE,且從未將這個值直接傳遞至 接著使用新的變數來建立新變數,而非使用 PAGE_SIZE 名稱來表示其僅供其他用途使用,並不代表真實 記憶體頁面。

在 16 KB 環境中測試應用程式

建構可支援 16 KB 裝置的應用程式後,建議您 在 16 KB 環境中測試應用程式 避免迴歸問題如要採用這種方式,請按照下列步驟進行:

  1. 設定 Android 15 SDK

  2. 設定下列其中一種測試環境:

  3. 啟動測試裝置,然後執行下列指令,確認 瀏覽器使用的是 16 KB 環境:

    adb shell getconf PAGE_SIZE
    

    這個指令應會傳回 16384 的值。

  4. 針對任何共用程式庫,驗證共享程式庫的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
    
    1. 將指令碼儲存至檔案,例如 alignment.sh

    2. 擷取應用程式的 APK 檔案:

      unzip APK_NAME.apk -d /tmp/my_apk_out
      
    3. /tmp/my_apk_out 中,對擷取的檔案執行指令碼 目錄:

      alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
      

      這個指令碼會輸出 ALIGNEDUNALIGNED arm64-v8a 個共用程式庫。

    4. 如果有任何 arm64-v8a 共用程式庫是 UNALIGNED,您就必須 更新這些程式庫的套件,然後重新編譯 應用程式,然後重新測試。

  5. 執行下列 zipalign 指令,驗證應用程式 以 16 KB 對齊,其中 APK_NAME 是 應用程式的 APK 檔案:

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  6. 對應用程式進行全面測試,並著重說明可能受到影響的領域 變更參照特定頁面大小的程式碼例項

使用基於 16 KB 的 Android 15 系統映像檔設定 Android Emulator

如要使用 Android Emulator 設定 16 KB 環境,請按照下列步驟操作: 步驟:

  1. 以 16 KB 為基礎的 Android 15 模擬器系統映像檔可相容於 Android Studio Jellyfish |2023.3.1 以上版本。不過,為了 立即下載最新版本 Android Studio 預先發布版

    請記住,您可以保留現有的 Android Studio 版本 安裝,方便您同時安裝多個版本

  2. 在 Android Studio 中,按一下「Tools」(工具) >「SDK Manager」。

  3. 在「SDK Platforms」分頁中,勾選「Show Package Details」,然後展開 「Android VanillaIceCream 預覽」部分,並選取下列其中一項,或同時選取 下方的模擬器系統映像檔 想要建立:

    • Google API 實驗性 16K 頁面大小 ARM 64 v8a 系統映像檔
    • Google API 實驗性 16k 頁面大小 Intel x86_64 Atom 系統映像檔
    ,瞭解如何調查及移除這項存取權。

    使用 Android 中的 SDK Manager,下載 16 KB 模擬器系統映像檔
錄音室

  4. 按一下「套用 >」確定:下載您選取的系統映像檔。

  5. 按照步驟設定 Android 15 虛擬裝置,以及 系統會提示您選取系統映像檔,請選取 16 KB 系統映像檔 下載。如果系統未自動建議,你可以在這裡找到 「Other Images」分頁中的系統映像檔為 16 KB

    在其他映像檔中尋找 16 KB 模擬器映像檔
Tab 鍵

,瞭解如何調查及移除這項存取權。
  1. 在裝置管理工具中,按一下 16 KB 圖片旁的 3 點圖示,然後按一下 在磁碟上顯示
  2. 在這個資料夾中找出 config.ini 檔案。
  3. config.ini 檔案中新增下列程式碼,然後儲存變更:

    kernel.parameters = androidboot.page_shift=14
    
  4. 如要驗證變更,請執行下列指令,瀏覽器應會傳回 16384:

    adb shell getconf PAGE_SIZE