Android SDK 版本屬性

Android 應用程式可在其 build.gradle 檔案中設定多個 SDK 版本屬性。Android build.gradle 說明文件會解釋這些屬性對應用程式的一般含義,本文件則說明這些屬性將如何影響 NDK 建構。

compileSdkVersion

這個屬性對 NDK 建構沒有任何影響。NDK 的 API 可用性受 minSdkVersion 規範。這是因為 C++ 符號在程式庫載入時就被即時解析,而不是延遲到在第一次呼叫時才解析 (在 Java 中亦是如此)。使用 minSdkVersion 中未提供的任何符號會導致程式庫在沒有新版 API 的 OS 版本上載入失敗,無論是否有呼叫這些 API 都是如此。

如果是新的應用程式,請選擇最新版本。如果是現有應用程式,請將應用程式更新為最新版本。

targetSdkVersion

與 Java 類似,應用程式的 targetSdkVersion 可以變更原生程式碼的執行階段行為。系統中的行為變更僅會在適用情況下影響符合以下條件的應用程式:targetSdkVersion 大於或等於採用對應變更的 OS 版本。

如果是新的應用程式,請選擇最新版本。如果是現有應用程式,請先更新 compileSdkVersion,再將應用程式更新為最新版本。

雖然應用程式開發人員通常會知道應用程式的 targetSdkVersion,但對於不知道使用者會選擇哪個 targetSdkVersion 的程式庫開發人員而言,這個 API 相當實用。

在執行階段期間,您可以透過呼叫 android_get_application_target_sdk_version() 取得應用程式使用的 targetSdkVersion。這個 API 適用於 API 級別 24 及更高級別。這個函式的簽名如下:

/**
 * Returns the `targetSdkVersion` of the caller, or `__ANDROID_API_FUTURE__` if
 * there is no known target SDK version (for code not running in the context of
 * an app).
 *
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the AndroidManifest.xml `targetSdkVersion`.
 *
 * See also android_get_device_api_level().
 *
 * Available since API level 24.
 */
int android_get_application_target_sdk_version() __INTRODUCED_IN(24);

其他行為變更可能取決於裝置 API 級別。您可以透過呼叫 android_get_device_api_level() 取得執行應用程式的裝置 API 級別。這個函式的簽名如下:

/**
 * Returns the API level of the device we're actually running on, or -1 on failure.
 * The returned values correspond to the named constants in `<android/api-level.h>`,
 * and is equivalent to the Java `Build.VERSION.SDK_INT` API.
 *
 * See also android_get_application_target_sdk_version().
 */
int android_get_device_api_level();

maxSdkVersion

這個屬性對 NDK 建構沒有任何影響。

minSdkVersion

build.gradle 檔案中設定的 minSdkVersion 會決定建構時可用的 API (請參閱 compileSdkVersion,瞭解這不同於 Java 建構的原因),也會影響可與您程式碼相容的最低 OS 版本。

NDK 會使用 minSdkVersion 判斷編譯程式碼時可以使用哪些功能。比方說,這個屬性會決定 libc 中使用的 FORTIFY 功能,而且如果您的二進位檔與舊版 Android 不相容,這個屬性也可能會為這些二進位檔啟用效能或大小改善功能 (例如 GNU 雜湊RELR)。即使您並未使用任何新的 API,這個屬性仍會決定程式碼支援的最低 OS 版本。

如果是新的應用程式,請參閱 Android Studio「New Project Wizard」(新專案精靈) 中的使用者分布資料或 apilevels.com,並在潛在市占率和維護成本之間找到平衡。minSdkVersion 越低,您就需要花更多時間處理舊的錯誤,以及為尚未實作的功能新增備用行為。

如果是現有應用程式,請提升 minSdkVersion (如果舊的 API 級別不符維護成本效益) 或將其降低 (如果使用者需要且符合新的維護成本效益)。Play 管理中心提供應用程式使用者分布專屬的指標。

系統會透過 __ANDROID_MIN_SDK_VERSION__ 巨集將應用程式的 minSdkVersion 提供給前置處理器 (舊的 __ANDROID_API__ 完全相同,但前者的定義較清楚,因此建議您使用前者)。這個巨集是由 Clang 自動定義,因此無需加入標頭即可使用。對於 NDK 建構,系統一律會定義這個巨集。