Sự khác biệt giữa compileSdkVersion và targetSdkVersion là gì?


525

Tôi đã xem tài liệu xây dựng với Gradle, nhưng tôi vẫn không chắc sự khác biệt giữa compileSdkVersiontargetSdkVersionlà gì.

Tất cả những gì nó nói là:

Các compileSdkVersionbất động sản quy định các mục tiêu biên dịch.

Chà, "mục tiêu tổng hợp" là gì?

Tôi thấy hai cách có thể để giải thích điều này:

  1. compileSdkVersionlà phiên bản của trình biên dịch được sử dụng để xây dựng ứng dụng, trong khi đó targetSdkVersion"cấp độ API mà ứng dụng nhắm tới" . (Nếu đây là trường hợp, tôi giả sử compileSdkVersionphải lớn hơn hoặc bằng targetSdkVersion?
  2. Họ có nghĩa là điều tương tự. "mục tiêu biên dịch" == "cấp API mà ứng dụng nhắm mục tiêu"
  3. Thứ gì khác?

Tôi thấy rằng câu hỏi này đã được hỏi trước đó, nhưng câu trả lời chỉ trích dẫn tài liệu, đó là những gì không rõ ràng với tôi.



2
targetSdkVersion là những gì thiết bị của bạn đang chạy. Vì vậy, nếu thiết bị của bạn đang chạy thấp hơn Oreo, thì đừng nhắm mục tiêu 27.
IgorGanapolsky

Câu trả lời:


546

biên dịchSdkVersion

Đây compileSdkVersionlà phiên bản API mà ứng dụng được biên dịch theo. Điều này có nghĩa là bạn có thể sử dụng các tính năng API của Android có trong phiên bản API đó (rõ ràng cũng như tất cả các phiên bản trước đó). Nếu bạn thử và sử dụng các tính năng API 16 nhưng được đặt compileSdkVersionthành 15, bạn sẽ gặp lỗi biên dịch. Nếu bạn đặt compileSdkVersionthành 16, bạn vẫn có thể chạy ứng dụng trên thiết bị API 15 miễn là các đường dẫn thực thi của ứng dụng của bạn không cố gắng gọi bất kỳ API cụ thể nào cho API 16.

targetSdkVersion

Không targetSdkVersionliên quan gì đến cách ứng dụng của bạn được biên dịch hoặc API nào bạn có thể sử dụng. Điều targetSdkVersionnày được cho là chỉ ra rằng bạn đã kiểm tra ứng dụng của mình trên (có thể lên đến và bao gồm) phiên bản bạn chỉ định. Điều này giống như một chứng nhận hoặc ký tắt mà bạn đang cung cấp cho HĐH Android như một gợi ý về cách ứng dụng xử lý ứng dụng của bạn về các tính năng của hệ điều hành.

Ví dụ, như tài liệu nêu:

Ví dụ: đặt giá trị này thành "11" hoặc cao hơn cho phép hệ thống áp dụng chủ đề mặc định mới (Holo) cho ứng dụng của bạn khi chạy trên Android 3.0 trở lên ...

Hệ điều hành Android, trong thời gian chạy , có thể thay đổi cách ứng dụng của bạn được cách điệu hoặc thực thi theo cách khác trong bối cảnh của HĐH dựa trên giá trị này. Có một vài ví dụ đã biết khác bị ảnh hưởng bởi giá trị này và danh sách đó có khả năng chỉ tăng theo thời gian.

Đối với tất cả các mục đích thực tế, hầu hết các ứng dụng sẽ muốn đặt thành targetSdkVersionphiên bản API được phát hành mới nhất. Điều này sẽ đảm bảo ứng dụng của bạn trông tốt nhất có thể trên các thiết bị Android gần đây nhất. Nếu bạn không chỉ định targetSdkVersion, nó mặc định là minSdkVersion.


14
Không, targetSdkVersionrất có thể sẽ cao hơn compileSdkVersionvà đúng như vậy. Điều này có nghĩa là mặc dù bạn đã thiết kế một ứng dụng để nhắm mục tiêu API 16, chẳng hạn, nó vẫn chạy tốt trên API 21 (Lollipop) và bạn nên targetSdkVersionnâng cấp lên 21 để cho biết hệ điều hành Android có thể áp dụng bất kỳ kiểu Lollipop nào có thể tồn tại với ứng dụng của bạn.
Jeff Mixon

24
Về cơ bản, tôi không hiểu làm thế nào bạn có thể nhắm mục tiêu một SDK cao hơn SDK mà bạn đã biên soạn.
coder123

55
Thay đổi compileSdkVersionthành phiên bản cao hơn có nghĩa là bạn muốn sử dụng một số API mới chỉ có trong bản phát hành cụ thể đó. Nếu bạn không có kế hoạch sử dụng bất kỳ tính năng nào dành riêng cho Lollipop trong ứng dụng của mình, thì thực sự (thường) không có lý do nào để được đặt compileSdkVersionthành 21. Tuy nhiên, ứng dụng của bạn có thể sẽ chạy tốt trên API 21, do đó bạn sẽ thay đổi targetSdkVersionđể cho biết ứng dụng của bạn chạy như bạn mong đợi (mục tiêu) trên API 21, nhưng bạn không sử dụng bất kỳ API cụ thể nào cho 21 (biên dịch) và do đó bạn compileSdkVersioncó thể giữ ở mức 15 trong ví dụ này.
Jeff Mixon

19
Một cảnh báo được báo cáo khi tôi làm điều đó trong studio Android. Tôi có "compileSdkVersion 17" và "targetSdkVersion 22" và nó cho tôi biết "targetSdkVersion không nên cao hơn compileSdkVersion". Ồ, chỉ cần thay đổi nó và bây giờ nó cho tôi biết targetSdkVersion không phải là 22 mới nhất và chế độ tương thích có thể hoạt động. Thở dài.
Pelpotronic 7/08/2015

18
Câu trả lời này mâu thuẫn với những gì Android Studio nói. targetSdkVersion có vấn đề và nó phải nhỏ hơn hoặc bằng compileSdkVersion
ARK

152

Hướng dẫn về oneliner:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

Lý tưởng nhất:

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

Đọc thêm từ bài viết tuyệt vời này của Ian Lake


minSdkVersion nghĩa là ứng dụng cấp api thiết bị thấp nhất canchạy trên? Có lẽ bởi vì nó sử dụng một số API nhất định có sẵn từ minSdkVersionsau đó?
Bansal Nitin

1
@NitinBansal có. Ví dụ: nếu minSdkVersionlà 15 (là ICS 4.0.3), các thiết bị có API 14 (là ICS 4.0) sẽ không thể cài đặt ứng dụng. Và ít nhất cho đến thời điểm này, ứng dụng sẽ chạy vào các ngày 15, 16, 17, 18, 19, (20 nhưng đó là dành cho os mặc cũ), 21, 22, 23, 24, 25, 26, 27, 28, v.v. trong tương lai (có thể)
Louis Tsai

33

Các compileSdkVersionnên phiên bản ổn định mới nhất. Các targetSdkVersionnên được kiểm tra đầy đủ và ít hoặc bằng compileSdkVersion.


14
Bất kỳ lý do cụ thể nào để nói rằng targetSdkVersion nhỏ hơn compileSdkVersion? Tôi tin rằng đó là một tuyên bố sai
Sufian

6
Tôi đoán vấn đề là phiên bản cuối cùng tương thích ngược, vì vậy phiên bản API mới nhất có thể "hoạt động" như phiên bản cũ hơn, nếu bạn đặt phiên targetSdkVersionbản thấp hơn. Vì vậy, targetSdkVersionnên là người bạn đã thử nghiệm và biết hành vi chính xác và có thể <= ổn định mới nhất.
Doanh số Dielson

Tôi nghĩ rằng tuyên bố của bạn ' compileSdkVersionnên là phiên bản ổn định mới nhất' nên được thêm vào 'trong đó bạn sử dụng các tính năng API'. Sẽ không có ý nghĩa gì khi biên dịch với API 27 (API ổn định mới nhất hiện nay) nếu bạn chỉ sử dụng các tính năng phiên bản API thấp hơn. Tuy nhiên, phiên bản ổn định mới nhất có thể bao gồm một số tính năng tự động trở nên tốt hơn, ví dụ: bảo mật nâng cao hoặc biên dịch hiệu quả với khả năng tương thích ngược. Do đó, nên sử dụng phiên bản mới nhất hoặc ít nhất là một phiên bản ổn định gần đây, nhưng 'không nên' là 'phiên bản mới nhất mỗi lần .
Erik

27

Đến cuối trò chơi .. và có một số câu trả lời tuyệt vời ở trên-- về cơ bản, đó compileSdkVersionlà phiên bản API mà ứng dụng được biên dịch, trong khi targetSdkVersionphiên bản cho biết ứng dụng đã được thử nghiệm.

Tôi muốn bổ sung những câu trả lời bằng các ghi chú sau:

  1. Điều đó targetSdkVersiontác động đến cách yêu cầu quyền :

    • Nếu thiết bị đang chạy Android 6.0 (API cấp 23) trở lên ứng dụng targetSdkVersionlà 23 hoặc cao hơn, ứng dụng sẽ yêu cầu quyền từ người dùng trong thời gian chạy.
    • Nếu thiết bị đang chạy Android 5.1 (API cấp 22) trở xuống hoặc ứng dụng targetSdkVersionlà 22 hoặc thấp hơn, hệ thống sẽ yêu cầu người dùng cấp quyền khi người dùng cài đặt ứng dụng.
  2. Nếu compileSdkVersionphiên bản cao hơn phiên bản do ứng dụng của bạn khai báo targetSdkVersion, hệ thống có thể kích hoạt các hành vi tương thích để đảm bảo ứng dụng của bạn tiếp tục hoạt động theo cách bạn mong đợi. (tham khảo )

  3. Với mỗi bản phát hành Android mới ...

    • targetSdkVersion nên được tăng lên để phù hợp với cấp API mới nhất, sau đó kiểm tra kỹ ứng dụng của bạn trên phiên bản nền tảng tương ứng
    • compileSdkVersionmặt khác, không cần phải thay đổi trừ khi bạn thêm các tính năng dành riêng cho phiên bản nền tảng mới
    • Kết quả là, mặc dù targetSdkVersionthường (ban đầu) ít hơn so với compileSdkVersion, nhưng không có gì lạ khi thấy một ứng dụng được duy trì / thiết lập tốt vớitargetSdkVersion > compileSdkVersion

5
Re: điểm thứ hai của bạn, tôi không nghĩ tài liệu tham khảo nói rõ ràng rằng. Nó nói "Tuy nhiên, nếu mức API của nền tảng cao hơn phiên bản được khai báo bởi targetSdkVersion của ứng dụng, hệ thống có thể cho phép các hành vi tương thích để đảm bảo ứng dụng của bạn tiếp tục hoạt động theo cách bạn mong đợi." Tôi nghĩ điều này có nghĩa là nếu mức API của thiết bị bạn đang chạy mới hơn mức targetSdkVersionbạn có thể thấy các hành vi tương thích. Tôi không tin nó có liên quan gì đến compileSdkVersion.
Jeremy

20

The CompileSdkVersion là phiên bản của nền tảng SDK mà ứng dụng của bạn hoạt động để biên dịch, v.v. NÓI quá trình phát triển (bạn nên luôn luôn sử dụng bản mới nhất) Bản này được cung cấp cùng với phiên bản API bạn đang sử dụng

nhập mô tả hình ảnh ở đây

Bạn sẽ thấy điều này trong build.gradletập tin của bạn :

nhập mô tả hình ảnh ở đây

targetSdkVersion:chứa thông tin ứng dụng của bạn gửi kèm SAU quá trình phát triển tới cửa hàng ứng dụng cho phép nó TARGET the SPECIFIED version of the Android platform. Tùy thuộc vào chức năng của ứng dụng của bạn, ứng dụng có thể nhắm mục tiêu các phiên bản API thấp hơn hiện tại. Ví dụ: bạn có thể nhắm mục tiêu API 18 ngay cả khi phiên bản hiện tại là 23.

Hãy nhìn vào trang Google chính thức này .


9

Tôi thấy rất nhiều sự khác biệt về compiledSdkVersioncác câu trả lời trước đây, vì vậy tôi sẽ cố gắng làm rõ một chút ở đây, sau trang web của Android.

A - Những gì Android nói

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

Chọn phiên bản nền tảng và Cấp độ API Khi bạn đang phát triển ứng dụng của mình, bạn sẽ cần chọn phiên bản nền tảng mà bạn sẽ biên dịch ứng dụng. Nói chung, bạn nên biên dịch ứng dụng của mình theo phiên bản thấp nhất có thể của nền tảng mà ứng dụng của bạn có thể hỗ trợ.

Vì vậy, đây sẽ là thứ tự đúng theo Android:

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - Những gì người khác cũng nói

Một số người thích luôn luôn sử dụng trình biên dịchSkdVersion cao nhất hiện có. Đó là bởi vì họ sẽ dựa vào gợi ý mã để kiểm tra xem họ có đang sử dụng các tính năng API mới hơn minSdkVersion hay không, do đó thay đổi mã để không sử dụng chúng hoặc kiểm tra phiên bản API của người dùng trong thời gian chạy để sử dụng chúng một cách có điều kiện cho các phiên bản API cũ hơn.

Gợi ý về việc sử dụng không dùng nữa cũng sẽ xuất hiện trong mã, cho bạn biết rằng có thứ gì đó không được dùng ở các cấp API mới hơn, do đó bạn có thể phản ứng tương ứng nếu muốn.

Vì vậy, đây sẽ là thứ tự đúng theo người khác:

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

Phải làm sao

Nó phụ thuộc vào bạn và ứng dụng của bạn.

Nếu bạn dự định cung cấp các tính năng API khác nhau theo cấp độ API của người dùng khi chạy, hãy sử dụng tùy chọn B. Bạn sẽ nhận được gợi ý về các tính năng bạn sử dụng trong khi mã hóa. Chỉ cần đảm bảo rằng bạn không bao giờ sử dụng các tính năng API mới hơn minSdkVersion mà không kiểm tra mức API của người dùng khi chạy, nếu không ứng dụng của bạn sẽ bị sập. Cách tiếp cận này cũng có lợi ích của việc học những gì mới và những gì cũ trong khi mã hóa.

Nếu bạn đã biết những gì mới hoặc cũ và bạn đang phát triển một ứng dụng một lần mà chắc chắn sẽ không bao giờ được cập nhật hoặc bạn chắc chắn rằng bạn sẽ không cung cấp các tính năng API mới một cách có điều kiện, sau đó sử dụng tùy chọn A. Bạn sẽ không bị làm phiền với các gợi ý không được chấp nhận và bạn sẽ không bao giờ có thể sử dụng các tính năng API mới hơn ngay cả khi bạn muốn làm điều đó.


2
Tôi không nghĩ rằng lời khuyên Android là khác nhau. Có một sự khác biệt giữa "biên dịch ứng dụng của bạn với phiên bản thấp nhất có thể" và biên dịch với một phiên bản SDK cụ thể. Nói chung, bạn nên biên dịch (compileSdkVersion) với phiên bản mới nhất, đặt min (minSdkVersion) của bạn càng thấp càng tốt và đặt mục tiêu của bạn (targetSdkVersion) càng cao càng tốt để kiểm tra hoặc các vấn đề tương thích khác.
Caltor

Điểm tốt @Caltor. Tôi ước họ sẽ cập nhật tài liệu đó để làm rõ sự khác biệt. Các <uses-sdk>tài liệu là rất mơ hồ và không rõ ràng.
Jeremy

2

2 xu của tôi: Biên dịch với bất kỳ phiên bản SDK nào nhưng lưu ý không gọi bất kỳ API nào mà "phiên bản SDK tối thiểu" của bạn không hỗ trợ. Điều đó có nghĩa là bạn "có thể" biên dịch theo phiên bản mới nhất của SDK.

Đối với "phiên bản mục tiêu", nó chỉ đơn giản đề cập đến những gì bạn dự định nhắm mục tiêu ở nơi đầu tiên và có thể đã được thử nghiệm chống lại. Nếu bạn chưa thực hiện thẩm định thì đây là cách để thông báo cho Android rằng họ cần thực hiện một số kiểm tra bổ sung trước khi ứng dụng cho phép ứng dụng nhắm mục tiêu "Lollipop" của bạn trên "Oreo".

Vì vậy, "phiên bản đích" rõ ràng không thấp hơn "phiên bản SDK tối thiểu" của bạn nhưng nó không thể cao hơn "phiên bản đã biên dịch" của bạn.


1

Không trả lời các câu hỏi trực tiếp của bạn, vì đã có rất nhiều câu trả lời chi tiết, nhưng điều đáng nói là, trái với tài liệu của Android, Android Studio đang đề xuất sử dụng cùng một phiên bản cho compileSDKVersiontargetSDKVersion.

nhập mô tả hình ảnh ở đây


0

compiledSdkVersion ==> phiên bản SDK nên biên dịch của bạn đang để bytecode (nó sử dụng trong môi trường phát triển) điểm: nó tốt hơn sử dụng phiên bản cuối cùng của SDK.

minSdkVersion ==> các mục này sử dụng để cài đặt APK (nó sử dụng trong môi trường sản xuất). Ví dụ:

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

0

Tóm tắt nhanh:

Đối với minSDKversion, hãy xem mục mới nhất trong phần xử lý twitter: https://twitter.com/minSdkVersion

TargetSDKversion: xem mục mới nhất trong twitter xử lý: https://twitter.com/targtSdkVersion hoặc sử dụng cấp API mới nhất như được chỉ ra tại devel https://developer.android.com/guide/topics/manifest/uses-sdk-element. html

Phiên bản được biên dịch: làm cho nó giống như TargetSDKversion

maxSdkVersion: lời khuyên từ Android là không đặt điều này vì bạn không muốn giới hạn ứng dụng của mình không hoạt động trên các bản phát hành Android trong tương lai


0

Cài đặt ứng dụng của các thuộc tính của dự án Android trong Visual Studio 2017 (15.8.5) đã kết hợp chúng:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.