compileSdkVersion และ targetSdkVersion แตกต่างกันอย่างไร?


525

ฉันได้ดูเอกสารประกอบการสร้างด้วย Gradle แล้ว แต่ฉันก็ยังไม่แน่ใจว่าความแตกต่างระหว่างcompileSdkVersionและtargetSdkVersionคืออะไร

ทั้งหมดที่กล่าวมาคือ:

compileSdkVersionคุณสมบัติระบุเป้าหมายการรวบรวม

"เป้าหมายการรวบรวม" คืออะไร?

ฉันเห็นสองวิธีที่เป็นไปได้ในการตีความสิ่งนี้:

  1. compileSdkVersionเป็นรุ่นของคอมไพเลอร์ที่ใช้ในการสร้างแอปในขณะที่targetSdkVersionเป็น"ระดับ API ว่าเป้าหมายการประยุกต์ใช้" (ถ้าเป็นกรณีนี้ฉันจะถือว่าcompileSdkVersionต้องมากกว่าหรือเท่ากับtargetSdkVersion?
  2. พวกเขาหมายถึงสิ่งเดียวกัน "compilation target" == "ระดับ API ที่แอปพลิเคชันกำหนดเป้าหมาย"
  3. อื่น ๆ อีก?

ฉันเห็นว่าคำถามนี้ได้ถูกถามมาก่อน แต่คำตอบเดียวที่เสนอราคา doc ซึ่งเป็นสิ่งที่ไม่ชัดเจนสำหรับฉัน


6
รายละเอียดเพิ่มเติมเกี่ยวกับ: การเลือก compileSdkVersion, minSdkVersion และ targetSdkVersion ของคุณ
Ivan Chau

2
targetSdkVersionเป็นอุปกรณ์ของคุณทำงานอยู่ ดังนั้นหากอุปกรณ์ของคุณทำงานต่ำกว่าโอรีโออย่าตั้งเป้าหมาย 27
IgorGanapolsky

คำตอบ:


546

compileSdkVersion

compileSdkVersionเป็นรุ่นของ API ที่แอปจะรวบรวมกับ ซึ่งหมายความว่าคุณสามารถใช้คุณสมบัติ Android API ที่รวมอยู่ใน API รุ่นนั้น (เช่นเดียวกับรุ่นก่อนหน้าทั้งหมดอย่างชัดเจน) หากคุณลองใช้ฟีเจอร์ API 16 แต่ตั้งไว้compileSdkVersionที่ 15 คุณจะได้รับข้อผิดพลาดในการรวบรวม หากคุณตั้งค่าcompileSdkVersionเป็น 16 คุณยังคงสามารถเรียกใช้แอปบนอุปกรณ์ API 15 ได้ตราบใดที่เส้นทางการดำเนินการของแอพของคุณไม่ได้พยายามเรียก API ใด ๆ ที่เฉพาะเจาะจงกับ API 16

targetSdkVersion

targetSdkVersionมีอะไรจะทำอย่างไรกับแอปของคุณจะรวบรวมหรือสิ่งที่ API ที่คุณสามารถใช้ สิ่งที่targetSdkVersionควรจะบ่งบอกว่าคุณได้ทดสอบแอพของคุณแล้ว (น่าจะเป็นและรวมถึง) เวอร์ชันที่คุณระบุ นี่เป็นเหมือนการรับรองหรือออกจากระบบคุณกำลังให้ Android OS เป็นคำแนะนำเกี่ยวกับวิธีจัดการแอพของคุณในแง่ของฟีเจอร์ OS

ตัวอย่างเช่นตามเอกสารคู่มือ :

ตัวอย่างเช่นการตั้งค่านี้เป็น "11" หรือสูงกว่าทำให้ระบบสามารถใช้ชุดรูปแบบเริ่มต้นใหม่ (Holo) กับแอปของคุณเมื่อทำงานบน Android 3.0 หรือสูงกว่า ...

Android OS ณ รันไทม์อาจเปลี่ยนวิธีที่แอปของคุณมีสไตล์หรือดำเนินการอย่างอื่นในบริบทของระบบปฏิบัติการตามค่านี้ มีตัวอย่างที่รู้จักอื่น ๆ สองสามตัวอย่างที่ได้รับอิทธิพลจากค่านี้และรายการนั้นมีแนวโน้มที่จะเพิ่มขึ้นเมื่อเวลาผ่านไปเท่านั้น

แอปส่วนใหญ่จะต้องการตั้งค่าtargetSdkVersionให้เป็น API เวอร์ชั่นล่าสุด นี่จะทำให้แอปของคุณดูดีที่สุดเท่าที่จะเป็นไปได้ในอุปกรณ์ Android ล่าสุด หากคุณไม่ได้ระบุเป็นค่าเริ่มต้นไปtargetSdkVersionminSdkVersion


14
ไม่targetSdkVersionน่าจะสูงกว่าcompileSdkVersionและถูกต้องอย่างมาก ซึ่งหมายความว่าแม้ว่าคุณจะออกแบบแอปให้กำหนดเป้าหมาย API 16 แต่ก็ยังทำงานได้ดีกับ API 21 (Lollipop) และคุณควรชนtargetSdkVersionที่ 21 เพื่อระบุว่ามันโอเคสำหรับ Android OS ที่จะใช้ Lollipop-style ใดก็ได้ที่อาจ มีอยู่ในแอปของคุณ
Jeff Mixon

24
โดยพื้นฐานแล้วฉันไม่เข้าใจว่าคุณสามารถกำหนดเป้าหมาย SDK ได้สูงกว่า SDK ที่คุณรวบรวมได้อย่างไร
coder123

55
การเปลี่ยนcompileSdkVersionเป็นเวอร์ชันที่สูงกว่านั้นหมายถึงคุณต้องการใช้ API ใหม่บางตัวที่รวมอยู่ในรีลีสนั้นโดยเฉพาะ หากคุณไม่ได้วางแผนที่จะใช้คุณสมบัติเฉพาะ Lollipop ในแอปของคุณมีเหตุผล (ปกติ) ที่ตั้งไว้compileSdkVersionที่ 21 อย่างไรก็ตามแอปของคุณอาจทำงานได้ดีกับ API 21 ตามที่เป็นอยู่ดังนั้นคุณจึงเปลี่ยนtargetSdkVersionเพื่อระบุว่าแอปของคุณทำงานอย่างที่คุณคาดหวัง (เป้าหมาย) ใน API 21 แต่คุณไม่ได้ใช้ API เฉพาะสำหรับ 21 (คอมไพล์) และทำให้คุณcompileSdkVersionอยู่ที่ 15 ในตัวอย่างนี้
Jeff Mixon

19
มีการแจ้งเตือนเมื่อฉันทำเช่นนั้นใน Android studio ฉันมี "compileSdkVersion 17" และ "targetSdkVersion 22" และมันบอกฉันว่า "targetSdkVersion ไม่ควรสูงกว่า compileSdkVersion" โอ้เพิ่งจะเปลี่ยนมันและตอนนี้มันบอกฉันว่า TargetSdkVersion ไม่ใช่รุ่นล่าสุด 22 และโหมดความเข้ากันได้นั้นอาจเตะเข้ามา
Pelpotronic

18
คำตอบนี้ขัดแย้งกับสิ่งที่ Android Studio พูด targetSdkVersion สำคัญและควรน้อยกว่าหรือเท่ากับ CompileSdkVersion
ARK

152

ในฐานะคู่มือ oneliner:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

จะเป็นการดี:

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

อ่านเพิ่มเติมจากโพสต์ที่ยอดเยี่ยมนี้โดย Ian Lake


ไม่minSdkVersion ได้หมายความว่าแอปพลิเคระดับต่ำสุดอุปกรณ์ API canทำงานบน? น่าจะเป็นเพราะมันใช้ API บางอย่างที่มีอยู่minSdkVersionเป็นต้นไป?
Nitin Bansal

1
@NininBansal ใช่ ตัวอย่างเช่นถ้าminSdkVersionเป็น 15 (ซึ่งคือ ICS 4.0.3) อุปกรณ์ที่มี API 14 (ซึ่งคือ ICS 4.0) จะไม่สามารถติดตั้งแอปได้ และอย่างน้อยตอนนี้แอปจะทำงานในวันที่ 15, 16, 17, 18, 19, (20 แต่สำหรับระบบปฏิบัติการเก่า), 21, 22, 23, 24, 25, 26, 27, 28 และอื่น ๆ ในอนาคต (อาจ)
Louis Tsai

33

compileSdkVersionรุ่นที่มีเสถียรภาพควรจะใหม่ล่าสุด ควรจะทดสอบอย่างเต็มที่และน้อยกว่าหรือเท่ากับtargetSdkVersion compileSdkVersion


14
เหตุผลใดที่บอกว่า targetSdkVersion น้อยกว่า compileSdkVersion? ฉันเชื่อว่ามันเป็นคำสั่งที่ผิด
Sufian

6
ฉันเดาว่าประเด็นคือรุ่นล่าสุดสามารถใช้งานร่วมกับรุ่นหลังได้ดังนั้น API เวอร์ชันล่าสุดสามารถ "ประพฤติ" เหมือนรุ่นเก่าหากคุณตั้งค่าtargetSdkVersionให้ต่ำกว่า ดังนั้นสิ่งที่targetSdkVersionควรเป็นสิ่งที่คุณได้ทดสอบและทราบถึงพฤติกรรมที่แน่นอนและสามารถเป็น <= ความเสถียรล่าสุด
Dielson Sales

ฉันคิดว่าคำสั่งของคุณ ' compileSdkVersionควรเป็นรุ่นที่เสถียรที่สุด' ควรต่อท้ายด้วย 'ที่คุณใช้คุณสมบัติ API' มันไม่มีเหตุผลที่จะคอมไพล์กับ API 27 (API มั่นคงล่าสุดของวันนี้) หากคุณใช้ฟีเจอร์ API รุ่นต่ำกว่าเท่านั้น อย่างไรก็ตามเวอร์ชันที่เสถียรล่าสุดอาจมีคุณสมบัติบางอย่างที่ดีขึ้นโดยอัตโนมัติเช่นความปลอดภัยที่เพิ่มขึ้นหรือการรวบรวมที่มีประสิทธิภาพพร้อมความเข้ากันได้ย้อนหลัง ดังนั้นจึงแนะนำให้ใช้อย่างน้อยรุ่นที่มีเสถียรภาพล่าสุดหรือที่ผ่านมา แต่ก็ควร [ไม่] เป็น 'รุ่นล่าสุดต่อ se
Erik

27

มาถึงช่วงท้ายของเกม .. และมีคำตอบที่ดีหลายข้อด้านบน - โดยพื้นฐานแล้วนั่นcompileSdkVersionคือเวอร์ชันของ API ที่แอพรวบรวมมาในขณะที่ตัวtargetSdkVersionบ่งชี้เวอร์ชั่นที่แอปได้รับการทดสอบ

ฉันต้องการเสริมคำตอบเหล่านั้นด้วยหมายเหตุต่อไปนี้:

  1. สิ่งนั้นมีtargetSdkVersionผลต่อวิธีการขออนุญาต :

    • หากอุปกรณ์นั้นใช้ Android 6.0 (API ระดับ 23) ขึ้นไปและแอปtargetSdkVersionนั้นเป็น 23 หรือสูงกว่านั้นแอปจะขอสิทธิ์จากผู้ใช้ในขณะใช้งาน
    • หากอุปกรณ์กำลังใช้งาน Android 5.1 (API ระดับ 22) หรือต่ำกว่าหรือแอปของtargetSdkVersion22 หรือต่ำกว่าระบบจะขอให้ผู้ใช้ให้อนุญาตเมื่อผู้ใช้ติดตั้งแอพ
  2. หากcompileSdkVersionสูงกว่ารุ่นที่แอปของคุณประกาศtargetSdkVersionระบบอาจเปิดใช้งานพฤติกรรมความเข้ากันได้เพื่อให้แอพของคุณทำงานตามที่คุณคาดหวัง ( อ้างอิง )

  3. ด้วยการเปิดตัว Android ใหม่แต่ละครั้ง ...

    • targetSdkVersion ควรเพิ่มขึ้นเพื่อให้ตรงกับระดับ API ล่าสุดจากนั้นทดสอบแอปพลิเคชันของคุณอย่างละเอียดในเวอร์ชันแพลตฟอร์มที่เกี่ยวข้อง
    • compileSdkVersionในทางกลับกันไม่จำเป็นต้องเปลี่ยนเว้นแต่ว่าคุณจะเพิ่มคุณสมบัติพิเศษให้กับเวอร์ชันแพลตฟอร์มใหม่
    • ดังนั้นในขณะที่targetSdkVersionมักจะน้อยกว่า (ในตอนแรก) compileSdkVersionก็ไม่ใช่เรื่องแปลกที่จะเห็นแอปที่ได้รับการดูแล / สร้างไว้อย่างดีด้วยtargetSdkVersion > compileSdkVersion

5
Re: ประเด็นที่สองของคุณฉันไม่คิดว่าเอกสารอ้างอิงระบุอย่างชัดเจนว่า มีข้อความระบุว่า "อย่างไรก็ตามหากระดับ API ของแพลตฟอร์มสูงกว่ารุ่นที่ประกาศโดย targetSdkVersion ของแอประบบอาจเปิดใช้งานพฤติกรรมความเข้ากันได้เพื่อให้แน่ใจว่าแอปของคุณจะทำงานต่อไปตามที่คุณคาดหวัง" ฉันคิดว่านี่หมายความว่าหากระดับ API ของอุปกรณ์ที่คุณใช้งานนั้นใหม่กว่าของtargetSdkVersionคุณคุณอาจเห็นพฤติกรรมการทำงานร่วมกันได้ ฉันไม่เชื่อว่ามันเกี่ยวข้องกับสิ่งcompileSdkVersionใด
Jeremy

20

The CompileSdkVersion เป็นเวอร์ชันของแพลตฟอร์ม SDK ที่แอปของคุณทำงานด้วยเพื่อการรวบรวม ฯลฯ ในระหว่างกระบวนการพัฒนา (คุณควรใช้รุ่นล่าสุดเสมอ) ซึ่งมาพร้อมกับเวอร์ชัน API ที่คุณใช้งานอยู่

ป้อนคำอธิบายรูปภาพที่นี่

คุณจะเห็นสิ่งนี้ในbuild.gradleไฟล์ของคุณ:

ป้อนคำอธิบายรูปภาพที่นี่

targetSdkVersion:มีข้อมูลที่เรือแอปของคุณด้วยหลังจากขั้นตอนการพัฒนาที่จะเก็บ app TARGET the SPECIFIED version of the Android platformที่ช่วยให้ ขึ้นอยู่กับฟังก์ชันการทำงานของแอปของคุณมันสามารถกำหนดเป้าหมายเวอร์ชัน API ที่ต่ำกว่าปัจจุบันตัวอย่างเช่นคุณสามารถกำหนดเป้าหมาย API 18 ได้แม้ว่าเวอร์ชันปัจจุบันจะเป็น 23

จะดูดีที่ Google อย่างเป็นทางการนี้หน้า


9

ฉันเห็นความแตกต่างมากมายเกี่ยวกับcompiledSdkVersionคำตอบก่อนหน้าดังนั้นฉันจะพยายามอธิบายให้ชัดเจนที่นี่ตามหน้าเว็บของ android

เอ - สิ่งที่ Android พูดว่า

ตามhttps://developer.android.com/guide/topics/manifest/uses-sdk-element.html :

การเลือกเวอร์ชั่นแพลตฟอร์มและระดับ API เมื่อคุณพัฒนาแอปพลิเคชันของคุณคุณจะต้องเลือกเวอร์ชันแพลตฟอร์มที่คุณจะรวบรวมแอปพลิเคชัน โดยทั่วไปคุณควรรวบรวมแอปพลิเคชันของคุณกับเวอร์ชันที่ต่ำที่สุดที่เป็นไปได้ของแพลตฟอร์มที่แอปพลิเคชันของคุณสามารถรองรับได้

ดังนั้นนี่จะเป็นลำดับที่ถูกต้องตาม Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - สิ่งที่คนอื่นพูดด้วย

บางคนชอบใช้ compiledSkdVersion สูงสุดที่มีอยู่เสมอ เป็นเพราะพวกเขาจะพึ่งพาคำแนะนำโค้ดเพื่อตรวจสอบว่าพวกเขากำลังใช้คุณสมบัติ API ที่ใหม่กว่า minSdkVersion หรือไม่ดังนั้นการเปลี่ยนรหัสให้ไม่ใช้พวกเขาหรือตรวจสอบเวอร์ชัน API ของผู้ใช้ที่รันไทม์

คำแนะนำเกี่ยวกับการใช้งานที่เลิกใช้แล้วจะปรากฏในโค้ดแจ้งให้คุณทราบว่ามีบางสิ่งที่เลิกใช้ในระดับ API ที่ใหม่กว่าดังนั้นคุณสามารถตอบสนองได้ตามต้องการ

ดังนั้นนี่จะเป็นลำดับที่ถูกต้องตามที่คนอื่น ๆ :

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

จะทำอย่างไร?

ขึ้นอยู่กับคุณและแอพของคุณ

หากคุณวางแผนที่จะเสนอคุณสมบัติ API ที่แตกต่างกันตามระดับ API ของผู้ใช้ที่ใช้งานจริงให้ใช้ตัวเลือก B คุณจะได้รับคำแนะนำเกี่ยวกับคุณสมบัติที่คุณใช้ขณะทำการเข้ารหัส เพียงตรวจสอบให้แน่ใจว่าคุณไม่เคยใช้คุณสมบัติ API ที่ใหม่กว่า minSdkVersion โดยไม่ตรวจสอบระดับ API ของผู้ใช้ขณะใช้งานมิฉะนั้นแอปของคุณจะหยุดทำงาน วิธีการนี้ยังมีประโยชน์ในการเรียนรู้ว่ามีอะไรใหม่และเก่าในขณะที่เขียนโปรแกรม

หากคุณรู้อยู่แล้วว่ามีอะไรใหม่หรือเก่าและคุณกำลังพัฒนาแอปหนึ่งครั้งที่แน่นอนว่าจะไม่ได้รับการอัปเดตหรือคุณแน่ใจว่าคุณจะไม่นำเสนอคุณลักษณะ API ใหม่แบบมีเงื่อนไขให้ใช้ตัวเลือก A. คุณจะไม่ต้องกังวล ด้วยคำแนะนำที่เลิกใช้แล้วและคุณจะไม่สามารถใช้คุณสมบัติ API ที่ใหม่กว่าแม้ว่าคุณจะอยากทำก็ตาม


2
ฉันไม่คิดว่าคำแนะนำ Android จะแตกต่างกัน มีความแตกต่างระหว่าง "รวบรวมแอปพลิเคชันของคุณกับเวอร์ชันที่ต่ำที่สุดที่เป็นไปได้" และรวบรวมด้วย SDK รุ่นที่เฉพาะเจาะจง โดยทั่วไปคุณควรคอมไพล์ (compileSdkVersion) กับเวอร์ชั่นล่าสุดตั้งค่า min (minSdkVersion) ให้ต่ำที่สุดและตั้งเป้า (targetSdkVersion) ให้สูงที่สุดเท่าที่จะทำได้
Caltor

จุดดี @Caltor ฉันหวังว่าพวกเขาจะอัปเดตเอกสารนั้นเพื่อชี้แจงความแตกต่าง <uses-sdk>เอกสารเป็นอย่างมากที่คลุมเครือและไม่ชัดเจน
Jeremy

2

My 2 cents: รวบรวมกับ SDK เวอร์ชันใด ๆ แต่ระวังอย่าเรียก API ใด ๆ ที่ "รุ่น SDK ขั้นต่ำของคุณ" ไม่รองรับ นั่นหมายความว่าคุณสามารถ "รวบรวม" กับ SDK เวอร์ชันล่าสุดได้

สำหรับ "เวอร์ชันเป้าหมาย" นั้นหมายถึงสิ่งที่คุณวางแผนที่จะกำหนดเป้าหมายตั้งแต่แรกและอาจทดสอบกับ หากคุณยังไม่ได้ทำการตรวจสอบสถานะนี่เป็นวิธีที่จะแจ้งให้ Android ทราบว่าจำเป็นต้องทำการตรวจสอบเพิ่มเติมก่อนที่จะใช้งานแอพเป้าหมายของคุณว่า "Lollipop" บนแอพ "Oreo"

ดังนั้น "รุ่นเป้าหมาย" จึงไม่ต่ำกว่า "รุ่น SDK ขั้นต่ำ" ของคุณ แต่จะต้องไม่สูงกว่า "รุ่นที่รวบรวม" ของคุณ


1

ไม่ได้ตอบคำถามของคุณโดยตรงเนื่องจากมีอยู่แล้วจำนวนมากของรายละเอียดคำตอบ แต่มันของมูลค่าการกล่าวขวัญว่าไปในทางตรงกันข้ามเอกสารนดรอยด์, Android สตูดิโอจะแนะนำให้ใช้รุ่นเดียวกันสำหรับและcompileSDKVersiontargetSDKVersion

ป้อนคำอธิบายรูปภาพที่นี่


0

compiledSdkVersion ==> SDK เวอร์ชันใดที่ควรรวบรวมรหัสของคุณไปยัง bytecode (ใช้ในสภาพแวดล้อมการพัฒนา) ชี้: ใช้ SDK รุ่นสุดท้ายได้ดียิ่งขึ้น

minSdkVersion ==> รายการเหล่านี้ใช้สำหรับการติดตั้ง APK (ใช้ในสภาพแวดล้อมการผลิต) ตัวอย่างเช่น:

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

0

สรุปด่วน:

สำหรับ minSDKversion ดูรายการล่าสุดใน twitter handle: https://twitter.com/minSdkVersion

TargetSDKversion: ดูรายการล่าสุดใน twitter handle: https://twitter.com/targtSdkVersion หรือใช้ระดับ API ล่าสุดตามที่ระบุไว้ที่ devel https://developer.android.com/guide/topics/manifest/uses-sdk-element HTML

รุ่นที่คอมไพล์: ทำให้เหมือน TargetSDKversion

maxSdkVersion: คำแนะนำจาก Android คือการไม่ตั้งค่านี้เนื่องจากคุณไม่ต้องการ จำกัด แอพของคุณที่จะไม่ทำงานในอนาคตของ Android


0

การตั้งค่าแอปพลิเคชันของคุณสมบัติของโครงการ Android ใน Visual Studio 2017 (15.8.5) ประกอบด้วย:

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.