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 版本。

雖然應用程式開發人員通常會知道應用程式的 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 版本。

系統會透過 __ANDROID_API__ 巨集將應用程式的 minSdkVersion 提供給前置處理器。這個巨集由 Clang 自動定義,因此無需加入標頭即可使用。對於 NDK 建構,系統一律會定義這個巨集。

NDK 會使用 minSdkVersion 來判斷編譯程式碼時可以使用哪些功能。例如,這個屬性會決定 libc 中使用的 FORTIFY 功能,而且如果您的二進位檔與舊版 Android 不相容,這個屬性也可能會為這些二進位檔啟用改善效能或大小功能 (例如 GNU 雜湊RELR)。即使您並未使用任何新的 API,這個屬性仍會決定程式碼支援的最低 OS 版本。儘管如此,程式庫仍有可能會在舊版 OS 上載入。請勿依賴這個屬性,因為它在不同 NDK 版本、OS 版本或個別裝置上的效果可能各異。