CompileSdkVersion ve targetSdkVersion arasındaki fark nedir?


525

Gradle ile inşa etmek için belgelere baktım , ancak hala compileSdkVersionve arasındaki farkın ne olduğundan emin değilim targetSdkVersion.

Tek söylediği:

compileSdkVersionMülkiyet derleme hedefini belirtir.

Peki, "derleme hedefi" nedir?

Bunu yorumlamanın iki olası yolunu görüyorum:

  1. compileSdkVersioniken, uygulama oluşturmanın kullanılan derleyici sürümüdür targetSdkVersionolan "Uygulama hedefleri olduğunu API düzey" . (Bu durumda olsaydı, ben kabul ediyorum compileSdkVersioniçin eşit veya daha büyük olmalıdır targetSdkVersion?
  2. Aynı şeyi kastediyorlar. "derleme hedefi" == "uygulamanın hedeflediği API düzeyi"
  3. Başka bir şey?

Bu sorunun daha önce sorulduğunu görüyorum , ancak bir cevap sadece dokümanı alıntılıyor, ki bu benim için belirsiz.



2
targetSdkVersion , cihazınızın çalıştığı şeydir. Cihazlarınız
Oreo'dan

Yanıtlar:


546

compileSdkVersion

compileSdkVersionUygulamanın karşı derlenmektedir API versiyonu. Bu, API'nın bu sürümünde bulunan Android API özelliklerini (ve önceki sürümlerin yanı sıra) kullanabileceğiniz anlamına gelir. API 16 özelliklerini denediğiniz compileSdkVersionhalde 15 olarak ayarladıysanız , bir derleme hatası alırsınız. compileSdkVersion16 olarak ayarlarsanız , uygulamanızın yürütme yolları API 16'ya özgü herhangi bir API'yi başlatmaya çalışmadığı sürece uygulamayı bir API 15 cihazında çalıştırabilirsiniz.

targetSdkVersion

targetSdkVersionEğer yararlanabilirler uygulamanızın nasıl derlenir ya da ne API'leri ile ilgisi yoktur. Bunun targetSdkVersion, uygulamanızı belirttiğiniz sürüme (muhtemelen de dahil olmak üzere) test ettiğinizi belirtmesi gerekir. Bu daha çok bir sertifikasyon veya Android OS'yi, işletim sistemi özellikleri açısından uygulamanızı nasıl ele alması gerektiğine dair bir ipucu olarak verdiğiniz bir oturum kapatma gibidir.

Örneğin , belgelerde belirtildiği gibi:

Örneğin, bu değerin "11" veya daha yüksek bir değere ayarlanması, sistemin Android 3.0 veya daha üstü sürümlerde çalışırken uygulamanıza yeni bir varsayılan tema (Holo) uygulamasına olanak tanır ...

Android işletim sistemi çalışma zamanında bu değere bağlı olarak uygulamanızın OS bağlamında nasıl stilize edileceğini veya başka şekilde yürütüleceğini değiştirebilir. Bu değerden etkilenen bilinen birkaç örnek daha vardır ve bu listenin sadece zaman içinde artması muhtemeldir.

Tüm pratik amaçlar için, çoğu uygulama targetSdkVersionAPI'nın en son yayınlanan sürümüne ayarlamak isteyecektir . Bu, uygulamanızın en yeni Android cihazlarda mümkün olduğunca iyi görünmesini sağlar. 'İ belirtmezseniz, targetSdkVersionvarsayılan olarak minSdkVersion.


14
Hayır, targetSdkVersionbüyük olasılıkla daha yüksek compileSdkVersionve haklı olarak daha yüksek olacaktır . Bu, örneğin API 16'yı hedeflemek için bir uygulama tasarlamış olmanıza rağmen, API 21 (Lollipop) üzerinde hala iyi çalıştığı vetargetSdkVersion ve Android işletim sisteminin herhangi bir Lollipop stilini uygulamasının uygun olduğunu belirtmek için anlamına gelir. uygulamanızda var.
Jeff Mixon

24
Temel olarak, derlediğiniz SDK'dan daha yüksek bir SDK'yı nasıl hedefleyebileceğinizi anlamıyorum.
coder123 02

55
Daha compileSdkVersionyüksek bir sürüme geçmek, yalnızca söz konusu sürümde bulunan bazı yeni API'ları kullanmak istediğiniz anlamına gelir. Uygulamanızda Lollipop'a özgü herhangi bir özellik kullanmayı planlamıyorsanız, compileSdkVersion21'e ayarlamanız için gerçekten (genellikle) bir neden yoktur . Ancak, uygulamanız muhtemelen API 21'de olduğu gibi iyi çalışır, bu nedenle targetSdkVersionuygulamanızın API 21'de beklediğiniz gibi (hedef) çalıştığını belirtmek için , ancak 21'e (derleme) özgü herhangi bir API kullanmıyorsunuz ve bu nedenle compileSdkVersionbu örnekte 15'te kalabilirsiniz.
Jeff Mixon

19
Bunu Android Studio'da yaptığımda bir uyarı bildiriliyor. "CompileSdkVersion 17" ve "targetSdkVersion 22" var ve bana "targetSdkVersion compileSdkVersion daha yüksek olmamalı" diyor. Oh, sadece değiştirdim ve şimdi bana targetSdkVersion'ın en son 22 olmadığını ve uyumluluk modunun devreye girebileceğini söylüyor.
Pelpotronic

18
Bu cevap, Android Studio'nun söyledikleriyle çelişiyor. targetSdkVersion önemlidir ve derlemeden daha az veya ona eşit olmalıdırSdkVersion
ARK

152

Bir oneliner kılavuzu olarak:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

İdeal:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)

Ian Lake'in bu harika gönderisinden daha fazlasını okuyun


minSdkVersion En düşük cihaz API'sı uygulaması cançalıştığı anlamına mı geliyor ? Muhtemelen şu andan minSdkVersionitibaren kullanılabilen belirli API'leri kullandığından ?
Nitin Bansal

1
@NitinBansal evet. Örneğin minSdkVersion15 ise (ICS 4.0.3), API 14 (ICS 4.0 olan) cihazlar uygulamayı yükleyemez. Ve en azından şimdilik, uygulama 15, 16, 17, 18, 19, (20 ancak bu eski aşınma işletim sistemi için), 21, 22, 23, 24, 25, 26, 27, 28 vb. gelecekte (muhtemelen)
Louis Tsai

33

En compileSdkVersionyeni kararlı sürüm olmalıdır. targetSdkVersionTam olarak test edilmiş ve daha az ya da eşit olması gerekmektedir compileSdkVersion.


14
TargetSdkVersion'ın compileSdkVersion'dan daha az olduğunu söylemenin özel bir nedeni var mı? Bunun yanlış bir ifade olduğuna inanıyorum
Sufian

6
Asıl nokta, son sürümün geriye doğru uyumlu olması, bu nedenle en son API sürümü, targetSdkVersiondaha düşük bir sürüme ayarlarsanız, eski sürümler gibi "davranabilir" . Bu yüzden targetSdkVersiontest ettiğiniz ve tam davranışı bildiğiniz ve <= son kararlı olabilir.
Dielson Satışları

compileSdkVersion"API özelliklerini kullandığınız" ifadesinin " en yeni kararlı sürüm olması" gerektiğini eklediğini düşünüyorum. Yalnızca daha düşük API sürümü özellikleri kullanıyorsanız API 27'ye (günümüzün en yeni kararlı API) karşı derlenmesi mantıklı değildir. Bununla birlikte, en son kararlı sürüm, otomatik olarak daha iyi hale gelen bazı özellikleri içerebilir, örneğin gelişmiş güvenlik veya geriye dönük uyumluluk ile verimli derleme. Bu nedenle, en son veya en azından son kararlı bir sürümün kullanılması tavsiye edilir, ancak kendi başına en son sürüm 'olmamalıdır' .
Erik

27

Oyunun sonlarına doğru .. ve yukarıda birkaç harika cevap var - aslında, compileSdkVersion uygulamanın derlendiği API'nın targetSdkVersionsürümü, uygulamanın test edildiği sürümü gösterir.

Bu cevapları aşağıdaki notlarla desteklemek istiyorum:

  1. Bu targetSdkVersion, izinlerin istenme şeklini etkiler :

    • Cihaz Android 6.0 (API seviye 23) veya daha yeni bir sürümünü çalıştırıyorsa ve uygulama targetSdkVersion23 veya daha yüksekse, uygulama çalışma zamanında kullanıcıdan izin ister.
    • Cihaz Android 5.1 (API seviye 22) veya daha düşük bir sürümünü çalıştırıyorsa veya uygulamanın targetSdkVersion22 veya daha düşük bir sürümü varsa, sistem, kullanıcıdan uygulamayı yüklediğinde kullanıcıdan izin vermesini ister.
  2. Eğer compileSdkVersionuygulama en tarafından ilan sürümden daha yüksektir targetSdkVersion, uyumluluk davranışları sağlayabilir sistemi uygulaması beklediğiniz gibi çalışmaya devam etmesini sağlamak için. ( ref )

  3. Her yeni Android sürümünde ...

    • targetSdkVersion en son API düzeyine uyacak şekilde artırılmalı, ardından uygulamanızı ilgili platform sürümünde iyice test etmelisiniz
    • compileSdkVersiondiğer yandan, yeni platform sürümüne özel özellikler eklemediğiniz sürece değiştirilmesine gerek yoktur
    • Sonuç olarak, targetSdkVersiongenellikle (başlangıçta) 'den daha az compileSdkVersionolsa da , bakımlı / yerleşik bir uygulamayı görmek nadir değildir.targetSdkVersion > compileSdkVersion

5
Re: ikinci noktanız, ben referanslar doktor açıkça söylüyor sanmıyorum. "Ancak, platformun API düzeyi, uygulamanızın targetSdkVersion tarafından belirtilen sürümden daha yüksekse, sistem, uygulamanızın beklediğiniz gibi çalışmaya devam etmesini sağlamak için uyumluluk davranışlarını etkinleştirebilir." Bu, üzerinde çalıştığınız cihazın API düzeyi targetSdkVersionuyumluluk davranışlarını görebileceğinizden daha yeni olduğu anlamına gelir . Onunla bir ilgisi olduğuna inanmıyorum compileSdkVersion.
Jeremy

20

The CompileSdkVersion geliştirme süreci boyunca uygulamanızın birlikte çalıştığı SDK platformunun sürümüdür (her zaman en son kullanmanız gerekir) Bu, kullandığınız API sürümüyle birlikte gönderilir

resim açıklamasını buraya girin

Bunu build.gradledosyanızda göreceksiniz :

resim açıklamasını buraya girin

targetSdkVersion:uygulamanızın, geliştirme işleminden SONRA uygulama mağazasına gönderdiği bilgileri içerir TARGET the SPECIFIED version of the Android platform. Uygulamanızın işlevselliğine bağlı olarak, geçerli sürümden daha düşük API sürümlerini hedefleyebilir. Örneğin, geçerli sürüm 23 olsa bile API 18'i hedefleyebilirsiniz.

Bu resmi Google sayfasına bir göz atın .


9

compiledSdkVersionÖnceki cevaplarda birçok fark görüyorum , bu yüzden android'in web sayfasını takip ederek burada biraz açıklama yapmaya çalışacağım.

A - Android ne diyor

Göre https://developer.android.com/guide/topics/manifest/uses-sdk-element.html :

Bir platform sürümü ve API Düzeyi seçme Uygulamanızı geliştirirken, uygulamayı derleyeceğiniz platform sürümünü seçmeniz gerekecektir. Genel olarak uygulamanızı, uygulamanızın destekleyebileceği platformun mümkün olan en düşük sürümüne göre derlemelisiniz.

Yani, Android'e göre bu doğru sipariş olurdu:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - Başkalarının söyledikleri

Bazı insanlar her zaman mevcut olan en yüksek compiledSkdVersion kullanmayı tercih eder. Bunun nedeni, minSdkVersion'dan daha yeni API özellikleri kullanıp kullanmadığını kontrol etmek için kod ipuçlarına güvenecek olmalarıdır;

Kullanımdan kaldırılan kullanımlarla ilgili ipuçları da kodda görünerek bir şeyin daha yeni API düzeylerinde kullanımdan kaldırıldığını size bildirir, böylece isterseniz buna göre tepki verebilirsiniz.

Yani, bu diğerlerine göre doğru sipariş olacaktır:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Ne yapalım?

Bu size ve uygulamanıza bağlıdır.

Çalışma zamanında kullanıcının API düzeyine göre farklı API özellikleri sunmayı planlıyorsanız, B seçeneğini kullanın. Kodlama sırasında kullandığınız özellikler hakkında ipuçları alırsınız. Çalışma zamanında kullanıcı API düzeyini kontrol etmeden minSdkVersion'dan daha yeni API özelliklerini kullanmadığınızdan emin olun, aksi takdirde uygulamanız kilitlenir. Bu yaklaşım aynı zamanda kodlama sırasında nelerin yeni ve neyin eski olduğunu öğrenme avantajına sahiptir.

Neyin yeni veya eski olduğunu zaten biliyorsanız ve kesinlikle güncellenmeyecek tek seferlik bir uygulama geliştiriyorsanız veya koşullu olarak yeni API özellikleri sunmayacağınızdan eminseniz, A seçeneğini kullanın. kullanımdan kaldırılmış ipuçlarıyla, daha yeni API özelliklerini kullanamayacak olsanız bile asla kullanamazsınız.


2
Android tavsiyesinin farklı olduğunu düşünmüyorum. "Uygulamanızı mümkün olan en düşük sürüme karşı derleyin " ile belirli bir SDK sürümüyle derlemek arasında bir fark vardır . Genellikle en son sürümle derlemeli (compileSdkVersion), min'inizi (minSdkVersion) olabildiğince düşük ayarlamalı ve hedefinizi (targetSdkVersion) test veya diğer uyumluluk sorunlarına tabi olabildiğince yükseğe ayarlamalısınız.
Caltor

İyi nokta @ Caltor. Keşke farkı açıklığa kavuşturmak için bu belgeyi güncellemelerini isterdim. <uses-sdk>Dokümantasyon son derece belirsiz ve belirsiz.
Jeremy

2

2 sentim: SDK'nın herhangi bir sürümüne karşı derleyin, ancak "minimum SDK sürümünüzün" desteklemediği API'ları çağırmamaya dikkat edin. Bu, SDK'nın en son sürümüne karşı "derleyebileceğiniz" anlamına gelir.

"Hedef sürüm" ise, ilk etapta hedeflemeyi planladığınız ve muhtemelen test ettiğiniz şeyi ifade eder. Durum tespiti yapmadıysanız, Android'i "Oreo" da "Lollipop" hedefli uygulamanızı konuşturmadan önce bazı ek kontroller gerçekleştirmesi gerektiğini bildirmenin yolu budur.

Dolayısıyla "hedef sürüm", "minimum SDK sürümünüzden" düşük değildir, ancak "derlenmiş sürümünüzden" daha yüksek olamaz.


1

Doğrudan sorularınıza cevap vermemek, zaten çok sayıda ayrıntılı cevap olduğu için, Android belgelerin aksine Android Studio'nun compileSDKVersionve için aynı sürümü kullanmanızı önerdiğini belirtmek gerekir targetSDKVersion.

resim açıklamasını buraya girin


0

compiledSdkVersion ==> senin derlemek gerekir SDK sürümü kodu ile bayt (Bu geliştirme ortamında kullanır) noktası: daha iyi SDK son sürümünü kullanacak.

minSdkVersion ==> Bu öğe APK kurulumu için kullanılır (üretim ortamında kullanır). Örneğin:

if(client-sdk-version   <   min-sdk-versoin )
    client-can-not-install-apk;
else
    client-can-install-apk;

0

Hızlı özet:

MinSDKversion için, twitter tanıtıcısındaki son girişe bakın: https://twitter.com/minSdkVersion

TargetSDKversion: Twitter'daki son girişe bakın: https://twitter.com/targtSdkVersion veya devel https://developer.android.com/guide/topics/manifest/uses-sdk-element adresinde belirtilen en son API seviyesini kullanın . html

Derlenmiş sürüm: TargetSDKversion ile aynı yapın

maxSdkVersion: Android'in tavsiyesi, uygulamanızı gelecekteki android sürümlerinde çalışmayacak şekilde sınırlamak istemediğiniz için bunu ayarlamamaktır


0

Bir Android projesinin Visual Studio 2017'deki (15.8.5) özelliklerinin Uygulama ayarları bunları birleştirmiştir:

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.