อะไรคือความแตกต่างระหว่างเวอร์ชั่น SDK ต่ำสุด / เวอร์ชั่น SDK เป้าหมายกับเวอร์ชั่น SDK คอมไพล์?


214

อะไรคือความแตกต่างระหว่าง "min sdk version / target sdk version" และ "compile sdk version"? ฉันรู้ว่า min และเป้าหมาย sdk หมายถึงอะไร แต่อะไรที่รวบรวม sdk version หมายความว่าอย่างไร

ใน Eclipse ฉันมี min / max และ sdk เป้าหมาย แต่ใน android studio มีการตั้งค่าทั้งสามนี้


ฉันกำลังทำงานบนแอปที่ผมใช้ targetsdkversion เป็น 12 และรูปแบบของฉันทุกคนที่ทำงานมากผิดปกติแล้วฉันเปลี่ยนแปลงมันกลับไปที่ 23 และการทำงานเช่นเสน่ห์ดังนั้นฉันคิดว่ารุ่น targetsdk ต้องเสมอเช่นเดียวกับรุ่นเรียบเรียง
Shahid โฉบ

คำตอบ:


232

รุ่นmin sdkเป็นรุ่นแรกสุดของ SDK Android ที่แอปพลิเคชันของคุณสามารถทำงานได้ โดยปกตินี่เป็นเพราะปัญหาเกี่ยวกับ API ก่อนหน้าการขาดฟังก์ชันการทำงานหรือปัญหาพฤติกรรมอื่น ๆ

รุ่น SDK เป้าหมายเป็นรุ่นใบสมัครของคุณได้รับการกำหนดเป้าหมายในการทำงานใน โดยหลักการแล้วนี่เป็นเพราะเงื่อนไขการวิ่งที่เหมาะสมที่สุด หากคุณต้อง "ทำให้แอปของคุณเป็นเวอร์ชัน 19" นี่คือที่ที่จะระบุ อาจทำงานในรุ่นก่อนหน้าหรือรุ่นใหม่กว่า แต่นี่คือสิ่งที่คุณตั้งใจจะทำ ส่วนใหญ่เป็นการระบุว่าแอปพลิเคชันปัจจุบันของคุณมีไว้เพื่อใช้ในตลาดอย่างไร

รุ่นรวบรวม SDKเป็นรุ่นของหุ่นยนต์ IDE ของคุณ (หรือวิธีการอื่น ๆ ของการรวบรวมฉันคิดว่า) ใช้เพื่อให้ app ของคุณเมื่อคุณเผยแพร่.apkไฟล์ สิ่งนี้มีประโยชน์สำหรับการทดสอบแอปพลิเคชันของคุณเนื่องจากเป็นความต้องการทั่วไปในการรวบรวมแอปของคุณเมื่อคุณพัฒนา เนื่องจากนี่จะเป็นเวอร์ชันสำหรับรวบรวมเป็น APK จึงเป็นรุ่นที่คุณวางจำหน่ายตามปกติ ในทำนองเดียวกันขอแนะนำให้จับคู่เวอร์ชัน sdk เป้าหมายของคุณ


รุ่น sdk ของฉันรวบรวมและรุ่น sdk เป้าหมายเหมือนกัน นั่นคือ 21. แอปของฉันขัดข้องเมื่อฉันเรียกใช้บนอุปกรณ์ที่มีระดับ API ต่ำกว่า ฉันยังใหม่กับ Android ฉันควรดำเนินการอย่างไรตอนนี้
prgmrDev

2
@prgmrDev หากแอปของคุณเกิดปัญหากับรุ่นที่ต่ำกว่า 21 คุณควรตั้งค่า min min SDK เป็น 21 ซึ่งจะไม่แก้ไขแอปพลิเคชันของคุณในเป้าหมายที่ต่ำกว่า 21 มันจะทราบว่าแอปของคุณไม่รองรับเวอร์ชันต่ำกว่า คุณยังมีตัวเลือกในการกำหนดสิ่งที่กำลังทำลายแอปพลิเคชันของคุณ (สิ่งที่เปลี่ยนแปลงในเวอร์ชัน 21) และเพิ่มการสนับสนุนเพื่อดูแลการพึ่งพานั้น แต่ฉันสงสัยว่ามันจะทำงานมากและไม่อยู่ในขอบเขตของมือใหม่ Android โครงการ.
Matt

1
จะเกิดอะไรขึ้นถ้าฉันตั้งค่า minSdkVersion = 14 targetSdkVersion = 23; และรวบรวม SDK ถึง 19?
thadeuszlay

5
@thadeuszlay คำถามของคุณไม่เกี่ยวข้องเพราะคุณควรคิดนิดหน่อยว่าถ้าคุณตั้งเป้าหมายที่จะใช้เวอร์ชั่น 23 แล้วมันเป็นไปได้อย่างไรที่จะคอมไพล์มันด้วย 19! โปรดติดตามสูตร minSdkVersion <= targetSdkVersion <= compileSdkVersion
Asad

@Matt เกิดขึ้นได้อย่างไรเมื่อใช้ compileVersion 26 เช่นฉันบังเอิญใช้ฟีเจอร์หรือ Java API ที่ไม่รองรับในเวอร์ชัน 21 ซึ่งเป็น min sdk? ขออภัยไม่ได้รับแนวคิดพื้นฐานบางอย่างที่นี่
haart

83

สูตรคือ

minSdkVersion <= targetSdkVersion <= compileSdkVersion

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

targetSdkVersion - บอกว่าระบบ Android จะเปิดการเปลี่ยนแปลงพฤติกรรมที่เฉพาะเจาะจง

ตัวอย่างเช่น:

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

  • เริ่มต้นใน Android 8.0 (API ระดับ 26) ทั้งหมดnotificationsจะต้องกำหนดให้กับช่องมิฉะนั้นจะไม่ปรากฏ สำหรับอุปกรณ์ที่ใช้ Android 7.1 (API ระดับ 25) และต่ำกว่าผู้ใช้สามารถจัดการการแจ้งเตือนแบบต่อแอพเท่านั้น (ประสิทธิภาพแต่ละแอพมีเพียงหนึ่งช่องทางบน Android 7.1 และต่ำกว่า)

  • เริ่มต้นใน Android 9 (API ระดับ Web-based data directories separated by process28) ถ้าtargetSdkVersionเป็น 28+ และคุณสร้างWebViewกระบวนการที่แตกต่างกันคุณจะได้รับjava.lang.RuntimeException

compileSdkVersion - จริง ๆ แล้วมันเป็นรุ่น SDK แพลตฟอร์มและบอก Gradle ที่ Android SDK ใช้ในการรวบรวม เมื่อคุณต้องการใช้คุณสมบัติใหม่หรือ.javaไฟล์ดีบั๊กจาก Android SDK คุณควรดูแล compileSdkVersion ตัวอย่างอีกหนึ่งคือการใช้AndroidXว่ากองกำลังที่จะใช้compileSdkVersion- ระดับ 28 compileSdkVersion ไม่รวมอยู่ใน APK ของคุณ : compile timeมันจะถูกใช้อย่างหมดจดที่ การเปลี่ยน compileSdkVersion ของคุณไม่ได้เปลี่ยนพฤติกรรมการใช้งานจริง มันสามารถสร้างเช่นคำเตือน / ข้อผิดพลาดคอมไพเลอร์ใหม่ ดังนั้นจึงขอแนะนำอย่างยิ่งให้คุณรวบรวม SDK ล่าสุดเสมอ คุณจะได้รับประโยชน์ทั้งหมดจากการตรวจสอบการรวบรวมใหม่สำหรับรหัสที่มีอยู่หลีกเลี่ยง API ที่เลิกใช้ใหม่และพร้อมใช้งาน API ใหม่ ข้อเท็จจริงอีกประการหนึ่งคือcompileSdkVersion >= Support Library version

คุณสามารถอ่านเพิ่มเติมได้ที่นี่ นอกจากนี้ฉันขอแนะนำให้คุณดูตัวอย่างของการโยกย้ายไปยัง Android 8.0


9
คำตอบที่ดีที่สุดที่นี่เพราะจริง ๆ แล้วมันอธิบายถึงความแตกต่างในทางปฏิบัติระหว่าง targetSdkVersion และ compileSdkVersion
Dean Wild

@ yoAlex5 ขอบคุณสำหรับคำตอบของคุณ ฉันเห็นหลายกรณี targetSdkVersion และ compileSdkVersion เหมือนกัน ทำไมหุ่นยนต์ทำสองอย่างแยกไม่สามารถทำได้ดีพอที่จะจัดการหรือมีเหตุผลเฉพาะเบื้องหลังในการทำสองฟิลด์
Manju

@Manju คุณสามารถค้นหาเพิ่มเติมได้ในเธรด SO stackoverflow.com/questions/26694108/…
yoAlex5

@ yoAlex5 คุณหมายถึง 'ระบบ Android เพื่อเปิดการเปลี่ยนแปลงพฤติกรรมที่เฉพาะเจาะจง' คุณสามารถอธิบายได้ไหม?
k_kumar

@atishr 'การเปลี่ยนแปลงพฤติกรรมที่เฉพาะเจาะจง' แสดงอยู่ใน 'ตัวอย่างเช่น' บล็อก
yoAlex5

74

รุ่นmin sdkเป็นรุ่นขั้นต่ำของระบบปฏิบัติการ Android ที่จำเป็นในการเรียกใช้แอปพลิเคชันของคุณ

รุ่น SDK เป้าหมายเป็นรุ่นของ Android ที่แอปของคุณถูกสร้างขึ้นเพื่อทำงานบน

รุ่น SDK รวบรวมเป็นรุ่นของ Android ที่สร้างเครื่องมือที่ใช้ในการรวบรวมและสร้างโปรแกรมประยุกต์ในการสั่งซื้อที่จะปล่อยวิ่งหรือการแก้ปัญหา

โดยปกติแล้วรุ่น sdk ที่รวบรวมและรุ่น sdk เป้าหมายจะเหมือนกัน


23
และเมื่อใดที่พวกเขาไม่ได้ข้อดี / ข้อเสียเหมือนกัน?
powder366

4

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

minSdkVersion : รุ่น min sdk เป็นรุ่นขั้นต่ำของระบบปฏิบัติการ Android ที่จำเป็นในการเรียกใช้แอปพลิเคชันของคุณ

targetSdkVersion : เวอร์ชัน sdk เป้าหมายคือเวอร์ชันที่แอปของคุณกำหนดเป้าหมายให้ทำงาน

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