Apa perbedaan antara compileSdkVersion dan targetSdkVersion?

525

Saya telah melihat dokumentasi untuk membangun dengan Gradle, tetapi saya masih tidak yakin apa bedanya compileSdkVersiondan targetSdkVersionapa.

Yang dikatakannya adalah:

The compileSdkVersionproperti menetapkan target kompilasi.

Nah, apa "target kompilasi" itu?

Saya melihat dua cara yang mungkin untuk menafsirkan ini:

  1. compileSdkVersionadalah versi compiler yang digunakan dalam membangun aplikasi, sementara targetSdkVersionadalah "tingkat API bahwa target aplikasi" . (Jika ini masalahnya, saya anggap compileSdkVersionharus lebih besar atau sama dengan targetSdkVersion?
  2. Mereka berarti hal yang sama. "kompilasi target" == "tingkat API yang ditargetkan aplikasi"
  3. Sesuatu yang lain

Saya melihat bahwa pertanyaan ini telah ditanyakan sebelumnya, tetapi satu jawaban hanya mengutip dokter, yang tidak jelas bagi saya.

coder123
sumber
2
targetSdkVersion adalah apa yang dijalankan perangkat Anda. Jadi jika perangkat Anda berjalan lebih rendah dari Oreo, maka jangan target 27.
IgorGanapolsky

Jawaban:

546

compileSdkVersion

Ini compileSdkVersionadalah versi API yang dikompilasi oleh aplikasi. Ini berarti Anda dapat menggunakan fitur Android API yang termasuk dalam versi API tersebut (dan juga semua versi sebelumnya, tentunya). Jika Anda mencoba dan menggunakan fitur API 16 tetapi diatur compileSdkVersionke 15, Anda akan mendapatkan kesalahan kompilasi. Jika Anda menetapkan compileSdkVersionke 16 Anda masih dapat menjalankan aplikasi pada perangkat API 15 selama jalur eksekusi aplikasi Anda tidak mencoba untuk memohon API apa pun khusus untuk API 16.

targetSdkVersion

Tidak targetSdkVersionada hubungannya dengan bagaimana aplikasi Anda dikompilasi atau API apa yang dapat Anda manfaatkan. The targetSdkVersionseharusnya menunjukkan bahwa Anda telah diuji aplikasi Anda pada (mungkin sampai dengan dan termasuk) versi yang Anda tentukan. Ini lebih seperti sertifikasi atau penandatanganan Anda memberi OS Android sebagai petunjuk bagaimana seharusnya menangani aplikasi Anda dalam hal fitur OS.

Misalnya, seperti yang dinyatakan dalam dokumentasi :

Misalnya, mengatur nilai ini ke "11" atau lebih tinggi memungkinkan sistem untuk menerapkan tema default baru (Holo) ke aplikasi Anda ketika berjalan di Android 3.0 atau lebih tinggi ...

OS Android, saat runtime , dapat mengubah cara aplikasi Anda bergaya atau dieksekusi dalam konteks OS berdasarkan nilai ini. Ada beberapa contoh lain yang diketahui yang dipengaruhi oleh nilai ini dan daftar itu cenderung hanya meningkat seiring waktu.

Untuk semua tujuan praktis, sebagian besar aplikasi akan ingin diatur targetSdkVersionke versi terbaru dari API. Ini akan memastikan aplikasi Anda terlihat sebaik mungkin di perangkat Android terbaru. Jika Anda tidak menentukan targetSdkVersion, itu default ke minSdkVersion.

Jeff Mixon
sumber
14
Tidak, targetSdkVersionsangat mungkin akan lebih tinggi dari compileSdkVersiondan memang seharusnya begitu. Ini berarti bahwa meskipun Anda merancang aplikasi untuk menargetkan API 16, misalnya, aplikasi itu masih berjalan dengan baik di API 21 (Lollipop) dan Anda harus menabrak targetSdkVersionaplikasi 21 untuk menunjukkan bahwa tidak apa-apa bagi OS Android untuk menerapkan gaya Lollipop yang mungkin ada di aplikasi Anda.
Jeff Mixon
24
Pada dasarnya, saya tidak mengerti bagaimana Anda dapat menargetkan SDK lebih tinggi dari SDK yang telah Anda kompilasi.
coder123
55
Mengubah compileSdkVersionke versi yang lebih tinggi berarti Anda ingin menggunakan beberapa API baru yang hanya termasuk dalam rilis khusus itu. Jika Anda tidak berencana menggunakan fitur khusus Lollipop di aplikasi Anda, maka sebenarnya (biasanya) tidak ada alasan untuk mengatur compileSdkVersionke 21. Namun, aplikasi Anda kemungkinan akan berjalan dengan baik di API 21 apa adanya, sehingga Anda dapat mengubah targetSdkVersionuntuk menunjukkan aplikasi Anda berjalan seperti yang Anda harapkan (target) pada API 21, tetapi Anda tidak menggunakan API apa pun yang spesifik untuk 21 (kompilasi) dan dengan demikian Anda compileSdkVersiondapat tetap pada angka 15 dalam contoh ini.
Jeff Mixon
19
Peringatan dilaporkan ketika saya melakukannya di Android studio. Saya memiliki "compileSdkVersion 17" dan "targetSdkVersion 22" dan memberitahu saya "targetSdkVersion tidak boleh lebih tinggi dari compileSdkVersion". Oh, baru saja mengubahnya dan sekarang ia memberi tahu saya targetSdkVersion bukan 22 terbaru dan bahwa mode kompatibilitas mungkin masuk. Sigh.
Pelpotronic
18
Jawaban ini bertentangan dengan apa yang dikatakan Android Studio. targetSdkVersion penting dan harus kurang dari atau sama dengan compileSdkVersion
ARK
152

Sebagai pemandu wisata:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Idealnya:

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

Baca lebih lanjut dari pos hebat ini oleh Ian Lake

Jimmy Kane
sumber
Apakah ini minSdkVersion berarti aplikasi level api perangkat terendah candijalankan? Mungkin karena menggunakan API tertentu yang tersedia sejak saat itu minSdkVersion?
Nitin Bansal
1
@NitinBansal ya. Misalnya jika minSdkVersion15 (yaitu ICS 4.0.3), perangkat dengan API 14 (yang merupakan ICS 4.0) seharusnya tidak dapat menginstal aplikasi. Dan setidaknya untuk saat ini, aplikasi akan berjalan pada 15, 16, 17, 18, 19, (20 tapi itu untuk OS lama pakai), 21, 22, 23, 24, 25, 26, 27, 28, dan seterusnya di masa depan (mungkin)
Louis Tsai
33

The compileSdkVersionharus terbaru versi stabil. The targetSdkVersionharus sepenuhnya diuji dan kurang atau sama dengan compileSdkVersion.

androidwifi
sumber
14
Adakah alasan khusus untuk mengatakan bahwa targetSdkVersion kurang dari compileSdkVersion? Saya percaya ini adalah pernyataan yang salah
Sufian
6
Saya kira intinya adalah bahwa versi terakhir kompatibel ke belakang, sehingga versi API terbaru dapat "berperilaku" seperti yang lebih lama, jika Anda mengatur targetSdkVersionke yang lebih rendah. Jadi targetSdkVersionseharusnya yang Anda uji dan tahu perilaku yang tepat, dan bisa <= stabil terbaru.
Penjualan Dielson
Saya pikir pernyataan Anda ' compileSdkVersionharus menjadi versi stabil terbaru' harus diakhiri dengan 'yang Anda gunakan fitur API'. Tidak masuk akal untuk melakukan kompilasi terhadap API 27 (API stabil terbaru hari ini) jika Anda hanya menggunakan fitur versi API yang lebih rendah. Namun, versi stabil terbaru dapat mencakup beberapa fitur yang secara otomatis menjadi lebih baik, misalnya keamanan yang ditingkatkan atau kompilasi yang efisien dengan kompatibilitas ke belakang. Oleh karena itu disarankan untuk menggunakan versi stabil terbaru atau setidaknya terbaru, tetapi 'seharusnya [bukan] menjadi versi terbaru per se .
Erik
27

Terlambat ke permainan .. dan ada beberapa jawaban hebat di atas - pada dasarnya, bahwa compileSdkVersionini adalah versi API yang dikompilasi oleh aplikasi, sementara itu targetSdkVersionmenunjukkan versi yang diuji terhadap aplikasi tersebut.

Saya ingin melengkapi jawaban itu dengan catatan berikut:

  1. Itu targetSdkVersionmemengaruhi cara permintaan izin :

    • Jika perangkat menjalankan Android 6.0 (API level 23) atau lebih tinggi, dan aplikasi targetSdkVersion23 atau lebih tinggi, aplikasi meminta izin dari pengguna saat run-time.
    • Jika perangkat menjalankan Android 5.1 (API level 22) atau lebih rendah, atau aplikasi targetSdkVersionadalah 22 atau lebih rendah, sistem meminta pengguna untuk memberikan izin ketika pengguna menginstal aplikasi.
  2. Jika compileSdkVersionlebih tinggi dari versi yang dinyatakan oleh aplikasi Anda targetSdkVersion, sistem dapat mengaktifkan perilaku kompatibilitas untuk memastikan bahwa aplikasi Anda terus bekerja seperti yang Anda harapkan. ( ref )

  3. Dengan setiap rilis Android baru ...

    • targetSdkVersion harus ditambahkan agar sesuai dengan level API terbaru, kemudian uji aplikasi Anda secara menyeluruh pada versi platform yang sesuai
    • compileSdkVersion, di sisi lain, tidak perlu diubah kecuali Anda menambahkan fitur eksklusif ke versi platform baru
    • Akibatnya, walaupun targetSdkVersionsering (awalnya) kurang dari compileSdkVersion, tidak jarang melihat aplikasi yang dipelihara dengan baik dengantargetSdkVersion > compileSdkVersion
Austin D
sumber
5
Re: poin kedua Anda, saya tidak berpikir dokumen referensi secara eksplisit mengatakan itu. Dikatakan "Namun, jika level API platform lebih tinggi dari versi yang dinyatakan oleh targetSdkVersion aplikasi Anda, sistem dapat mengaktifkan perilaku kompatibilitas untuk memastikan bahwa aplikasi Anda terus bekerja seperti yang Anda harapkan." Saya pikir ini berarti jika tingkat API perangkat yang Anda jalankan lebih baru daripada Anda, targetSdkVersionAnda mungkin melihat perilaku kompatibilitas. Saya tidak percaya itu ada hubungannya dengan compileSdkVersion.
Jeremy
20

The CompileSdkVersion adalah versi platform SDK yang digunakan aplikasi Anda untuk kompilasi, dll. SELAMA proses pengembangan (Anda harus selalu menggunakan yang terbaru) Ini dikirimkan bersama dengan versi API yang Anda gunakan

masukkan deskripsi gambar di sini

Anda akan melihat ini di build.gradlefile Anda :

masukkan deskripsi gambar di sini

targetSdkVersion:berisi info yang dikirimkan oleh aplikasi Anda SETELAH proses pengembangan ke app store yang memungkinkannya TARGET the SPECIFIED version of the Android platform. Bergantung pada fungsionalitas aplikasi Anda, itu dapat menargetkan versi API yang lebih rendah dari yang sekarang. Misalnya, Anda dapat menargetkan API 18 bahkan jika versi saat ini adalah 23.

Lihatlah baik-baik di halaman Google resmi ini .

Ojonugwa Jude Ochalifu
sumber
9

Saya melihat banyak perbedaan compiledSdkVersiondalam jawaban sebelumnya, jadi saya akan mencoba sedikit menjelaskan di sini, mengikuti halaman web android.

A - Apa yang dikatakan Android

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

Memilih versi platform dan Level API Saat Anda mengembangkan aplikasi, Anda harus memilih versi platform yang akan dikompilasi dengan aplikasi tersebut. Secara umum, Anda harus mengkompilasi aplikasi Anda terhadap versi terendah dari platform yang dapat didukung aplikasi Anda.

Jadi, ini adalah urutan yang benar menurut Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - Apa yang orang lain katakan

Beberapa orang lebih suka untuk selalu menggunakan compileSkdVersion tertinggi yang tersedia. Itu karena mereka akan bergantung pada petunjuk kode untuk memeriksa apakah mereka menggunakan fitur API yang lebih baru daripada minSdkVersion, sehingga mengubah kode untuk tidak menggunakannya atau memeriksa versi API pengguna saat runtime untuk menggunakannya secara kondisional dengan fallback untuk versi API yang lebih lama.

Petunjuk tentang penggunaan yang sudah usang juga akan muncul dalam kode, memberi tahu Anda bahwa ada sesuatu yang sudah tidak digunakan lagi di tingkat API yang lebih baru, sehingga Anda dapat bereaksi sesuai dengan itu jika Anda mau.

Jadi, ini akan menjadi urutan yang benar menurut yang lain:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Apa yang harus dilakukan?

Itu tergantung pada Anda dan aplikasi Anda.

Jika Anda berencana untuk menawarkan fitur API yang berbeda sesuai dengan tingkat API pengguna saat runtime, gunakan opsi B. Anda akan mendapatkan petunjuk tentang fitur yang Anda gunakan saat pengkodean. Pastikan Anda tidak pernah menggunakan fitur API yang lebih baru daripada minSdkVersion tanpa memeriksa level API pengguna saat runtime, jika tidak aplikasi Anda akan macet. Pendekatan ini juga memiliki manfaat mempelajari apa yang baru dan apa yang lama saat coding.

Jika Anda sudah tahu apa yang baru atau lama dan Anda sedang mengembangkan aplikasi satu kali yang pasti tidak akan pernah diperbarui, atau Anda yakin tidak akan menawarkan fitur API baru secara kondisional, maka gunakan opsi A. Anda tidak akan terganggu dengan petunjuk yang sudah usang dan Anda tidak akan pernah dapat menggunakan fitur API yang lebih baru bahkan jika Anda tergoda untuk melakukannya.

CGodo
sumber
2
Saya kira saran Android tidak berbeda. Ada perbedaan antara "kompilasi aplikasi Anda dengan versi serendah mungkin" dan kompilasi dengan versi SDK tertentu. Anda biasanya harus mengkompilasi (compileSdkVersion) dengan versi terbaru, setel min Anda (minSdkVersion) serendah mungkin dan menetapkan target Anda (targetSdkVersion) setinggi mungkin tunduk pada pengujian atau masalah kompatibilitas lainnya.
Caltor
Poin bagus @ caltor. Saya berharap mereka akan memperbarui dokumen itu untuk menjelaskan perbedaannya. The <uses-sdk>dokumentasi sangat kabur dan ambigu.
Jeremy
2

2 sen saya: Kompilasi dengan versi SDK mana pun tetapi berhati-hatilah untuk tidak memanggil API apa pun yang "versi SDK minimum" Anda tidak mendukung. Itu berarti Anda "bisa" mengkompilasi versi SDK terbaru.

Adapun "versi target" itu hanya merujuk pada apa yang Anda rencanakan untuk menargetkan di tempat pertama dan mungkin telah diuji terhadap. Jika Anda belum melakukan uji tuntas, maka ini adalah cara untuk memberi tahu Android bahwa ia perlu melakukan beberapa pemeriksaan tambahan sebelum menyebarkannya, katakanlah aplikasi bertarget "Lollipop" di "Oreo".

Jadi "versi target" jelas tidak lebih rendah dari "versi SDK minimum" Anda tetapi tidak lebih tinggi dari "versi kompilasi" Anda.

pcodex
sumber
1

Tidak menjawab pertanyaan langsung Anda, karena sudah ada banyak jawaban terperinci, tetapi perlu disebutkan, bahwa bertentangan dengan dokumentasi Android, Android Studio menyarankan untuk menggunakan versi yang sama untuk compileSDKVersiondan targetSDKVersion.

masukkan deskripsi gambar di sini

sshturma
sumber
0

compiledSdkVersion ==> versi SDK mana yang harus mengkompilasi kode Andadengan bytecode (digunakan dalam lingkungan pengembangan) titik: lebih baik menggunakan versi terakhir SDK.

minSdkVersion ==> penggunaan item ini untuk pemasangan APK (digunakan di lingkungan produksi). Sebagai contoh:

if(client-sdk-version   <   min-sdk-versoin )
    client-can-not-install-apk;
else
    client-can-install-apk;
M.Namjo
sumber
0

Ringkasan cepat:

Untuk minSDKversion, lihat entri terbaru di pegangan twitter: https://twitter.com/minSdkVersion

TargetSDKversion: lihat entri terbaru di pegangan twitter: https://twitter.com/targtSdkVersion atau gunakan level API terbaru seperti yang ditunjukkan pada devel https://developer.android.com/guide/topics/manifest/uses-sdk-element. html

Versi yang dikompilasi: membuatnya sama dengan TargetSDKversion

maxSdkVersion: saran dari Android adalah untuk tidak mengatur ini karena Anda tidak ingin membatasi aplikasi Anda untuk tidak tampil di rilis android masa depan

Kush
sumber
0

Pengaturan Aplikasi properti proyek Android di Visual Studio 2017 (15.8.5) menggabungkan mereka:

masukkan deskripsi gambar di sini

Sam adalah
sumber