支援 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 秒)

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

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

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

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

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

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

  • 應用程式使用任何 C/C++ (原生) 程式碼。如果應用程式使用 Android NDK,則應用程式會使用原生程式碼。
  • 您的應用程式與任何第三方原生資料庫連結。
  • 應用程式是由使用裝置上的原生程式庫的第三方應用程式建構工具建構。

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

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

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

    用於啟動 APK 分析工具的 Studio「Build」選單選項

  3. 選擇要分析的 APK。

  4. 查看 lib 資料夾,這個資料夾會託管存在任何共用物件 (.so) 檔案。如果有共用物件檔案,應用程式會使用原生程式碼。如果沒有任何共用物件檔案,或沒有 lib 資料夾,應用程式就不會使用原生程式碼。

    APK 分析工具檢視畫面,顯示共用物件檔案

打造支援 16 KB 裝置的應用程式

如要支援 16 KB 裝置,使用原生程式碼的應用程式應完成以下各節所述的步驟。

更新至 AGP 8.3 以上版本

如為 16 KB 裝置,如果應用程式含有未壓縮的共用程式庫,則應用程式必須將其與 16 KB 的壓縮邊界對齊。如要這麼做,您必須升級至 Android Gradle 外掛程式 (AGP) 8.3 以上版本。如要進一步瞭解升級程序,請參閱「Android Gradle 外掛程式升級小幫手」一節。

我們建議您使用未壓縮的共用程式庫,但如果無法將 AGP 升級至 8.3 或以上版本,可以改用壓縮的共用程式庫。請更新您的 Gradle 設定,讓 Gradle 在封裝應用程式時壓縮共用程式庫,以免發生未對齊的共用程式庫發生應用程式安裝問題。

Groovy

build.gradle 檔案中,新增以下選項:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging true
      }
  }
}

Kotlin

build.gradle.kts 檔案中,新增以下選項:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging = true
      }
  }
}

使用 16 KB 對齊方式編譯應用程式

為執行 16 KB 裝置,共用程式庫的 ELF 區段必須使用 16 KB ELF 對齊方式正確對齊,應用程式才能順利執行。如要使用 16 KB ELF 對齊功能編譯應用程式,請根據您使用的 Android NDK 版本,完成以下章節所述的步驟。

Android NDK r26 以下版本

如要支援使用 Android NDK r26 以下版本編譯 16 KB 對齊的共用程式庫,您必須按照下列方式更新 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 以上版本

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,並視需要替換為替代方案。

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

使用支援 16 KB 裝置建構應用程式後,建議您在 16 KB 環境中測試應用程式,瞭解應用程式是否會發生任何迴歸問題。如要這麼做,請使用下列其中一種測試環境: