Android SDK Versi vs Versi SDK Target

442

Ketika datang untuk mengembangkan aplikasi untuk Android, apa perbedaan antara versi Min dan Target SDK? Eclipse tidak akan membiarkan saya membuat proyek baru kecuali versi Min dan Target sama!

Michael Novello
sumber
1
Dari apa yang saya baca, sepertinya versi Target SDK tidak berdampak pada bagaimana aplikasi Anda dikompilasi. Hanya ada di sana untuk memberi tahu perangkat bahwa aplikasi sedang berjalan dan tidak perlu mengaktifkan fitur kompatibilitas khusus apa pun untuk membuat aplikasi Anda berfungsi dengan baik. Apakah ini benar? Bagi saya sepertinya Anda tidak akan tahu apa versi target SDK Anda sampai SETELAH Anda telah menyusun dan melakukan banyak pengujian. Mengapa kompilator tidak bisa hanya melihat kode Anda dan mencari tahu platform apa yang kompatibel dengan aplikasi Anda sendiri?
Michael Novello
5
Komentator di atas telah salah paham mengapa seseorang menggunakan fitur targetSDK. Lihat jawaban saya di bawah ini untuk lebih jelasnya.
Steve Haley
157
Jawaban yang diterima tidak benar. Silakan baca jawabannya oleh Steve H.
tylerl
3
@tylerl Tapi ini tidak salah melainkan merujuk pada dokumentasi Google Android. Saya belum menambahkan apa pun.
Vikas Patidar
3
Jawaban Carl adalah yang paling rinci dan tepat menurut saya.
Ilya Kogan

Jawaban:

136

android: minSdkVersion

Integer yang menunjuk Level API minimum yang diperlukan untuk menjalankan aplikasi. Sistem Android akan mencegah pengguna menginstal aplikasi jika Level API sistem lebih rendah dari nilai yang ditentukan dalam atribut ini. Anda harus selalu mendeklarasikan atribut ini.

android: targetSdkVersion

Integer yang menunjuk Level API yang menjadi target aplikasi.

Dengan set atribut ini, aplikasi mengatakan bahwa ia dapat berjalan pada versi yang lebih lama (turun ke minSdkVersion), tetapi secara eksplisit diuji untuk bekerja dengan versi yang ditentukan di sini. Menentukan versi target ini memungkinkan platform untuk menonaktifkan pengaturan kompatibilitas yang tidak diperlukan untuk versi target (yang dapat dihidupkan untuk mempertahankan kompatibilitas ke depan) atau mengaktifkan fitur-fitur baru yang tidak tersedia untuk aplikasi yang lebih lama. Ini tidak berarti bahwa Anda dapat memprogram fitur yang berbeda untuk versi platform yang berbeda — ini hanya menginformasikan platform yang telah Anda uji terhadap versi target dan platform tersebut tidak boleh melakukan pekerjaan ekstra untuk mempertahankan kompatibilitas ke depan dengan versi target.

Untuk informasi lebih lanjut lihat URL ini:

http://developer.android.com/guide/topics/manifest/uses-sdk-element.html

Vikas Patidar
sumber
Pada umumnya, Anda akan mengatur keduanya untuk hal yang sama. Mungkin akan menjadi situasi yang tidak biasa jika mereka menetapkan nilai yang berbeda.
jjb
66
Mengenai komentar jjb: Saya tidak setuju. Ada banyak alasan bagus mengapa Anda bisa memiliki minSDK dan targetSDK yang berbeda. Lihat jawaban saya untuk lebih jelasnya.
Steve Haley
871

Komentar yang diposting oleh OP untuk pertanyaan (pada dasarnya menyatakan bahwa targetSDK tidak mempengaruhi kompilasi aplikasi) sepenuhnya salah! Maaf sudah tumpul.

Singkatnya, ini adalah tujuan untuk mendeklarasikan targetSDK yang berbeda dari minSDK: Ini berarti Anda menggunakan fitur dari SDK tingkat yang lebih tinggi dari minimum Anda, tetapi Anda telah memastikan kompatibilitas ke belakang . Dengan kata lain, bayangkan Anda ingin menggunakan fitur yang baru saja diperkenalkan, tetapi itu tidak penting untuk aplikasi Anda. Anda kemudian akan menetapkan targetSDK ke versi di mana fitur baru ini diperkenalkan dan minimum ke sesuatu yang lebih rendah sehingga semua orang masih bisa menggunakan aplikasi Anda.

Sebagai contoh, katakanlah Anda sedang menulis aplikasi yang banyak menggunakan deteksi gerakan. Namun, setiap perintah yang dapat dikenali dengan gerakan juga dapat dilakukan dengan tombol atau dari menu. Dalam hal ini, gerakan adalah 'ekstra keren' tetapi tidak diperlukan. Karenanya, Anda akan menetapkan target SDK ke 7 ("Eclair" ketika perpustakaan GestureDetection diperkenalkan), dan SDK minimum ke level 3 ("Cupcake") sehingga bahkan orang-orang dengan ponsel yang sangat tua dapat menggunakan aplikasi Anda. Yang harus Anda lakukan adalah memastikan bahwa aplikasi Anda memeriksa versi Android yang sedang berjalan sebelum mencoba menggunakan perpustakaan gesture, untuk menghindari mencoba menggunakannya jika tidak ada. (Harus diakui ini adalah contoh tanggal karena hampir tidak ada yang masih memiliki telepon v1.5, tetapi ada waktu ketika mempertahankan kompatibilitas dengan v1.

Untuk memberikan contoh lain, Anda bisa menggunakan ini jika Anda ingin menggunakan fitur dari Gingerbread atau Honeycomb. Beberapa orang akan mendapatkan pembaruan segera, tetapi banyak orang lain, terutama dengan perangkat keras yang lebih lama, mungkin tetap terjebak dengan Eclair sampai mereka membeli perangkat baru. Ini akan memungkinkan Anda menggunakan beberapa fitur baru yang keren, tetapi tanpa mengecualikan bagian dari pasar Anda yang mungkin.

Ada artikel yang sangat bagus dari blog pengembang Android tentang cara menggunakan fitur ini, dan khususnya, cara mendesain kode "periksa fitur yang ada sebelum menggunakannya" yang saya sebutkan di atas.

Kepada OP: Saya telah menulis ini terutama untuk kepentingan siapa saja yang kebetulan menemukan pertanyaan ini di masa depan, karena saya menyadari pertanyaan Anda telah ditanyakan sejak lama.

Steve Haley
sumber
2
Bisakah Anda memberikan penjelasan yang tepat bagaimana targetSDKversion memengaruhi kompilasi aplikasi? Karena versi kompilasi sekali lagi adalah konfigurasi lain yang perlu Anda atur. Terima kasih sebelumnya
hnviet
9
Saya pikir Steve bingung antara atribut manifest xml android: targetSdkVersion (yang tidak memiliki suara nyata) dan antara properti target yang berada di file project.properties yang mewakili apa yang harus dikompilasi kode. Saya akan mengatakan lagi, attr targetSdkVersion xml tidak memiliki arti yang sebenarnya !!!
AlikElzin-kilaka
3
@kilaka Setengah komentar Anda valid, tetapi setengahnya salah. Saya berasumsi bahwa seseorang menggunakan nilai yang sama dalam XML dan project.properties (juga dapat diakses melalui klik kanan-> properti di Eclipse), jadi Anda benar untuk menunjukkan bahwa mereka disimpan di tempat yang berbeda. Namun, Android Market sangat peduli dengan nilai apa yang Anda masukkan ke dalam atribut xml targetSdkVersion. Misalnya, ini digunakan ketika menentukan apakah Anda harus memiliki ActionBar atau menu kompatibilitas untuk Honeycomb dan aplikasi di atas.
Steve Haley
2
@Nate Saya tidak bisa mengatakan seberapa lambat 'kode berbelit-belit' ini membuat runtime, tapi saya pikir memecah dan menggunakan banyak APK lebih buruk dalam hal kompleksitas kode. Sekarang Anda harus ingat untuk berkomentar masuk / keluar atau menggabungkan lebih banyak cabang di kontrol sumber Anda sebelum Anda dapat melakukan setiap ekspor. Ketika pada konferensi Android Oktober lalu, mereka mengatakan mereka memperkenalkan sistem APK berganda sebagai konsesi, tetapi senang bahwa sangat sedikit orang yang menggunakannya.
Steve Haley
2
Tetapi menangani beberapa versi adalah untuk apa sistem kontrol versi dibuat. Itulah yang sudah dikenal pengembang (sebagian besar perangkat lunak, seluler atau tidak, merilis versi yang sedikit berbeda untuk platform yang berbeda). "Fitur" Android ini tidak mengurangi kompleksitas. Ini hanya mendorongnya ke dalam aplikasi yang sedang berjalan, dan sebagaimana dibuktikan oleh utas ini, menciptakan kebingungan. Tentu, Google akan senang bahwa hanya sedikit orang yang menggunakannya ... yang membantu mereka mengatakan, "lihat, kami benar untuk membuat penghilangan ini sejak awal". Plus, beberapa tidak menggunakannya karena mereka belum tahu itu ada.
Nate
97

Ketika Anda menetapkan targetSdkVersion = "xx", Anda menyatakan bahwa aplikasi Anda berfungsi dengan baik (misalnya, telah diuji secara menyeluruh dan berhasil) pada tingkat API xx.

Versi Android yang berjalan pada tingkat API di atas xx akan menerapkan kode kompatibilitas secara otomatis untuk mendukung fitur apa pun yang mungkin Anda andalkan yang tersedia pada atau sebelum tingkat API xx, tetapi sekarang sudah usang pada tingkat yang lebih tinggi versi Android.

Sebaliknya, jika Anda menggunakan fitur apa pun yang menjadi usang pada atau sebelum level xx, kode kompatibilitas tidak akan secara otomatis diterapkan oleh versi OS pada level API yang lebih tinggi (yang tidak lagi menyertakan fitur-fitur) untuk mendukung penggunaan tersebut. Dalam situasi itu, kode Anda sendiri harus memiliki klausul kasus khusus bahwa tes tingkat API dan, jika tingkat OS terdeteksi adalah lebih tinggi yang tidak lagi telah fitur API yang diberikan, kode Anda harus menggunakan fitur alternatif yang berada tersedia di menjalankan OS ini Tingkat API.

Jika gagal melakukan hal ini, maka beberapa fitur antarmuka mungkin tidak muncul yang biasanya akan memicu peristiwa dalam kode Anda, dan Anda mungkin kehilangan fitur antarmuka penting yang harus dipicu oleh pengguna untuk mengakses peristiwa tersebut dan mengakses fungsionalitasnya (seperti pada contoh di bawah).

Seperti yang dinyatakan dalam jawaban lain, Anda dapat menetapkan targetSdkVersion lebih tinggi dari minSdkVersion jika Anda ingin menggunakan beberapa fitur API yang awalnya ditentukan pada tingkat API yang lebih tinggi daripada minSdkVersion Anda, dan telah mengambil langkah-langkah untuk memastikan bahwa kode Anda dapat mendeteksi dan menangani tidak adanya fitur-fitur tersebut di tingkat lebih rendah dari targetSdkVersion.

Untuk memperingatkan pengembang untuk secara khusus menguji tingkat API minimum yang diperlukan untuk menggunakan fitur, kompiler akan mengeluarkan kesalahan (bukan hanya peringatan) jika kode berisi panggilan ke metode apa pun yang didefinisikan pada tingkat API kemudian daripada minSdkVersion, bahkan jika targetSdkVersion lebih besar dari atau sama dengan tingkat API di mana metode itu pertama kali tersedia. Untuk menghapus kesalahan ini, arahan kompiler

@TargetApi(nn)

memberitahu kompiler bahwa kode dalam lingkup direktif itu (yang akan mendahului metode atau kelas) telah ditulis untuk menguji tingkat API setidaknya nn sebelum memanggil metode apa pun yang bergantung pada memiliki setidaknya tingkat API. . Misalnya, kode berikut mendefinisikan metode yang dapat dipanggil dari kode dalam aplikasi yang memiliki minSdkVersion kurang dari 11 dan targetSdkVersion 11 atau lebih tinggi:

@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();
    }
}

Anda mungkin juga ingin mendeklarasikan targetSdkVersion yang lebih tinggi jika Anda telah menguji pada tingkat yang lebih tinggi dan semuanya berfungsi, bahkan jika Anda tidak menggunakan fitur apa pun dari tingkat API yang lebih tinggi dari minSdkVersion Anda. Ini hanya untuk menghindari overhead dalam mengakses kode kompatibilitas yang dimaksudkan untuk beradaptasi dari level target ke level min, karena Anda telah mengkonfirmasi (melalui pengujian) bahwa tidak diperlukan adaptasi seperti itu.

Contoh fitur UI yang bergantung pada targetSdkVersion yang dideklarasikan adalah tombol menu tiga-titik vertikal yang muncul pada bilah status aplikasi yang memiliki targetSdkVersion kurang dari 11, ketika aplikasi tersebut berjalan di bawah API 11 dan lebih tinggi. Jika aplikasi Anda memiliki targetSdkVersion 10 atau lebih rendah, diasumsikan bahwa antarmuka aplikasi Anda tergantung pada keberadaan tombol menu khusus, dan tombol tiga-titik tampaknya menggantikan perangkat keras khusus sebelumnya dan / atau versi layar. tombol itu (misalnya, seperti yang terlihat di Gingerbread) ketika OS memiliki tingkat API yang lebih tinggi di mana tombol menu khusus pada perangkat tidak lagi dianggap. Namun, jika Anda menetapkan targetSdkVersion aplikasi Anda menjadi 11 atau lebih tinggi, diasumsikan bahwa Anda telah memanfaatkan fitur yang diperkenalkan pada tingkat itu yang menggantikan tombol menu khusus (e. g., Bar Tindakan), atau Anda telah mengelak dari kebutuhan untuk memiliki tombol menu sistem; akibatnya, "kompatibilitas tombol" menu tiga-titik-vertikal menghilang. Dalam hal itu, jika pengguna tidak dapat menemukan tombol menu, dia tidak dapat menekannya, dan itu, pada gilirannya, berarti bahwa aktivitas Anda pada overCreateOptionsMenu (menu) override mungkin tidak pernah dipanggil, yang, sekali lagi pada gilirannya, berarti bahwa sebagian besar fungsi aplikasi Anda dapat kehilangan antarmuka penggunanya. Kecuali, tentu saja, Anda telah mengimplementasikan Bilah Tindakan atau cara alternatif lain bagi pengguna untuk mengakses fitur-fitur ini. t menemukan tombol menu, dia tidak bisa menekannya, dan itu, pada gilirannya, berarti bahwa aktivitas Anda diCreateOptionsMenu (menu) override mungkin tidak akan pernah dipanggil, yang, sekali lagi pada gilirannya, berarti bahwa sebagian besar fungsi aplikasi Anda bisa menjadi kehilangan antarmuka penggunanya. Kecuali, tentu saja, Anda telah mengimplementasikan Bilah Tindakan atau cara alternatif lain bagi pengguna untuk mengakses fitur-fitur ini. t menemukan tombol menu, dia tidak bisa menekannya, dan itu, pada gilirannya, berarti bahwa aktivitas Anda diCreateOptionsMenu (menu) override mungkin tidak akan pernah dipanggil, yang, sekali lagi pada gilirannya, berarti bahwa sebagian besar fungsi aplikasi Anda bisa menjadi kehilangan antarmuka penggunanya. Kecuali, tentu saja, Anda telah mengimplementasikan Bilah Tindakan atau cara alternatif lain bagi pengguna untuk mengakses fitur-fitur ini.

minSdkVersion, sebaliknya, menyatakan persyaratan bahwa versi OS perangkat memiliki setidaknya tingkat API untuk menjalankan aplikasi Anda. Ini memengaruhi perangkat mana yang dapat melihat dan mengunduh aplikasi Anda ketika ada di Google Play Store (dan mungkin juga toko aplikasi lainnya). Ini adalah cara untuk menyatakan bahwa aplikasi Anda mengandalkan fitur OS (API atau lainnya) yang dibuat pada tingkat itu, dan tidak memiliki cara yang dapat diterima untuk menangani ketiadaan fitur tersebut.

Contoh menggunakan minSdkVersion untuk memastikan keberadaan fitur yang tidak terkait dengan API adalah dengan menetapkan minSdkVersion ke 8 untuk memastikan bahwa aplikasi Anda hanya akan berjalan pada versi yang didukung JIT dari juru bahasa Dalvik (sejak JIT diperkenalkan ke juru bahasa Android di API level 8). Karena kinerja untuk juru bahasa berkemampuan JIT dapat sebanyak lima kali lipat dari yang tidak memiliki fitur itu, jika aplikasi Anda menggunakan prosesor dengan berat maka Anda mungkin memerlukan API level 8 atau lebih tinggi untuk memastikan kinerja yang memadai.

Carl
sumber
Terima kasih atas instruksi untuk menggunakan arahan TargetApi.
samir105
@Carl Apakah ini berarti bahwa saya selalu dapat menetapkan targetSdkVersion ke versi yang lebih tinggi dari minSdkVersion saya (terutama untuk mendapatkan peningkatan UI itu) tanpa perlu pengujian apa pun ( per se ) selama saya membatasi basis kode untuk menggunakan hanya API yang tersedia di minSdkVersion saya ?
Damilola Olowookere
Olowookere Emmanuel: Jika saya mengerti Anda dengan benar, maka tidak, itu tidak berarti itu. Sebagaimana jawaban saya menyatakan, "jika Anda menggunakan fitur apa pun yang menjadi usang pada atau sebelum level xx, kode kompatibilitas tidak akan secara otomatis diterapkan oleh versi OS pada level API yang lebih tinggi." Jadi jika kode Anda menggunakan fitur yang menjadi tersedia pada, katakanlah, API level 8, dan fitur itu menjadi usang pada level 10, maka jika Anda menaikkan targetSdkVersion Anda ke apa pun di atas 10, tidak akan ada kode kompatibilitas yang tersedia untuk menyesuaikan penggunaan Anda dengan fitur itu ke level OS baru.
Carl
(Melanjutkan): Sedangkan, jika Anda membiarkan targetSdkVersion Anda di level 8, maka, sementara Anda tidak akan dapat menggunakan fitur yang diperkenalkan di level yang lebih tinggi, akan ada kode kompatibilitas yang diterapkan untuk memungkinkan penggunaan fitur level 8 Anda untuk bekerja ketika dijalankan pada tingkat OS yang lebih tinggi.
Carl
(Lanjutan): Pikirkan seperti ini: Misalkan Anda menulis beberapa kode ketika level Android tertinggi yang tersedia adalah 8, dan Anda menetapkan targetSdkVersion ke 8 (karena itu adalah level tertinggi pada saat itu). Sekarang, beberapa rilis Android baru keluar, dan beberapa fitur level 8 yang Anda gunakan tidak tersedia. Pengguna yang masih memiliki APK lama Anda seharusnya tidak mengalami kesalahan, bukan? Jadi, untuk memastikan tidak, kode kompatibilitas diterapkan secara otomatis untuk menyesuaikan panggilan API lama Anda untuk melakukan sesuatu yang masuk akal ketika mereka dipanggil saat pengguna menjalankan versi OS yang lebih baru.
Carl
50

Suatu konsep dapat disampaikan dengan lebih baik dengan contoh-contoh, selalu . Saya mengalami kesulitan dalam memahami konsep ini sampai saya menggali ke dalam kode sumber kerangka Android, dan melakukan beberapa percobaan, bahkan setelah membaca semua dokumen di situs pengembang Android & alur stackoverflow terkait. Saya akan membagikan dua contoh yang banyak membantu saya untuk memahami konsep-konsep ini.

Sebuah DatePickerDialog akan terlihat berbeda berdasarkan tingkat yang Anda masukkan ke dalam AndroidManifest.xml file targetSDKversion ( <uses-sdk android:targetSdkVersion="INTEGER_VALUE"/>). Jika Anda menetapkan nilai 10 atau lebih rendah, DatePickerDialog Anda akan terlihat seperti kiri. Di sisi lain, jika Anda menetapkan nilai 11 atau lebih tinggi, DatePickerDialog akan terlihat benar, dengan kode yang sama .

Tampilan DatePickerDialog dengan targetSDKversion 10 atau lebih rendah Tampilan DatePickerDialog dengan targetSDKversion 11 atau lebih tinggi

Kode yang saya gunakan untuk membuat sampel ini sangat sederhana. MainActivity.javaterlihat:

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();       
    }
}

Dan activity_main.xmlterlihat:

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


Itu dia. Benar-benar setiap kode yang saya butuhkan untuk menguji ini.

Dan perubahan tampilan ini sangat jelas ketika Anda melihat kode sumber kerangka Android . Seperti:

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);
}

Seperti yang Anda lihat, kerangka kerja mendapatkan targetSDKversion saat ini dan mengatur tema yang berbeda. Potongan kode semacam ini ( getApplicationInfo().targetSdkVersion >= SOME_VERSION) dapat ditemukan di sana-sini dalam kerangka kerja Android.

Contoh lain adalah tentang kelas WebView . Metode publik kelas Webview harus dipanggil pada utas utama, dan jika tidak, sistem runtime melempar RuntimeException, ketika Anda menetapkan targetSDKversion 18 atau lebih tinggi. Perilaku ini dapat dengan jelas disampaikan dengan kode sumbernya . Hanya ditulis seperti itu.

sEnforceThreadChecking = context.getApplicationInfo().targetSdkVersion >=
            Build.VERSION_CODES.JELLY_BEAN_MR2;

if (sEnforceThreadChecking) {
    throw new RuntimeException(throwable);
}


Doc Android mengatakan, " Ketika Android berevolusi dengan setiap versi baru, beberapa perilaku dan bahkan penampilan mungkin berubah ." Jadi, kami telah melihat perubahan perilaku dan penampilan, dan bagaimana perubahan itu dilakukan.

Singkatnya, dokumen Android mengatakan " Atribut ini (targetSdkVersion) menginformasikan sistem yang telah Anda uji terhadap versi target dan sistem tidak boleh mengaktifkan perilaku kompatibilitas apa pun untuk mempertahankan kompatibilitas ke depan aplikasi Anda dengan versi target. ". Ini sangat jelas dengan case WebView. Itu OK sampai JELLY_BEAN_MR2 dirilis untuk memanggil metode publik kelas WebView pada utas tidak-utama. Tidak masuk akal jika kerangka kerja Android melempar RuntimeException pada perangkat JELLY_BEAN_MR2. Seharusnya tidak memungkinkan perilaku yang baru diperkenalkan untuk kepentingannya, yang menyebabkan hasil yang fatal. Jadi, apa yang harus kita lakukan adalah memeriksa apakah semuanya OK pada targetSDKversi tertentu. Kami mendapatkan manfaat seperti peningkatan tampilan dengan menetapkan targetSDKversion yang lebih tinggi,

EDIT: penafian. Konstruktor DatePickerDialog yang menetapkan tema berbeda berdasarkan targetSDKversion saat ini (yang saya tunjukkan di atas) sebenarnya telah diubah di komit kemudian . Namun demikian saya menggunakan contoh itu, karena logika belum diubah, dan potongan kode tersebut dengan jelas menunjukkan konsep targetSDKversion.

김준호
sumber
2
"Kami mendapatkan manfaat seperti peningkatan penampilan dengan menetapkan targetSDKversion yang lebih tinggi, tetapi ini disertai dengan tanggung jawab." Jika mereka menyebutkan baris ini dalam dokumen, saya tidak akan mencarinya.
pulp_fiction
@ 김준호 Saya memiliki dua pertanyaan: 1.) Pada contoh datepicker di atas, jika Anda telah menetapkan targetSdkVersion ke 10 atau lebih rendah dan menjalankan aplikasi pada perangkat yang menjalankan Android terbaru (mis. API 22) apakah datepicker akan tetap ditampilkan seperti yang lama. di gambar sebelah kiri? 2.) Apakah ini berarti bahwa saya selalu dapat menetapkan targetSdkVersion ke versi apa pun yang lebih tinggi dari minSdkVersion saya (misalnya untuk mendapatkan peningkatan UI seperti datepicker renyah dari API yang lebih tinggi) tanpa perlu pengujian apa pun ( per se ) selama saya membatasi basis kode saya untuk hanya menggunakan API yang tersedia di minSdkVersion saya?
Damilola Olowookere
@Olowookere 1) Ya. Lari untuk itu. 2) Anda dapat menetapkan targetSDKVersion versi apa pun yang Anda suka jika lebih tinggi dari minSDKVersion. Tetapi Anda masih perlu mengujinya apakah berfungsi baik pada versi yang ditargetkan. Tidak masalah Anda tetap menggunakan api minSDKVersion atau tidak. Pikirkan contoh DatePicker.
김준호
Pikirkan suatu kasus Anda mengatur min min 14 & target SDK ke 16, dan Anda hanya menggunakan apis untuk 14 atau lebih rendah. Katakanlah Anda menggunakan TextView yang diperkenalkan di api level 1. Apa yang akan terjadi?
김준호
@ 김준호 Terima kasih. Tetapi untuk jawaban kedua Anda, saya bingung. Jika kode saya hanya menggunakan API di minSdkVersion dan saya menargetkan SDK yang lebih tinggi, mengapa saya perlu menguji? Memikirkan contoh DatePicker, targetSdkVersion yang tinggi hanya meningkatkan tampilan widget DatePicker dan tidak ada istirahat karena saya tidak menggunakan kode apa pun di API lebih tinggi dari minSdkVersion. Saya hanya ingin targetSdkVersion yang lebih tinggi karena saya ingin tampilan dan nuansa baru dari widget, bukan karena saya ingin menggunakan fitur baru yang diperkenalkan pada API yang lebih tinggi
Damilola Olowookere
21

Bagi mereka yang menginginkan ringkasan,

android:minSdkVersion

adalah versi minimum hingga aplikasi Anda mendukung. Jika perangkat Anda memiliki versi Android yang lebih rendah, aplikasi tidak akan menginstal.

sementara,

android:targetSdkVersion

adalah tingkat API hingga aplikasi Anda dirancang untuk berjalan. Berarti, sistem ponsel Anda tidak perlu menggunakan perilaku kompatibilitas apa pun untuk mempertahankan kompatibilitas ke depan karena Anda telah menguji hingga API ini.

Aplikasi Anda masih akan berjalan pada versi Android yang lebih tinggi dari yang diberikan targetSdkVersiontetapi perilaku kompatibilitas android akan dimulai.

Freebie -

android:maxSdkVersion

jika versi API perangkat Anda lebih tinggi, aplikasi tidak akan menginstal. Yaitu. ini adalah API maksimal yang memungkinkan Anda memasang aplikasi.

yaitu. untuk MinSDK -4, maxSDK - 8, targetSDK - 8 Aplikasi saya akan bekerja pada minimum 1,6 tetapi saya juga telah menggunakan fitur yang didukung hanya dalam 2.2 yang akan terlihat jika diinstal pada perangkat 2.2. Juga, untuk maxSDK - 8, aplikasi ini tidak akan dipasang di ponsel menggunakan API> 8.

Pada saat menulis jawaban ini, dokumentasi Android tidak melakukan pekerjaan yang baik dalam menjelaskannya. Sekarang sudah dijelaskan dengan sangat baik. Lihat di sini

Darpan
sumber
'adalah versi maksimum dari tempat aplikasi Anda memiliki fitur bawaan.' : ini salah. Ini adalah versi minimum dari mana aplikasi Anda memiliki fitur yang diwarisi - yaitu versi pertama yang mencakup fitur yang diperlukan yang digunakan oleh aplikasi Anda.
RichieHH
Bahasa Inggris adalah bahasa yang sulit. Baca contoh saya yang diberikan dalam jawaban. Saya berasumsi bahwa saya masuk akal di sana. :)
Darpan
Saya tidak suka bertele-tele dan bahasa Inggris adalah bahasa pendukung di grup ini. Tricky atau tidak mengatakan itu "versi maksimum di mana aplikasi telah mendukung fitur" tidak hanya salah: itu benar-benar 180 derajat salah. Ini adalah versi PERTAMA atau minimum yang mendukung semua fitur yang dimaksudkan dari aplikasi Anda tanpa menggunakan mode / perpustakaan kompatibilitas mundur.
RichieHH
9

Jika Anda mendapatkan beberapa kesalahan kompilasi misalnya:

<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**
        //...
    }

Anda mendapatkan kesalahan kompilasi:

Bidang memerlukan API level 11 (min saat ini adalah 10): android.graphics.BitmapFactory $ Options # inBitmap

Sejak versi 17 Alat Pengembangan Android (ADT) ada satu anotasi baru dan sangat berguna @TargetApi yang dapat memperbaikinya dengan sangat mudah. Tambahkan sebelum metode yang melampirkan deklarasi bermasalah:

@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**
            //...
      }
    }

Tidak ada kesalahan kompilasi sekarang dan itu akan berjalan!

EDIT: Ini akan menghasilkan kesalahan runtime pada tingkat API lebih rendah dari 11. Pada 11 atau lebih tinggi itu akan berjalan tanpa masalah. Jadi, Anda harus yakin bahwa Anda memanggil metode ini di jalur eksekusi yang dijaga oleh pemeriksaan versi. TargetApi hanya memungkinkan Anda untuk mengompilasinya tetapi Anda menjalankannya dengan risiko Anda sendiri.

Penunggang Angin
sumber
1
Saya bingung tentang ini. Apa yang terjadi jika Anda menjalankan aplikasi nanti di sistem dengan SDK 10?
Fran Marzoa
Ini akan mencantumkan opsi. Pernyataan Bitcoin dan aplikasi harus bekerja dengan baik.
NinjaCoder
1

android:minSdkVersiondan android:targetSdkVersionkeduanya adalah nilai Integer yang perlu kita deklarasikan dalam file manifes android tetapi keduanya memiliki properti yang berbeda.

android:minSdkVersion:Ini adalah level API minimum yang diperlukan untuk menjalankan aplikasi Android. Jika kami akan menginstal aplikasi yang sama pada versi API yang lebih rendah, kesalahan parser akan muncul, dan aplikasi yang tidak mendukung masalah akan muncul.

android:targetSdkVersion:Versi sdk target adalah untuk mengatur level aplikasi API Target. jika atribut ini tidak dinyatakan dalam manifes, versi minSdk akan menjadi Versi TargetSdk Anda. Ini selalu benar bahwa "instalasi dukungan aplikasi pada semua versi API yang lebih tinggi kami nyatakan sebagai Versi TargetSdk". Untuk membuat target aplikasi terbatas, kita perlu mendeklarasikan maxSdkVersion di file manifes kita ...

Naveen Kant Mishra
sumber
0

Jika Anda membuat aplikasi yang memerlukan izin berbahaya dan mengatur targetSDK ke 23 atau di atasnya, Anda harus berhati-hati. Jika Anda tidak memeriksa izin saat runtime, Anda akan mendapatkan SecurityException dan jika Anda menggunakan kode di dalam blok percobaan, misalnya kamera terbuka, akan sulit untuk mendeteksi kesalahan jika Anda tidak memeriksa logcat.

Thracian
sumber
0

Sdk target adalah versi yang ingin Anda targetkan, dan min sdk adalah versi minimum.

Aditya Sawant
sumber