Android SDK sürümü özellikleri

Android uygulamaları, build.gradle dosyalarında bir dizi SDK sürümü özelliği ayarlayabilir. Android build.gradle belgelerinde bu özelliklerin uygulama için genel olarak ne anlama geldiği açıklanmaktadır. Bu belgede, bu özelliklerin NDK derlemelerini nasıl etkilediği açıklanmaktadır.

compileSdkVersion

Bu özelliğin NDK derlemeleri üzerinde etkisi yoktur. NDK için API kullanılabilirliği bunun yerine minSdkVersion tarafından yönetilir. Bunun nedeni, C++ sembollerinin ilk çağrıldıklarında geç çözümlenmek yerine (Java'da olduğu gibi) kitaplık yükleme sırasında hemen çözümlenmesidir. minSdkVersion'da bulunmayan sembollerin kullanılması, bu API'lerin çağrılıp çağrılmadığına bakılmaksızın, daha yeni API'nin bulunmadığı işletim sistemi sürümlerinde kitaplığın yüklenememesine neden olur.

Yeni bir uygulama için mevcut en yeni sürümü seçin. Mevcut bir uygulama için bunu uygun olduğunda en son sürüme güncelleyin.

targetSdkVersion

Java'ya benzer şekilde, uygulamanızın targetSdkVersion, yerel kodun çalışma zamanı davranışını değiştirebilir. Sistemdeki davranış değişiklikleri, mümkün olduğunda yalnızca değişikliği tanıtan işletim sistemi sürümüne eşit veya daha büyük bir targetSdkVersion değerine sahip uygulamalara uygulanır.

Yeni bir uygulama için mevcut en yeni sürümü seçin. Mevcut bir uygulama için bunu uygun olduğunda en son sürüme güncelleyin (compileSdkVersion güncellendikten sonra).

Uygulama geliştiriciler genellikle uygulamalarının targetSdkVersion'ını bilirken bu API, kullanıcılarının hangi targetSdkVersion'ı seçeceğini bilemeyen kitaplık geliştiriciler için yararlıdır.

Çalışma zamanında, android_get_application_target_sdk_version() işlevini çağırarak bir uygulama tarafından kullanılan targetSdkVersion değerini alabilirsiniz. Bu API, API seviyesi 24 ve sonraki sürümlerde kullanılabilir. Bu işlevin imzası şöyledir:

/**
 * 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);

Diğer davranış değişiklikleri, cihazın API düzeyine bağlı olabilir. Uygulamanızın çalıştığı cihazın API düzeyini android_get_device_api_level() çağrısı yaparak alabilirsiniz. Bu işlevin imzası şöyledir:

/**
 * 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();

Cihaz API düzeylerini alma, NDK kodunun platformdaki davranış değişikliklerinin dinamik olarak farkında olmasını sağlar. Küçük API düzeyleri çalışma biçimindeki değişikliklerle ilişkili olmadığından ve şu anda küçük API düzeylerine yeni NDK işlevleri ekleme planımız olmadığından, tam cihaz API düzeyini doğrudan bir NDK çağrısından almanın bir yolu yoktur.

dlopen()/dlsym() veya zayıf API referanslarını kullanarak minSdkVersion'nizin belirttiğinden daha yeni API'leri çağırabilirsiniz.

maxSdkVersion

Bu özelliğin NDK derlemeleri üzerinde etkisi yoktur.

minSdkVersion

minSdkVersion dosyanızda ayarlanan build.gradle, derleme sırasında hangi API'lerin kullanılabileceğini (bunun neden Java derlemelerinden farklı olduğunu anlamak için compileSdkVersion'a bakın) ve kodunuzun uyumlu olacağı işletim sisteminin minimum sürümünü belirler.

NDK, kodunuz derlenirken hangi özelliklerin kullanılabileceğini belirlemek için minSdkVersion kullanır. Örneğin, bu özellik libc'de hangi FORTIFY özelliklerinin kullanılacağını belirler ve ayrıca Android'in eski sürümleriyle uyumlu olmayan ikili dosyalarınız için performans veya boyut iyileştirmelerini (ör. GNU karmaları veya RELR) etkinleştirebilir. Yeni API'ler kullanmasanız bile bu özellik, kodunuzun desteklenen en düşük OS sürümünü belirler.

Yeni bir uygulama için Android Studio'nun Yeni Proje Sihirbazı'ndaki veya apilevels.com'daki kullanıcı dağılımı verilerine bakın. Potansiyel pazar payı ile bakım maliyetleri arasındaki dengeyi seçin. minSdkVersion ne kadar düşük olursa eski hataları düzeltmek ve henüz uygulanmamış özellikler için yedek davranışlar eklemek o kadar uzun sürer.

Mevcut bir uygulama için, eski API düzeyleri artık bakım maliyetlerine değmediğinde minSdkVersion değerini yükseltin veya kullanıcılarınız talep ediyorsa ve yeni bakım maliyetlerine değiyorsa düşürün. Play Console'da, uygulamanızın kullanıcı dağıtımıyla ilgili metrikler bulunur.

Uygulamanızın minSdkVersion, __ANDROID_MIN_SDK_VERSION__ makrosu (eski __ANDROID_API__ aynıdır ancak anlamı daha net olduğundan ilki tercih edilir) aracılığıyla ön işlemciye sunulur. Bu makro, Clang tarafından otomatik olarak tanımlandığından kullanmak için herhangi bir başlık eklenmesi gerekmez. NDK derlemelerinde bu makro her zaman tanımlanır.