Android için uygulama geliştirme söz konusu olduğunda, Min ve Target SDK sürümü arasındaki fark nedir? Eclipse, Min ve Target sürümleri aynı olmadığı sürece yeni bir proje oluşturmama izin vermiyor!
Android için uygulama geliştirme söz konusu olduğunda, Min ve Target SDK sürümü arasındaki fark nedir? Eclipse, Min ve Target sürümleri aynı olmadığı sürece yeni bir proje oluşturmama izin vermiyor!
Yanıtlar:
android: minSdkVersion'ın
Uygulamanın çalışması için gereken minimum API Düzeyi'ni belirten bir tam sayı. Sistemin API Düzeyi bu özellikte belirtilen değerden düşükse, Android sistemi kullanıcının uygulamayı yüklemesini engeller. Bu özelliği her zaman beyan etmelisiniz.
android: targetSdkVersion
Uygulamanın hedeflediği API Düzeyini belirten bir tam sayı.
Bu öznitelik kümesiyle, uygulama eski sürümlerde (minSdkVersion'a kadar) çalışabildiğini, ancak burada belirtilen sürümle çalışacak şekilde test edildiğini söylüyor. Bu hedef sürümün belirtilmesi, platformun hedef sürüm için gerekli olmayan uyumluluk ayarlarını devre dışı bırakmasına (ileri uyumluluğu sağlamak için aksi halde açılabilir) veya eski uygulamalarda bulunmayan daha yeni özellikleri etkinleştirmesine olanak tanır. Bu, platformun farklı sürümleri için farklı özellikler programlayabileceğiniz anlamına gelmez; yalnızca platforma hedef sürüme karşı test ettiğinizi bildirir ve platform, hedef sürümle ileri uyumluluğu sağlamak için fazladan bir çalışma yapmamalıdır.
Daha fazla bilgi için bu URL'ye bakın:
http://developer.android.com/guide/topics/manifest/uses-sdk-element.html
OP tarafından soruya gönderilen yorum (temel olarak targetSDK'nın bir uygulamanın derlenmesini etkilemediğini belirten) tamamen yanlıştır! Künt olduğum için üzgünüm.
Kısacası, minSDK'dan farklı bir targetSDK bildirmenin amacı: Minimumdan daha yüksek bir SDK'dan özellikler kullandığınız, ancak geriye dönük uyumluluğu sağladığınız anlamına gelir . Başka bir deyişle, yalnızca yakın zamanda tanıtılan, ancak uygulamanız için kritik olmayan bir özellik kullanmak istediğinizi düşünün. Daha sonra targetSDK'yı bu yeni özelliğin tanıtıldığı sürüme ve en düşük değere ayarlayarak herkesin uygulamanızı kullanmaya devam etmesini sağlayabilirsiniz.
Bir örnek vermek gerekirse, hareket algılamayı kapsamlı şekilde kullanan bir uygulama yazdığınızı varsayalım. Ancak, bir hareketle tanınabilen her komut bir düğme veya menüden de yapılabilir. Bu durumda, hareketler 'ekstra bir özelliktir', ancak gerekli değildir. Bu nedenle, hedef sdk'yi 7 (GestureDetection kütüphanesi tanıtıldığında "Eclair") ve minimumSDK'yı gerçekten eski telefonlara sahip kişilerin bile uygulamanızı kullanabilmesi için seviye 3'e ("Cupcake") ayarlarsınız. Tek yapmanız gereken, hareket kütüphanesini kullanmaya çalışmadan önce uygulamanızın çalıştığı Android sürümünü kontrol etmesini sağlamaktır. (Kuşkusuz bu tarihin bir örneğidir, çünkü neredeyse hiç kimsenin v1.5 telefonu yoktur, ancak v1 ile uyumluluğu korurken bir süre vardı.
Başka bir örnek vermek gerekirse, Gingerbread veya Honeycomb'dan bir özellik kullanmak istiyorsanız bunu kullanabilirsiniz. Bazı kişiler güncellemeleri yakında alacaktır, ancak diğerleri, özellikle eski donanımlarla birlikte, yeni bir cihaz satın alana kadar Eclair ile takılı kalabilir. Bu, bazı yeni özelliklerin kullanılmasına izin verir, ancak olası pazarınızın bir kısmını hariç tutmazsınız.
Android geliştiricisinin blogundan gerçekten iyi bir makale var bu özelliğin nasıl kullanılacağı ve özellikle de yukarıda bahsettiğim "özelliği kullanmadan önce kontrol edin" kodunun nasıl tasarlanacağı hakkında var.
OP'ye: Bunu, uzun süre önce sorunuzun sorulduğunu fark ettiğim için, gelecekte bu soruya rastlayan herkesin yararına yazdım.
TargetSdkVersion = "xx" ayarladığınızda, uygulamanızın xx API düzeyinde düzgün çalıştığını (ör. Kapsamlı ve başarılı bir şekilde test edildiğini) onaylıyorsunuz.
Xx'in üstünde API düzeyinde çalışan bir Android sürümü, xx API düzeyinde veya öncesinde kullanılabilen, ancak şu anda bu Android sürümünün daha yüksek düzeyinde kullanılmayan özellikleri desteklemek için uyumluluk kodunu otomatik olarak uygulayacaktır.
Eğer demode olmadan herhangi bir özelliği kullanıyorsanız Tersine, en ya öncesinde seviye xx, uyumluluk kodu olacak değil otomatik olarak bu kullanımları desteklemek üzere (artık bu özellikleri içerdiğini) daha yüksek API seviyelerinde OS sürümleri tarafından uygulanmalıdır. Bu durumda, kendi kod testi API seviyesi ve OS seviyesi tespit eğer artık, kodunuz alternatif özelliklere verilen API özelliği kullanmalıdır ettiğini daha yüksek biri olduğunu özel durum maddelerini olmalıdır vardır çalıştıran işletim sistemleri mevcuttur API düzeyi.
Bunu yapamazsa, normalde kodunuzdaki olayları tetikleyecek bazı arayüz özellikleri görünmeyebilir ve kullanıcının bu olayları tetiklemesi ve işlevlerine erişmesi için gereken kritik bir arayüz özelliğini ( aşağıdaki örnek).
Diğer yanıtlarda belirtildiği gibi, başlangıçta minSdkVersion'ınızdan daha yüksek API düzeylerinde tanımlanan bazı API özelliklerini kullanmak istiyorsanız ve kodunuzun bu özelliklerin yokluğunu tespit edip işleyebilmesini sağlamak için adımlar atmışsanız targetSdkVersion'ı minSdkVersion'dan daha yüksek olarak ayarlayabilirsiniz. targetSdkVersion'dan daha düşük düzeyler.
Geliştiricileri özellikle bir özelliği kullanmak için gereken minimum API düzeyini test etmeleri konusunda uyarmak için, kod minSdkVersion'dan daha sonraki bir API düzeyinde tanımlanan herhangi bir yönteme çağrı içeriyorsa derleyici bir hata (yalnızca uyarı değil) yayınlar, targetSdkVersion, bu yöntemin ilk kullanıma sunulduğu API düzeyinden büyük veya ona eşit olsa bile. Bu hatayı kaldırmak için derleyici yönergesi
@TargetApi(nn)
derleyiciye, bu yönerge kapsamındaki kodun (bir yöntem veya sınıftan önce gelecek), en azından bu API seviyesine sahip olan herhangi bir yöntemi çağırmadan önce en az nn API seviyesini test etmek için yazıldığını bildirir . Örneğin, aşağıdaki kod, minSdkVersion değeri 11'den düşük ve targetSdkVersion değeri 11 veya daha yüksek olan bir uygulamadaki koddan çağrılabilecek bir yöntemi tanımlar:
@TargetApi(11)
public void refreshActionBarIfApi11OrHigher() {
//If the API is 11 or higher, set up the actionBar and display it
if(Build.VERSION.SDK_INT >= 11) {
//ActionBar only exists at API level 11 or higher
ActionBar actionBar = getActionBar();
//This should cause onPrepareOptionsMenu() to be called.
// In versions of the API prior to 11, this only occurred when the user pressed
// the dedicated menu button, but at level 11 and above, the action bar is
// typically displayed continuously and so you will need to call this
// each time the options on your menu change.
invalidateOptionsMenu();
//Show the bar
actionBar.show();
}
}
Sen belki de o yüksek bir düzeyde test ettirdi ve olsa bile her şey, çalıştı eğer daha yüksek bir targetSdkVersion beyan etmek istiyorum değil yüksekse minSdkVersion'ın daha bir API seviyesinden herhangi özellikleri kullanarak. Bu sadece hedef seviyeden min seviyesine uyum sağlamayı amaçlayan uyumluluk koduna erişim yükünü önlemek olacaktır, çünkü böyle bir adaptasyonun gerekli olmadığını (test yoluyla) doğrulamış olacaksınız.
Bildirilen targetSdkVersion'a bağlı bir kullanıcı arayüzü özelliğine örnek olarak, bu uygulamalar API 11 ve üstü altında çalıştığında 11'den az targetSdkVersion'a sahip uygulamaların durum çubuğunda görünen üç dikey nokta menü düğmesi verilebilir. Uygulamanızın targetSdkVersion değeri 10 veya altındaysa, uygulamanızın arayüzünün özel bir menü düğmesinin varlığına bağlı olduğu varsayılır ve bu nedenle üç noktalı düğmenin önceki özel donanım ve / veya ekran sürümlerinin yerini aldığı görülür. işletim sistemi, aygıtta özel bir menü düğmesinin artık kabul edilmediği daha yüksek bir API düzeyine sahip olduğunda bu düğmenin (ör. Gingerbread'te görüldüğü gibi). Bununla birlikte, uygulamanızın targetSdkVersion değerini 11 veya daha yüksek bir değere ayarlarsanız, o düzeyde tanıtılan menü düğmesinin yerini alan özelliklerden yararlandığınız varsayılır (e. örneğin, Eylem Çubuğu) veya bir sistem menü düğmesine sahip olmanız gereğini aştığınızı; sonuç olarak, üç dikey nokta menüsü "uyumluluk düğmesi" kaybolur. Bu durumda, kullanıcı bir menü düğmesi bulamazsa, düğmeye basamaz ve bu da etkinliğinizin onCreateOptionsMenu (menü) geçersiz kılmasının asla çağrılmayacağı anlamına gelir, bu da yine uygulamanızın işlevselliğinin önemli bir kısmı kullanıcı arayüzünden yoksun bırakılabilir. Tabii ki, kullanıcının bu özelliklere erişmesi için Eylem Çubuğunu veya başka bir alternatif yöntemi uygulamadığınız sürece. t Bir menü düğmesi bulamazsa, ona basamaz ve bu da etkinliğinizin onCreateOptionsMenu (menü) geçersiz kılma işleminin asla çağrılmayacağı anlamına gelir; bu da yine uygulamanızın işlevselliğinin önemli bir bölümünün kullanıcı arayüzünden yoksun bırakıldı. Tabii ki, kullanıcının bu özelliklere erişmesi için Eylem Çubuğunu veya başka bir alternatif yöntemi uygulamadığınız sürece. t Bir menü düğmesi bulamazsa, ona basamaz ve bu da etkinliğinizin onCreateOptionsMenu (menü) geçersiz kılma işleminin asla çağrılmayacağı anlamına gelir; bu da yine uygulamanızın işlevselliğinin önemli bir bölümünün kullanıcı arayüzünden yoksun bırakıldı. Tabii ki, kullanıcının bu özelliklere erişmesi için Eylem Çubuğunu veya başka bir alternatif yöntemi uygulamadığınız sürece.
minSdkVersion ise, bir uygulamanın işletim sistemi sürümünün uygulamanızı çalıştırmak için en az bu API düzeyine sahip olması gerektiğini belirtir. Bu, Google Play uygulama mağazasında (ve muhtemelen diğer uygulama mağazalarında) uygulamanızı hangi cihazların görebildiğini ve indirebildiğini etkiler. Uygulamanızın, bu düzeyde oluşturulan OS (API veya diğer) özelliklerine dayandığını ve bu özelliklerin yokluğu ile başa çıkmak için kabul edilebilir bir yolu olmadığını belirtmenin bir yolu.
API ile ilgili olmayan bir özelliğin varlığını sağlamak için minSdkVersion kullanımına bir örnek, uygulamanızın yalnızca Dalvik yorumlayıcısının JIT özellikli bir sürümünde çalışmasını sağlamak için minSdkVersion değerini 8 olarak ayarlamak olacaktır (JIT tanıtıldığından beri) API yorum 8'deki Android yorumlayıcısına). JIT özellikli bir tercümanın performansı, bu özelliğe sahip olmayandan beş kat daha fazla olabileceğinden, uygulamanız işlemciyi yoğun bir şekilde kullanıyorsa, yeterli performans sağlamak için API seviye 8 veya üstü gerekebilir.
Bir kavram her zaman örneklerle daha iyi sunulabilir . Android geliştirici sitelerinde ve ilgili yığın akışı iş parçacıklarındaki tüm belgeleri okuduktan sonra bile, Android çerçeve kaynak koduna girip bazı deneyler yapana kadar bu kavramı anlamada sorun yaşadım. Bu kavramları tam olarak anlamama yardımcı olan iki örneği paylaşacağım.
Bir DatePickerDialog , AndroidManifest.xml dosyasının targetSDKversion ( <uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>
) öğesine eklediğiniz düzeye bağlı olarak farklı görünecektir . 10 veya daha düşük bir değer ayarlarsanız, DatePickerDialog'unuz solda gibi görünür. Öte yandan, 11 veya daha yüksek bir değer ayarlarsanız, bir DatePickerDialog aynı kodla doğru gibi görünür .
Bu örneği oluşturmak için kullandığım kod çok basit. MainActivity.java
görünüyor :
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClickButton(View v) {
DatePickerDialog d = new DatePickerDialog(this, null, 2014, 5, 4);
d.show();
}
}
Ve activity_main.xml
görünüyor:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClickButton"
android:text="Button" />
</RelativeLayout>
Bu kadar. Bu gerçekten bunu test etmek için gereken her kod.
Android çerçeve kaynak kodunu gördüğünüzde görünümdeki bu değişiklik çok net . Şöyle gider:
public DatePickerDialog(Context context,
OnDateSetListener callBack,
int year,
int monthOfYear,
int dayOfMonth,
boolean yearOptional) {
this(context, context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.HONEYCOMB
? com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert
: com.android.internal.R.style.Theme_Dialog_Alert,
callBack, year, monthOfYear, dayOfMonth, yearOptional);
}
Gördüğünüz gibi, çerçeve geçerli targetSDKversion'u alır ve farklı bir tema belirler. Bu tür kod snippet'i ( getApplicationInfo().targetSdkVersion >= SOME_VERSION
) burada ve orada Android çerçevesinde bulunabilir.
Başka bir örnek WebView sınıfı hakkındadır. WebView sınıfının genel yöntemleri ana iş parçacığında çağrılmalıdır ve eğer değilse, RuntimeException
targetSDKversion 18 veya üstünü ayarladığınızda çalışma zamanı sistemi a atar . Bu davranış , kaynak koduyla açıkça belirtilebilir . Sadece böyle yazılmıştır.
sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
Build.VERSION_CODES.JELLY_BEAN_MR2;
if (sEnforceThreadChecking) {
throw new RuntimeException(throwable);
}
Android dokümanı , " Android her yeni sürümle birlikte geliştikçe bazı davranışlar ve hatta görünümler değişebilir " diyor. Bu nedenle, davranış ve görünüm değişikliğine ve bu değişikliğin nasıl gerçekleştirildiğine baktık.
Özetle, Android dokümanı " Bu özellik (targetSdkVersion), sistemi hedef sürüme göre test ettiğiniz konusunda bilgilendirir ve sistem, uygulamanızın hedef sürümle ileri uyumluluğunu korumak için herhangi bir uyumluluk davranışını etkinleştirmemelidir . " Bu, WebView davasında gerçekten açıktır. JELLY_BEAN_MR2, WebView sınıfının genel yöntemini ana olmayan iş parçacığında çağırmak için serbest bırakılana kadar Tamam oldu. Android çerçevesinin JELLY_BEAN_MR2 cihazlarına bir RuntimeException oluşturması saçmadır. Sadece ölümcül sonuca neden olan yeni çıkarılmış davranışları ilgi alanına sokmamalıdır. Yani, yapmamız gereken şey belirli targetSDKversions'da her şeyin yolunda olup olmadığını kontrol etmektir. Daha yüksek targetSDKversion belirleyerek görünüm iyileştirme gibi avantajlar elde ederiz,
EDIT: feragat. Geçerli targetSDKversion (yukarıda gösterdiğim) temel alınarak farklı temalar ayarlayan DatePickerDialog yapıcısı daha sonraki işlemlerde aslında değiştirildi . Yine de bu örneği kullandım, çünkü mantık değiştirilmedi ve bu kod pasajı açıkça targetSDKversion kavramını gösteriyor.
Özet isteyenler için,
android:minSdkVersion
uygulamanız desteklenene kadar minimum sürümdür. Cihazınızın android'in daha düşük bir sürümü varsa, uygulama yüklenmez.
süre,
android:targetSdkVersion
uygulamanızın çalışacak şekilde tasarlandığı API düzeyidir. Bu, telefonunuzun sisteminin ileri uyumluluğu sağlamak için herhangi bir uyumluluk davranışı kullanmasına gerek yoktur, çünkü bu API'ya kadar test ettiniz.
Uygulamanız yine de verilenden daha yüksek Android sürümlerinde çalışacak, targetSdkVersion
ancak android uyumluluk davranışı devreye girecek.
Beleş -
android:maxSdkVersion
cihazınızın API sürümü daha yüksekse uygulama yüklenmez. Yani. bu, uygulamanızın yüklenmesine izin verdiğiniz maksimum API'dir.
yani. MinSDK -4, maxSDK - 8, targetSDK - 8 için Uygulamam en az 1.6 üzerinde çalışacak, ancak 2.2'de desteklenen ve 2.2 cihaza yüklendiğinde görülebilecek özellikleri de kullandım. Ayrıca, maxSDK - 8 için, bu uygulama API> 8 kullanan telefonlara yüklenmez.
Bu cevabı yazarken, Android dokümantasyonu açıklamakta çok başarılı değildi. Şimdi çok iyi açıklanmıştır. Buradan kontrol edin
Örneğin bazı derleme hataları alırsanız:
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="15" />
.
private void methodThatRequiresAPI11() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.ARGB_8888; // API Level 1
options.inSampleSize = 8; // API Level 1
options.inBitmap = bitmap; // **API Level 11**
//...
}
Derleme hatası alıyorsunuz:
Alan, API düzey 11 gerektirir (geçerli dk 10'dur): android.graphics.BitmapFactory $ Seçenekler # inBitmap
Android Geliştirme Araçları'nın (ADT) 17. sürümünden beri @TargetApi
, bunu kolayca düzeltebilecek yeni ve çok kullanışlı bir ek açıklama var. Sorunlu bildirimi kapsayan yöntemden önce ekleyin:
@TargetApi
private void methodThatRequiresAPI11() {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.ARGB_8888; // API Level 1
options.inSampleSize = 8; // API Level 1
// This will avoid exception NoSuchFieldError (or NoSuchMethodError) at runtime.
if (Integer.valueOf(android.os.Build.VERSION.SDK) >= android.os.Build.VERSION_CODES.HONEYCOMB) {
options.inBitmap = bitmap; // **API Level 11**
//...
}
}
Derleme hataları yok ve çalışacak!
EDIT: Bu API düzeyi 11'den daha düşük çalışma zamanı hatası ile sonuçlanır. 11 veya daha yüksek bir süre sorunsuz çalışacaktır. Bu nedenle, bu yöntemi sürüm denetimi tarafından korunan bir yürütme yolunda çağırdığınızdan emin olmalısınız. TargetApi sadece derlemenize izin verir, ancak kendi sorumluluğunuzdadır.
android:minSdkVersion
ve android:targetSdkVersion
her ikisi de android manifest dosyasında bildirmemiz gereken Tamsayı değeridir, ancak her ikisinin de farklı özellikleri vardır.
android:minSdkVersion:
Bu, bir android uygulamasını çalıştırmak için gereken minimum API düzeyidir. Aynı uygulamayı daha düşük API sürümüne yüklersek, ayrıştırıcı hatası görünür ve uygulama desteklenmeyen bir sorun görünür.
android:targetSdkVersion:
Hedef sdk sürümü uygulamanın Hedef API seviyesini ayarlamaktır. bu özellik manifest'te bildirilmezse, minSdk sürümü TargetSdk Sürümünüz olacaktır. Bu her zaman doğrudur "TargetSdk Sürümü olarak ilan ettiğimiz tüm API sürümlerine uygulama desteği kurulumu". Uygulamayı sınırlı hedef haline getirmek için manifest dosyamızda maxSdkVersion bildirmemiz gerekiyor ...
Tehlikeli izinler gerektiren ve targetSDK'yı 23 veya üstüne ayarlayan uygulamalar yapıyorsanız dikkatli olmalısınız. Çalışma zamanında izinleri kontrol etmezseniz, bir SecurityException alırsınız ve örneğin bir try bloğunda, örneğin açık kamerada kod kullanıyorsanız, logcat'i kontrol etmezseniz hatayı tespit etmek zor olabilir.
Hedef sdk, hedeflemek istediğiniz sürümdür ve min sdk en düşük sürümdür.