compileSdkVersion과 targetSdkVersion의 차이점은 무엇입니까?


525

Gradle을 사용하여 빌드하기위한 설명서 를 살펴 보았지만 여전히 차이점 compileSdkVersion과 차이점을 잘 모르겠습니다 targetSdkVersion.

그것이 말하는 전부는 :

compileSdkVersion속성은 컴파일 대상을 지정합니다.

"컴파일 대상"이란 무엇입니까?

이것을 해석하는 두 가지 가능한 방법이 있습니다.

  1. compileSdkVersion반면, 응용 프로그램 구축에 사용되는 컴파일러의 버전 targetSdkVersion은 IS "적용 대상이 API 수준" . (이 경우라면 ? compileSdkVersion보다 크거나 같아야 한다고 가정 합니다 targetSdkVersion.
  2. 그들은 같은 것을 의미합니다. "compilation target"== "응용 프로그램이 대상으로하는 API 레벨"
  3. 다른 것?

나는 이 질문 이 이전에 요청 된 것을 보았지만 하나의 대답은 문서를 인용하는 것입니다.



2
targetSdkVersion 은 장치가 실행중인 버전입니다. 따라서 기기가 오레오보다 낮은 상태에서 실행되는 경우에는 27을 타겟팅하지 마십시오.
IgorGanapolsky

답변:


546

compileSdkVersion

compileSdkVersion앱에 대해 컴파일 된 API의 버전입니다. 즉, 해당 버전의 API에 포함 된 Android API 기능 (및 모든 이전 버전)을 사용할 수 있습니다. API 16 기능을 사용하려고하지만 compileSdkVersion15로 설정 하면 컴파일 오류가 발생합니다. compileSdkVersion16으로 설정 한 경우 앱의 실행 경로가 API 16에 특정한 API를 호출하지 않는 한 API 15 디바이스에서 앱을 계속 실행할 수 있습니다.

targetSdkVersion

targetSdkVersion당신이 활용할 수있는 방법을 앱이 컴파일 또는 어떤 API를 함께 할 수 없다. 는 targetSdkVersion당신이 지정한 버전 (아마도에 포함까지)에 응용 프로그램을 테스트 한 것을 나타 내기 위해서 가정된다. 이것은 인증과 비슷하거나 OS 기능 측면에서 앱을 처리하는 방법에 대한 힌트로 Android OS를 제공하고 있음을 나타냅니다.

예를 들어, 설명서에 다음 과 같이 나와 있습니다.

예를 들어이 값을 "11"이상으로 설정하면 Android 3.0 이상에서 실행할 때 시스템이 앱에 새로운 기본 테마 (Holo)를 적용 할 수 있습니다.

런타임시 Android OS 는이 값을 기반으로 OS 컨텍스트에서 앱이 양식화되거나 달리 실행되는 방식을 변경할 수 있습니다. 이 값의 영향을받는 다른 몇 가지 알려진 예가 있으며 해당 목록은 시간이 지남에 따라 증가 할 수 있습니다.

실질적인 목적으로 대부분의 앱은 targetSdkVersion최신 버전의 API 로 설정 하려고합니다. 이렇게하면 최신 Android 기기에서 앱이 최대한 멋지게 보입니다. 을 지정하지 않으면 targetSdkVersion기본값은 minSdkVersion입니다.


14
아닙니다. targetSdkVersion가능성이 높을 것 compileSdkVersion입니다. 예를 들어 API 16을 대상으로하도록 앱을 설계했지만 API 21 (Lollipop)에서 여전히 잘 실행 targetSdkVersion되고 Android OS가 Lollipop 스타일을 적용 할 수 있음을 나타내려면 21로 충돌해야 합니다. 앱에 존재합니다.
Jeff Mixon

24
기본적으로 컴파일 한 SDK보다 높은 SDK를 타겟팅하는 방법을 이해하지 못합니다.
coder123

55
compileSdkVersion더 높은 버전으로 변경하면 해당 특정 릴리스에만 포함 된 일부 새로운 API를 사용하려고합니다. 앱에서 Lollipop 관련 기능을 사용하지 않을 계획이라면 실제로 compileSdkVersion21로 설정할 이유가 없습니다 . 그러나 앱은 API 21에서 그대로 실행될 것이므로 변경하십시오. API 21에서 targetSdkVersion앱 이 예상대로 (타겟) 실행 됨을 나타내지 만 21 (컴파일)에 특정한 API를 사용하지 않으므로이 compileSdkVersion예제에서 15를 유지할 수 있습니다.
Jeff Mixon

19
안드로이드 스튜디오에서 그렇게 할 때 경고가 표시됩니다. "compileSdkVersion 17"및 "targetSdkVersion 22"가 있으며 "targetSdkVersion이 compileSdkVersion보다 높아서는 안됩니다"라고 알려줍니다. 오, 방금 변경했는데 이제 targetSdkVersion이 최신 22가 아니며 호환 모드가 시작될 수 있습니다. Sigh.
Pelpotronic

18
이 답변은 Android Studio의 내용과 모순됩니다. targetSdkVersion은 중요하며 compileSdkVersion 이하이어야합니다.
ARK

152

원 라이너 가이드로서 :

minSdkVersion <= targetSdkVersion <= compileSdkVersion

이상적으로 :

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

이안 레이크 (Ian Lake)의이 훌륭한 게시물에서 더 읽어보기


않습니다 minSdkVersion 수단 가장 낮은 디바이스 API 레벨의 응용 프로그램 can에서 실행? 아마도 사용 가능한 특정 API를 사용하기 때문에 minSdkVersion?
Nitin Bansal

1
@NitinBansal 예. 예를 들어 minSdkVersion15 (ICS 4.0.3) 인 경우 API 14 (ICS 4.0)가있는 장치는 앱을 설치할 수 없습니다. 그리고 적어도 지금은 앱이 15, 16, 17, 18, 19에서 실행되지만 (20은 이전 마모 OS 용) 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 버전 기능 만 사용하는 경우 API 27 (오늘날의 최신 안정적인 API)에 대해 컴파일하는 것은 의미가 없습니다. 그러나 최신 안정 버전에는 향상된 보안 또는 이전 버전과의 호환성을 갖춘 효율적인 컴파일과 같이 자동으로 개선되는 일부 기능이 포함될 수 있습니다. 따라서 최신 또는 최소한 안정적인 버전을 사용하는 것이 좋지만 최신 버전 자체 는 아니어야합니다 .
Erik

27

게임에 늦었습니다. 위의 몇 가지 훌륭한 답변이 있습니다. 본질적으로 compileSdkVersion앱이 컴파일 된 API 버전이고 targetSdkVersion앱은 테스트 된 버전을 나타냅니다.

다음 참고 사항으로 해당 답변을 보완하고 싶습니다.

  1. targetSdkVersion영향 권한을 요청하는 방법 :

    • 장치가 안드로이드 6.0 (API 레벨 23) 이상을 실행하고, 경우 응용 프로그램의가 targetSdkVersion23 이상이며, 실행시 사용자의 응용 프로그램 요청 권한.
    • 장치가 안드로이드 5.1 (API 레벨 22)를 실행하는 경우 낮추거나 응용 프로그램의가 targetSdkVersion22 이하이고, 시스템은 사용자가 앱을 설치하는 경우 사용 권한을 부여하도록 요청합니다.
  2. compileSdkVersion앱의 targetSdkVersion에서 선언 한 버전보다 높으면 시스템에서 호환성 동작을 활성화하여 앱이 계속 예상대로 작동하도록 할 수 있습니다. ( REF )

  3. 각각의 새로운 안드로이드 릴리스와 함께 ...

    • targetSdkVersion 최신 API 레벨에 맞게 증가한 다음 해당 플랫폼 버전에서 애플리케이션을 철저히 테스트하십시오.
    • compileSdkVersion반면에 새 플랫폼 버전 전용 기능을 추가하지 않는 한 변경하지 않아도됩니다.
    • 결과적으로 targetSdkVersion종종 (초기)보다 compileSdkVersion작지만, 잘 유지 / 구축 된 앱을 보는 것은 드문 일이 아닙니다targetSdkVersion > compileSdkVersion

5
다시 : 당신의 두 번째 요점, 나는 참고 문헌이 명시 적으로 말하지 않는다고 생각합니다. 그러나 "플랫폼의 API 레벨이 앱의 targetSdkVersion에 의해 선언 된 버전보다 높으면 시스템이 호환성 동작을 활성화하여 앱이 계속 예상대로 작동하도록 할 수 있습니다"라고 말합니다. 나는 이것이 당신이 실행중인 장치의 API 레벨이 당신보다 targetSdkVersion호환성 이 더 높다는 것을 의미한다고 생각합니다 . 나는 그것이와 관련이 있다고 생각하지 않습니다 compileSdkVersion.
제레미

20

The CompileSdkVersion 개발 프로세스 중에 앱이 컴파일 등을 위해 사용하는 SDK 플랫폼의 버전입니다 (항상 최신 버전을 사용해야 함). 사용중인 API 버전과 함께 제공됩니다.

여기에 이미지 설명을 입력하십시오

build.gradle파일 에서 이것을 볼 수 있습니다 :

여기에 이미지 설명을 입력하십시오

targetSdkVersion:앱이 개발 프로세스 후에 앱 스토어에 제공 할 수있는 정보를 포함합니다 TARGET the SPECIFIED version of the Android platform. 앱의 기능에 따라 현재보다 낮은 버전의 API를 타겟팅 할 수 있습니다. 예를 들어 현재 버전이 23 인 경우에도 API 18을 타겟팅 할 수 있습니다.

이 공식 Google 페이지를 잘 살펴보십시오 .


9

compiledSdkVersion이전 답변과 관련 하여 많은 차이점이 있으므로 Android의 웹 페이지에 따라 여기에서 약간의 설명을 시도합니다.

A-Android의 말

https://developer.android.com/guide/topics/manifest/uses-sdk-element.html 에 따르면 :

플랫폼 버전 및 API 레벨 선택 애플리케이션을 개발할 때 애플리케이션을 컴파일 할 플랫폼 버전을 선택해야합니다. 일반적으로 응용 프로그램이 지원할 수있는 가장 낮은 버전의 플랫폼에 대해 응용 프로그램을 컴파일해야합니다.

따라서 Android에 따르면 올바른 순서입니다.

compiledSdkVersion = minSdkVersion <= targetSdkVersion

B-다른 사람들의 말

어떤 사람들은 항상 가장 높은 컴파일 된 SkdVersion을 사용하는 것을 선호합니다. minSdkVersion보다 새로운 API 기능을 사용하고 있는지 확인하기 위해 코드 힌트에 의존하기 때문에 코드를 사용하지 않도록 변경하거나 런타임시 사용자 API 버전을 검사하여 조건부로 이전 API 버전의 폴 백과 함께 사용하기 때문입니다.

더 이상 사용되지 않는 사용에 대한 힌트도 코드에 표시되어 새로운 API 레벨에서 더 이상 사용되지 않는 것을 알 수 있으므로 원하는 경우 적절하게 대응할 수 있습니다.

따라서 다른 사람들에 따르면 올바른 순서입니다.

minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

무엇을해야합니까?

그것은 당신과 당신의 응용 프로그램에 달려 있습니다.

런타임시 사용자의 API 레벨에 따라 다른 API 기능을 제공하려는 경우 옵션 B를 사용하십시오. 코딩하는 동안 사용하는 기능에 대한 힌트를 얻을 수 있습니다. 런타임에 사용자 API 레벨을 확인하지 않고 minSdkVersion보다 최신 API 기능을 사용하지 않도록하십시오. 그렇지 않으면 앱이 중단됩니다. 이 접근법은 또한 코딩하는 동안 새로운 것과 오래된 것을 배우는 이점이 있습니다.

새로운 기능이나 오래된 기능을 이미 알고 있고 업데이트되지 않는 일회성 앱을 개발 중이거나 조건부로 새로운 API 기능을 제공하지 않을 것이라고 확신한다면 옵션 A를 사용하십시오. 귀찮게하지 않습니다. 더 이상 사용되지 않는 힌트가 포함되어 있으므로 최신 API 기능을 사용할 수 없습니다.


2
나는 안드로이드 조언이 다르다고 생각하지 않습니다. "응용 프로그램 컴파일 사이에 차이가 있습니다 에 대한 가장 낮은 버전"을 컴파일 하여 특정 SDK 버전. 일반적으로 최신 버전으로 컴파일 (compileSdkVersion)하고, 최소 (minSdkVersion)를 가능한 낮게 설정하고 테스트 (또는 기타 호환성 문제)에 따라 대상 (targetSdkVersion)을 가능한 높게 설정해야합니다.
Caltor

좋은 지적 @ Caltor. 차이점을 명확히하기 위해 해당 문서를 업데이트하기를 바랍니다. <uses-sdk>문서는 매우 애매하고 모호합니다.
제레미

2

내 2 센트 : 모든 SDK 버전과 컴파일 할 수 있지만 "최소 SDK 버전"에서 지원하지 않는 API는 호출하지 않도록주의하십시오. 즉, 최신 버전의 SDK에 대해 "컴파일"할 수 있습니다.

"타겟 버전"은 처음에 타겟팅하고 테스트 한 대상을 나타냅니다. 실사를하지 않은 경우 Android에 "Oreo"의 "Lollipop"대상 앱을 배포하기 전에 추가 확인을 수행해야한다는 사실을 Android에 알리는 방법입니다.

따라서 "대상 버전"은 "최소 SDK 버전"보다 낮지 않지만 "컴파일 된 버전"보다 높을 수는 없습니다.


1

직접 질문에 대답하지 마십시오. 이미 자세한 답변이 많이 있기 때문에 Android 설명서와 달리 Android Studio는 compileSDKVersion및에 동일한 버전을 사용하도록 제안합니다 targetSDKVersion.

여기에 이미지 설명을 입력하십시오


0

컴파일 된 SDK 버전 ==> 코드 를컴파일 할 SDK 버전 바이트 개발 (개발 환경에서 사용) 포인트 : 최신 버전의 SDK를 사용하는 것이 좋습니다.

minSdkVersion ==>이 항목은 APK 설치에 사용합니다 (생산 환경에서 사용). 예를 들면 다음과 같습니다.

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

0

빠른 요약 :

minSDKversion의 경우 트위터 핸들의 최신 항목을 참조하십시오 : https://twitter.com/minSdkVersion

TargetSDKversion : 트위터 핸들 : https://twitter.com/targtSdkVersion의 최신 항목을 보거나 devel https://developer.android.com/guide/topics/manifest/uses-sdk-element에 표시된 최신 API 레벨을 사용 하십시오. html

컴파일 된 버전 : TargetSDKversion과 동일하게 만들기

maxSdkVersion : Android의 조언은 향후 Android 릴리스에서 앱이 수행되지 않도록 제한하지 않기 때문에 이것을 설정하지 않는 것이 좋습니다.


0

Visual Studio 2017 (15.8.5)의 Android 프로젝트 속성에 대한 응용 프로그램 설정에는 다음이 결합되어 있습니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.