Android Min SDK Sürümü ve Hedef SDK Sürümü


442

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!


1
Okuduğum kadarıyla, Hedef SDK sürümünün uygulamanızın nasıl derlendiğini etkilemediği anlaşılıyor. Aygıta uygulamanın üzerinde çalıştığını söylemek için uygulamanızın düzgün çalışmasını sağlamak için özel uyumluluk özelliklerinin etkinleştirilmesine gerek yoktur. Bu doğru mu? Bana öyle geliyor ki, çok fazla test yaptıktan ve yaptıktan SONRA hedef SDK sürümünüzün ne olduğunu bilmiyorsunuz. Derleyici neden kodunuza bakamıyor ve uygulamanızın kendi platformlarıyla uyumlu olduğunu anlayamıyor?
Michael Novello

5
Yukarıdaki yorumcu, birinin targetSDK özelliğini neden kullandığını yanlış anladı. Daha fazla ayrıntı için aşağıdaki cevabıma bakın.
Steve Haley

157
Kabul edilen cevap doğru değil. Lütfen Steve H. tarafından verilen cevabı okuyun
tylerl

3
@tylerl Ancak bu yanlış değil, Google Android dokümanlarına atıfta bulunuyor. Hiçbir şey eklemedim.
Vikas Patidar

3
Carl'ın cevabı bence en ayrıntılı ve kesin.
Ilya Kogan

Yanıtlar:


136

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


Genel olarak, ikisini de aynı şeye ayarlayacaksınız. Bunların farklı değerlere ayarlanması alışılmadık bir durum olacaktır.
jjb

66
Jjb'nin yorumuyla ilgili: Ben katılmıyorum. Farklı bir minSDK ve targetSDK'ya sahip olmanızın birçok iyi nedeni vardır. Daha fazla ayrıntı için cevabıma bakın.
Steve Haley

871

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.


2
TargetSDKversion'ın uygulamanın derlenmesini nasıl etkilediğini tam olarak açıklayabilir misiniz? Çünkü derleme sürümü yeniden ayarlamanız gereken başka bir yapılandırmadır. Şimdiden teşekkür ederim
hnviet

9
Steve manifest xml öznitelik android arasında ( targetSdkVersion (ki hiçbir gerçek söz vardır) arasında ve kod derlenmesi gereken karşı temsil eden project.properties dosyasında bulunan hedef özellik arasında karıştı düşünüyorum . Tekrar söyleyeceğim, xml attr targetSdkVersion gerçek bir anlamı yok !!!
AlikElzin-kilaka

3
@kilaka Yorumunuzun yarısı geçerli, ancak diğer yarısı yanlış. Birisi XML ve project.properties (Eclipse sağ bir tıklama-> özellikleri üzerinden de erişilebilir) aynı değeri kullandığını varsayıyordum, bu yüzden farklı yerlerde saklandığını işaret doğru. Ancak, Android Market kesinlikle targetSdkVersion xml özniteliğine hangi değeri koyduğunuzla ilgilenir. Örneğin, Honeycomb ve üstü uygulamalar için bir ActionBar veya uyumluluk menüsüne sahip olup olmadığınızı belirlerken bunu kullanır.
Steve Haley

2
@Nate Ben bu 'kıvrımlı kod' çalışma süresini ne kadar yavaş söyleyemedim, ama birden fazla APK bölme ve kullanmanın kod karmaşıklığı açısından daha kötü olduğunu düşünüyorum. Artık her bir dışa aktarmayı yapabilmek için önce içeri / dışarı yorum yapmayı veya kaynak denetiminizdeki daha fazla dalı birleştirmeyi unutmayın. Geçen Ekim ayında yapılan bir Android konferansında, birden fazla APK sistemini bir imtiyaz olarak tanıttıklarını, ancak çok az insanın kullandığından memnun olduklarını söylediler.
Steve Haley

2
Ancak, sürüm kontrol sistemlerinin ne için yapıldığı birden çok sürümü kullanmaktır. Geliştiricilerin bildiği şey budur (çoğu yazılım, mobil ya da değil, farklı platformlar için biraz farklı sürümler yayınlar). Bu Android "özelliği" karmaşıklığı azaltmıyor. Sadece çalışan uygulamaya itiyor ve bu iş parçacığının kanıtladığı gibi, karışıklık yaratıyor. Elbette, Google çok az insanın onu kullanmasından mutlu olacak ... Bu da "bakın, bu ihmali ilk etapta yapmakta haklıyız" demelerine yardımcı oldu. Artı, bazıları kullanmıyor çünkü henüz var olduğunu bilmiyorlar.
Nate

97

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.


TargetApi yönergesini kullanma talimatları için teşekkür ederiz.
samir105

@Carl mu o demek elimden test için gerek kalmadan benim minSdkVersion'ın (özellikle UI geliştirmeleri kazanmak için) daha yüksek herhangi bir sürümüne daima set targetSdkVersion ( kendi başına kadar sürem minSdkVersion'ın sadece API en uygun kullanımı benim kod tabanına kısıtlamak gibi) ?
Damilola Olowookere

Olowookere Emmanuel: Seni doğru anlarsam, hayır, bu demek değildir. Cevabımın belirttiği gibi, "xx düzeyinde veya öncesinde geçersiz hale gelen herhangi bir özellik kullanıyorsanız, uyumluluk kodu daha yüksek API düzeylerindeki OS sürümleri tarafından otomatik olarak uygulanmayacaktır." Kodunuz, örneğin API düzey 8'de kullanıma sunulan bir özellik kullanıyorsa ve bu özellik düzey 10'da kullanılmıyorsa, targetSdkVersion'unuzu 10'un üstündeki herhangi bir şeye yükseltirseniz, bu özelliği yeni işletim sistemi düzeyine taşıyor.
Carl

(Devam ediyor): Eğer targetSdkVersion'ınızı seviye 8'de bırakırsanız, daha yüksek seviyelerde sunulan özellikleri kullanamayacak olsanız da, seviye 8 özelliklerinin kullanımınızın çalışma sırasında çalışmasına izin vermek için uygulanan uyumluluk kodu olacaktır. daha yüksek işletim sistemi seviyeleri.
Carl

(Devam ediyor): Bunu şu şekilde düşünün: Kullanılabilir en yüksek Android seviyesi 8 olduğunda bir kod yazdığınızı ve targetSdkVersion'unuzu 8 olarak ayarladığınızı varsayalım (çünkü o zamanki en yüksek düzeydi). Şimdi, Android'in bazı yeni sürümleri çıkıyor ve kullandığınız seviye 8 özelliklerinden bazıları kullanılamıyor. Hala eski APK'nız olan kullanıcılar hata yaşamamalı, değil mi? Bu nedenle, kullanılmadığından emin olmak için, kullanıcı daha yeni bir işletim sistemi sürümü çalıştırırken çağrıldığında makul bir şey yapmak üzere eski API çağrılarınızı ayarlamak için uyumluluk kodu otomatik olarak uygulanır.
Carl

50

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 .

TargetSDKversion 10 veya daha düşük bir tarihe sahip DatePickerDialog görünümü TargetSDKversion 11 veya üstü ile DatePickerDialog görünümü

Bu örneği oluşturmak için kullandığım kod çok basit. MainActivity.javagö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.xmlgö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, RuntimeExceptiontargetSDKversion 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.


2
"Daha yüksek targetSDKversion belirleyerek görünüm iyileştirme gibi faydalar elde ediyoruz, ancak sorumluluk geliyor." Belgelerde bu çizgiden bahsetmiş olsalardı, onu aramazdım.
Haziran'da pulp_fiction

@ 김준호 İki soru var: 1.) Yukarıdaki tarih seçici örneğinde, targetSdkVersion değerini 10 veya daha düşük bir değere ayarladıysanız ve uygulamayı en son Android'i (ör. API 22) çalıştıran bir cihazda çalıştırdıysanız, tarih seçici hala eski gibi görünecektir Soldaki resimde? 2.) Kod tabanımı kısıtladığım sürece herhangi bir teste ( kendi başına ) gerek duymadan minSdkVersion'umdan daha yüksek herhangi bir sürüme targetSdkVersion ayarlayabileceğim anlamına gelir mi (ör. benim minSdkVersion kullanılabilir API'leri nasıl kullanılır?
Damilola Olowookere

@Olowookere 1) Evet. Sadece koş. 2) minSDKVersion'dan daha yüksekse targetSDKVersion'ı istediğiniz herhangi bir sürümü ayarlayabilirsiniz. Ancak yine de hedeflenen sürümde iyi çalışıp çalışmadığını test etmeniz gerekiyor. MinSDKVersion api'ye bağlı kalmanız fark etmez. DatePicker örneğini düşünün.
김준호

Min 14 sürümünü & sdk sürümünü 16 olarak hedeflediğiniz bir durumu düşünün ve yalnızca 14 veya daha düşük bir sürüm için API kullandınız. Api 1 düzeyinde tanıtılan TextView kullandığınızı varsayalım. Ne olur?
김준호

@ 김준호 Teşekkürler. Ama ikinci cevabınız için kafam karıştı. Kodum minSdkVersion'da yalnızca API kullanıyorsa ve daha yüksek SDK'yı hedefliyorsam, neden test etmem gerekiyor? DatePicker örneğini düşünerek, yüksek targetSdkVersion yalnızca DatePicker widget'ının görünümünü geliştirdi ve API'da minSdkVersion'dan daha yüksek bir kod kullanmadım çünkü hiçbir şey bozulmuyor. Ben sadece daha yüksek targetSdkVersion istiyorum çünkü widget yeni bir görünüm ve his istiyorum, ben daha yüksek API tanıtılan yeni özellikler kullanmak istiyorum değil
Damilola Olowookere

21

Ö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, targetSdkVersionancak 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


', uygulamanızın devralınan özelliklere sahip olduğu maksimum sürümdür.' : Bu yanlış. Bu var asgari uygulama özelliklerini miras kalan yerden sürümü - yani uygulamanıza tarafından kullanılan gerekli özellikleri içeren ilk sürümü.
RichieHH

İngilizce zor bir dildir. Cevapta verilen örneğimi okuyun. Orada mantıklı olduğumu varsayıyorum. :)
Darpan

Bilgiçlik yapmıyorum ve İngilizce bu gruptaki destek dilidir. Zor ya da değil "uygulamanın özellikleri desteklediği maksimum sürümü" sadece yanlış değil: tamamen 180 derece yanlış. Yedek uyumluluk modlarını / kitaplıklarını kullanmadan uygulamanızın amaçlanan tüm özelliklerini destekleyen İLK veya minimum sürümdür.
RichieHH

9

Ö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.


1
Bu konuda kafam karıştı. Uygulamanızı daha sonra sdk 10 ile bir sistemde çalıştırırsanız ne olur?
Fran Marzoa

Options.inBitmap deyimi ve uygulama iyi çalışacaktır.
NinjaCoder

1

android:minSdkVersionve android:targetSdkVersionher 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 ...


0

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.


0

Hedef sdk, hedeflemek istediğiniz sürümdür ve min sdk en düşük sürümdür.

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.