Sự khác biệt giữa phiên bản SDK tối thiểu / phiên bản SDK mục tiêu so với phiên bản SDK biên dịch là gì?


214

Sự khác biệt giữa "phiên bản sdk tối thiểu / phiên bản sdk mục tiêu" và "phiên bản sdk biên dịch" là gì? Tôi biết sdk tối thiểu và mục tiêu có nghĩa là gì, nhưng biên dịch phiên bản sdk có nghĩa là gì?

Trong Eclipse, tôi có sdk tối thiểu và tối đa và mục tiêu, nhưng trong studio android có ba cài đặt này.


Tôi hiện đang làm việc trên một ứng dụng mà tôi đã sử dụng Targetdkversion khi 12 và tất cả các bố cục của tôi hoạt động rất bất thường, sau đó tôi thay đổi nó thành 23 và nó hoạt động như một bùa mê nên tôi nghĩ phiên bản Targetdk phải luôn giống như phiên bản được biên dịch
Shahid Sarwar

Câu trả lời:


232

Các phiên bản phút sdk là phiên bản đầu tiên của Android SDK mà ứng dụng của bạn có thể chạy trên. Thông thường, điều này là do sự cố với các API trước đó, thiếu chức năng hoặc một số vấn đề về hành vi khác.

Các phiên bản đích sdk là phiên bản ứng dụng của bạn được nhắm mục tiêu để chạy trên. Lý tưởng nhất, điều này là do một số loại điều kiện chạy tối ưu. Nếu bạn định "tạo ứng dụng cho phiên bản 19", đây là nơi sẽ được chỉ định. Nó có thể chạy trên các bản phát hành sớm hơn hoặc muộn hơn, nhưng đây là những gì bạn đang hướng tới. Điều này chủ yếu là để cho biết ứng dụng của bạn hiện đang được sử dụng như thế nào trên thị trường, v.v.

Các phiên bản biên dịch sdk là phiên bản của Android IDE của bạn (hoặc các phương tiện khác biên soạn tôi giả sử) sử dụng để làm cho ứng dụng của bạn khi bạn xuất bản một .apktập tin. Điều này rất hữu ích để kiểm tra ứng dụng của bạn vì đây là nhu cầu phổ biến để biên dịch ứng dụng của bạn khi bạn phát triển ứng dụng. Vì đây sẽ là phiên bản để biên dịch thành APK, nên nó sẽ tự nhiên là phiên bản phát hành của bạn. Tương tự như vậy, nên để phiên bản sdk mục tiêu của bạn phù hợp.


Phiên bản sdk biên dịch của tôi và phiên bản sdk mục tiêu là như nhau. Đó là 21. Ứng dụng của tôi gặp sự cố khi tôi chạy nó trên các thiết bị có mức API thấp hơn. Tôi mới dùng Android, tôi nên tiến hành như thế nào bây giờ?
prgmrDev

2
@prgmrDev Nếu ứng dụng của bạn gặp sự cố trên các phiên bản thấp hơn 21, có lẽ bạn nên đặt phiên bản SDK tối thiểu của mình thành 21. Điều này sẽ không thực sự khắc phục ứng dụng của bạn trên các mục tiêu thấp hơn 21, nó sẽ chỉ lưu ý rằng ứng dụng của bạn không được hỗ trợ trên các phiên bản thấp hơn. Bạn cũng có tùy chọn xác định chính xác những gì đang phá vỡ ứng dụng của bạn (những gì đã thay đổi trong phiên bản 21) và thêm hỗ trợ để chăm sóc sự phụ thuộc đó, nhưng tôi nghi ngờ rằng sẽ có rất nhiều công việc và không nằm trong phạm vi của người mới bắt đầu Android dự án.
Matt

1
Điều gì xảy ra nếu tôi đặt minSdkVersion = 14; targetSdkVersion = 23; và biên dịch SDK thành 19?
thadeuszlay

5
@thadeuszlay câu hỏi của bạn không liên quan vì bạn nên suy nghĩ một chút rằng nếu bạn nhắm mục tiêu chạy trên phiên bản 23 thì làm sao có thể biên dịch nó với 19! Vui lòng làm theo công thức minSdkVersion <= targetSdkVersion <= compileSdkVersion
Asad

@Matt có thể xảy ra rằng khi sử dụng compileVersion 26 chẳng hạn, tôi vô tình sử dụng một tính năng hoặc java API không được hỗ trợ trên phiên bản 21, đó là min sdk? xin lỗi, không thực sự có được một số khái niệm cơ bản ở đây
haart

83

Công thức là

minSdkVersion <= targetSdkVersion <= compileSdkVersion

minSdkVersion - là một điểm đánh dấu xác định phiên bản Android tối thiểu mà ứng dụng sẽ có thể cài đặt. Ngoài ra, nó được Lint sử dụng để ngăn chặn việc gọi API không tồn tại. Ngoài ra, nó có tác động đến thời gian xây dựng. Vì vậy, bạn có thể sử dụng các hương vị xây dựng để ghi đè minSdkVersion đến mức tối đa trong quá trình phát triển. Nó sẽ giúp xây dựng nhanh hơn bằng cách sử dụng tất cả các cải tiến mà nhóm Android cung cấp cho chúng tôi. Ví dụ, một số tính năng Java 8 chỉ có sẵn từ phiên bản cụ thể của minSdkVersion.

targetSdkVersion - cho biết hệ thống Android sẽ bật các thay đổi hành vi cụ thể.

Ví dụ:

  • Bắt đầu từ Android 6.0 (API cấp 23) Runtime Permissionsđã được giới thiệu. Nếu bạn đặt targetSdkVersionthành 22 hoặc thấp hơn, ứng dụng của bạn không yêu cầu người dùng cho phép một số thời gian chạy.

  • Bắt đầu từ Android 8.0 (API cấp 26), tất cả notificationsphải được gán cho một kênh nếu không nó sẽ không xuất hiện. Trên các thiết bị chạy Android 7.1 (API cấp 25) trở xuống, người dùng chỉ có thể quản lý thông báo trên cơ sở mỗi ứng dụng (mỗi ứng dụng chỉ có một kênh trên Android 7.1 trở xuống).

  • Bắt đầu từ Android 9 (API cấp 28), Web-based data directories separated by process . Nếu targetSdkVersionlà 28+ và bạn tạo một số WebViewtrong các quy trình khác nhau, bạn sẽ nhận đượcjava.lang.RuntimeException

compileSdkVersion - thực sự là phiên bản SDK Platform và cho Gradle biết SDK Android nào sẽ sử dụng để biên dịch. Khi bạn muốn sử dụng các tính năng mới hoặc .javacác tệp gỡ lỗi từ SDK Android, bạn nên chăm sóc compileSdkVersion. Một ví dụ nữa là sử dụng AndroidX buộc phải sử dụng compileSdkVersion- cấp 28. compileSdkVersion không được bao gồm trong APK của bạn : nó hoàn toàn được sử dụng tại compile time. Thay đổi compileSdkVersion của bạn không thay đổi hành vi thời gian chạy. Nó có thể tạo ra các cảnh báo / lỗi trình biên dịch mới. Do đó, chúng tôi khuyên bạn luôn luôn biên dịch với SDK mới nhất. Bạn sẽ nhận được tất cả các lợi ích của kiểm tra biên dịch mới trên mã hiện có, tránh các API mới không dùng nữa và sẵn sàng sử dụng các API mới. Một sự thật nữa làcompileSdkVersion >= Support Library version

Bạn có thể đọc thêm về nó ở đây . Ngoài ra tôi sẽ khuyên bạn nên xem ví dụ về việc di chuyển sang Android 8.0.


9
Câu trả lời tốt nhất ở đây vì nó thực sự giải thích sự khác biệt thực tế giữa targetSdkVersion và compileSdkVersion
Dean Wild

@ yoAlex5 Cảm ơn câu trả lời của bạn. Tôi thấy nhiều trường hợp targetSdkVersion và compileSdkVersion giống nhau. Tại sao Android làm hai cái riêng biệt không thể đủ để xử lý hoặc có lý do cụ thể nào đằng sau việc tạo ra hai trường riêng biệt không?
Manju

@Manju bạn có thể tìm thấy nhiều hơn trong chủ đề SO stackoverflow.com/questions/26694108/ trên
yoAlex5

@ yoAlex5 ý bạn là gì 'Hệ thống Android để bật các thay đổi hành vi cụ thể' bạn có thể giải thích không?
k_kumar

@atishr 'thay đổi hành vi cụ thể' được liệt kê trong khối 'Ví dụ'
yoAlex5

74

Các phiên bản phút sdk là phiên bản tối thiểu của hệ điều hành Android cần thiết để chạy ứng dụng của bạn.

Các phiên bản đích sdk là phiên bản của Android mà ứng dụng của bạn được tạo ra để chạy trên.

Các phiên bản biên dịch sdk là phiên bản của Android mà các công cụ xây dựng sử dụng để biên dịch và xây dựng ứng dụng để phát hành, chạy, hoặc gỡ lỗi.

Thông thường phiên bản sdk biên dịch và phiên bản sdk đích giống nhau.


23
Và khi chúng không giống nhau về ưu / nhược điểm?
bột366

4

biên dịchSdkVersion : compileSdkVersion là 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 đó (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 đặt compileSdkVersion thành 15, bạn sẽ gặp lỗi biên dịch. Nếu bạn đặt compileSdkVersion thành 16, bạn vẫn có thể chạy ứng dụng trên thiết bị API 15.

minSdkVersion : Phiên bản sdk tối thiểu là phiên bản tối thiểu của hệ điều hành Android cần có để chạy ứng dụng của bạn.

targetSdkVersion : Phiên bản sdk đích là phiên bản mà ứng dụng của bạn được nhắm mục tiêu để chạ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.