👩🏻‍💻 TIL

[안드로이드] compileSdkVersion, targetSdkVersion, buildToolsVersion

ji-hyun 2023. 6. 25. 23:08

안드로이드 OS API

나는 아이폰을 쓰고 있기 때문에 안드로이드 OS API 가 뭔지 정확히 몰랐다. 

또한 티라미수, 롤리팝..? 들었을 때 이게 뭔소린지 싶었다.

 

 

 

 

 

 

 

티라미수, 롤리팝..? 

 

안드로이드 운영 체제 버전을 의미한다.

 

안드로이드 운영 체제 버전은 주로 디저트 이름으로 알려져 있다. 이는 구글에서 안드로이드 버전 코드 네임을 디저트 이름으로 명명하여 사용하는 관행이다. 디저트 이름은 해당 버전의 알파벳 순서에 따라서 지정되며,

알파벳 순서대로 칠러(Cupcake), 도넛(Donut), 이클레어(Eclair), 퓨오리아(Froyo), 진저브레드(Gingerbread) 등 다양한 디저트 이름이 사용되었다.

 

 

다음은 안드로이드 버전 순서와 디저트 네임이다.

 

버전 디저트 명 출시일자
안드로이드 1.0 - 없음
최초공개된 안드로이드 버전으로
디저트 명은 없다.
2008년 9월
안드로이드 1.5 Cupcake 2009년 4월
안드로이드 1.6 Donut 2009년 9월
안드로이드 2.0/2.1  Eclair 2009년 10월
안드로이드 2.2 Froyo 2010년 5월
안드로이드 2.3 Gingerbread 2010년 12월 
안드로이드 3.0/3.1/3.2 Honeycomb 2011년 2월
안드로이드 4.0 Ice Cream Sandwich 2011년 10월
안드로이드 4.1/4.2/4.3 Jelly Bean 2012년 7월
안드로이드 4.4 KitKat 2013년 10월
안드로이드 5.0/5.1 Lollipop 2014년 11월
안드로이드 6.0 Marshmallow 2015년 10월
안드로이드 7.0/7.1 Nougat 2016년 8월
안드로이드 8.0/8.1 Oreo 2017년 8월
안드로이드 9.0 Pie 2018년 8월
안드로이드 10.0 Quince Tart 2019년 9월
안드로이드 11.0 Red Velvet Cake 2020년 9월
안드로이드 12.0 Snow Cone 2021년 10월
안드로이드 13.0 Tiramisu 2022년 2월
안드로이드 14 - 개발자 프리뷰 버전 Upside Down Cake 2023년 2월



구글은 이러한 디저트 이름을 사용하여 안드로이드 버전을 더욱 재미있게 표현하고 기억하기 쉽게 만들어 주었다.

 

 

 

 

 

 

 

 

 

안드로이드 OS API

 

안드로이드 OS API는 안드로이드 운영 체제의 다양한 버전에서 제공되는 API 집합을 의미하며, 이 API는 각 버전의 운영 체제에서 사용할 수 있는 기능과 서비스를 포함한다.

 


각 안드로이드 버전은 새로운 기능과 개선 사항을 도입하며, 이에 따라 해당 버전에 맞는 API가 추가되거나 업데이트된다.

따라서 롤리팝(Lollipop) 버전과 티라미수(KitKat) 버전에서는 해당 버전의 운영 체제에 맞는 API가 제공된다.

 

 


안드로이드 개발자는 안드로이드 OS API를 사용하여 애플리케이션을 개발하며, 대부분의 경우 대상 안드로이드 버전에 맞는 API를 사용하여 기능을 구현한다.

안드로이드 OS API는 호환성을 고려하여 이전 버전과의 하위 호환성을 지원하기도 하므로, 새로운 버전의 API를 사용하면서 이전 버전에서도 동작할 수 있도록 지원되는 경우가 많다.

 

 

 

예를 들어, 현재 안드로이드 최신 OS 버전을 티라미수라고 가정해보자.
안드로이드 OS API 는 보통 최신 버전인 티라미수(KitKat)에 포함된 API를 지원하면서도, 이전 버전인 젤리빈(Jelly Bean)이나 아이스크림 샌드위치(Ice Cream Sandwich)와 같은 이전 버전에서도 동작할 수 있도록 지원되는 경우가 많다

 

 

 

 

 

 

 

 

 

 

 


tagetSdkVersion, compileSdkVersion

이전 내용을 이해했다면

이제는 안드로이드 개발에서 자주 쓰이는 targetSdkVersion, compileSdkVersion 가 무엇인지 한번 알아보자.

 

 

 

 

 

 

1. targetSdkVersion

앱이 기기에서 동작할 때 사용되는 Android API 버전을 의미한다. (런타임)

 

따라서 실제 앱 동작에 영향을 주게 되므로 신중히 올려야 한다.

 

 

 

은 기본적으로 targetSdkVersion 에 명시된 API 버전을 기준으로 동작한다.

예외적으로 OS 버전이 낮아 아직 targetSdkVersion 의 API 버전을 지원하지 않을 경우 기기 OS 버전을 따라간다.

무슨 말이냐.. 하면 아래 예제를 보자

 

 

 

 

 

 

 

a. OS 버전 > targetSdkVersion

  • 기기의 OS 버전 : API 26
  • 앱의 targetSdkVersion : API 24

 

해당 기기는 안드로이드 API 26에서 제공하는 기능을 모두 사용할 수 있는 기기이다.

여기에서 포인트는 사용할 수 있다는 것이지, 항상 해당 버전의 기능만 사용한다는 의미가 아니라는 것이다.

위 사례처럼 앱이 targetSdkVersion 값을 24로 정했을 경우, 기기는 API 26 버전에서 제공하는 기능을 사용할 수 있지만 앱은 API 24 베이스로 동작한다.

 

 

 

 

 

 

b. OS version < targetSdkVersion

  • 기기의 OS 버전 : API 26
  • 앱의 targetSdkVersion : API 27

 

이 경우는 보통 국내 제조사들의 OS 업데이트가 늦기 때문에 발생될 수 있는 상황이다.

앱은 기기의 OS 버전인 API 26 베이스로 동작한다.

 

 

 

 

 

 

 

 

2. compileSdkVersion

컴파일 시 사용되는 Android API 버전을 의미한다. (컴파일 타임)

 

따라서 실제 개발중 사용할 수 있는 android API 범위는 compileSdkVersion 에 의해 결정된다.

 

compileSdkVersiosn 값은 가급적 최신으로 유지하기 를 권장하는데 targetSdkVersion 을 변경하지 않는 한 실제 배포되는 앱에 대한 사이드 이팩트가 없기 때문이다.

 

보통 최신 API 가 나오게 되면 compileSdkVersion 을 먼저 올려서, 최신 API 에 대한 대응이 완료된 후 targetSdkVersion 을 올린다. 만약 최신 버전 API 에서 새로 생긴 기능이 있고 이를 추가할 경우 warning 을 통해 하위 버전에서는 작동하지 않으므로 분기 처리를 요구한다.

 

추가로 gradle 내에 buildToolsVersion 값이 있는데, 정상적인 빌드를 위해 compileSdkVersion 을 올릴 때는 같이 최신버전으로 맞춰주는 것을 권장한다.

 

 

 

 

 

 

 

왜 buildToolsVersion 과 compileSdkVersion 을 버전을 동일하게 해야 하는 것을 권장하는지 부연 설명을 하자면,

-> 빌드 과정 중에 컴파일 과정도 포함되기 때문이다.

 

 

 

앱 개발 시에는 일반적으로 다음과 같은 단계로 구성된다.

 

 

1. 코드 작성: 앱의 로직과 기능을 구현하기 위해 프로그래밍 언어 (예: Java, Kotlin, Dart 등)를 사용하여 코드를 작성한다.


2. 컴파일: 작성한 코드는 컴파일러를 사용하여 기계어나 중간 언어로 변환된다. 안드로이드에서는 Java나 Kotlin 코드는 Java 바이트 코드로, Flutter에서는 Dart 코드는 JIT(Just-in-Time) 컴파일 또는 AOT(Ahead-of-Time) 컴파일을 통해 기계어로 변환된다. 컴파일 단계에서는 코드의 문법적 오류를 체크하고 최적화를 수행한다.

JIT, AOT 관한 설명 참고 블로그 -> https://goldenrabbit.co.kr/2023/04/02/flutter-2/

3. 빌드: 컴파일된 코드와 앱의 리소스(이미지, XML 레이아웃 파일 등)가 패키징되어 앱의 실행 파일(APK 또는 AAB)을 생성한다. 빌드 단계에서는 앱의 리소스를 압축하고, 앱에 필요한 파일과 설정을 포함하는 패키지를 생성한다.

4. 패키징 및 서명: 빌드된 앱은 패키징 과정을 거쳐 최종 실행 파일 형태로 만들어진다. 안드로이드 앱은 APK(Android Application Package) 파일로, Flutter 앱은 AOT 컴파일된 경우 APK 파일로, JIT 컴파일된 경우 앱 실행을 위한 다른 파일들로 구성된다. 이후 패키징된 앱은 개발자의 개인 키 또는 인증서를 사용하여 서명된다.

 

 


즉, 컴파일 단계는 코드의 오류를 검사하고 최적화하여 실행 가능한 형태로 변환하는 중요한 과정이다.

빌드 과정에서는 이 컴파일된 코드를 포함하여 앱을 패키징하고 배포 가능한 형태로 만든다.

 

 

 

둘의 버전이 다르다고 에러가 무조건 난다고 얘기하는 것은 아니고 정상적인 빌드 과정을 하려면 컴파일 버전과 빌드 툴의 버전을 맞춰야 하는 것이 아닐까? 하는 결론이 내려졌다.

 

 

 

 

 

 

 

 

 

 

compile SDK version 과 target SDK version 간의 관계

다시 돌아와서...
compileSdkVersion 과 targetSdkVersion 의 의미가 완전히 다르더라도 독립적이지 않다.


targetSdkVersion 은 컴파일하는 동안 아무것도 모르는 것들을 대상으로 할 수 없기 때문에 compileSdkVersion보다 높을 수 없다.

 

 

이상적으로는 compileSdkVersion과 targetSdkVersion이 동일해야 하며 둘 다 최신 SDK를 가리켜야 한다.

하지만 물론 해당 버전에서 도입된 모든 변경 사항이 앱에서 원활하게 동작하는지 테스트한 후에야 알 수 있다.

 

 

 

 

정리

 

안드로이드 SDK version 설정 방법

minSdkVersion <= targetSdkVersion <= compileSdkVersion

 

 

이상적인 SDK version 설정 방법

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

 

 

 

 

 

 

 

 

 


안드로이드 스튜디오 > SDK manager

이제 안드로이드 스튜디오에서 세팅하면 자주 볼 수 있는 용어를 한 번 알아보자.

 

sdk manager 툴은 설치 가능한 패키지 리스트를 검색해서 가져오는 툴이다. 설치 가능 패키지에서는 Platform SDK, 빌드 툴(Build Tool), 플랫폼 툴 (Platform Tool) 및 기타 툴이 포함되어 있다.

 

 

 

 

 

 

SDK platform

 

일단 sdk platform 은 뭘까?

-> 이는 안드로이드 sdk 의 구성요소를 말한다.

 

 

SDK Platforms 탭을 누른 것을 확인

 

 

 

따라서 SDK Platforms 는 android-xx 포맷으로 표시되어 있는 리스트들이다.

 

보통 안드로이드 스튜디오에서는 compileSdkVersion 을 설치한 SDK 플랫폼 버전과 일치시키는 것이 권장된다. 

예를 들어, SDK 플랫폼을 34 로 설치했다면 compileSdkVersion 도 34 로 설정하는 것이 좋다.

이렇게 함으로써 개발자는 최신 API 와 기능을 활용할 수 있고, 호환성과 안정성을 유지할 수 있다.

 

 

만약 compileSdkVersion 을 설치한 SDK 플랫폼 버전과 다르게 설정한다면, 컴파일러는 해당 플랫폼 버전 API 를 사용할 수 없으며, 새로운 기능을 사용하는 경우, 컴파일 에러가 발생할 수 있다. 또한 빌드 도구가 오래된 버전의 API 를 사용하도록 지시하는 경우, 최신 기능과 개선 사항을 활용할 수 없게 된다.

 

 

따라서 안드로이드 스튜디오에서는 SDK 플랫폼과 compileSdkVersion 을 일치시는 것이 가장 좋다..

이렇게 함으로써 개발자는 최신 기능을 활용하고 호환성과 안정성을 유지할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

출처

 

https://itgoodworking.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EB%B2%84%EC%A0%84-%EC%A0%95%EB%A6%AC-%EB%B0%8F-%EB%94%94%EC%A0%80%ED%8A%B8-%EC%9D%B4%EB%A6%84

 

안드로이드 버전 정리 및 디저트 이름

안드로이드(Android) 안드로이드는 구글이 2007년 공개한 모바일 운영체제(OS)로 애플 모바일 기기가 아닌 대부분의 스마트폰 태블릿 PC, 웨어러블 기기 등에서 사용되고 있다. 구글 플레이스토어(Goo

itgoodworking.com

 

 

https://vagabond95.me/posts/android-api-version-manage/

 

 

https://cool-developer.tistory.com/44

 

[Android] compileSdkVersion과 targetSdkVersion의 이해

이번 포스팅은 build.gradle 파일에 있는 compileSdkVersion과 targetSdkVersion이 무엇인지 알아보겠습니다. 우리는 보통 새로운 Android SDK 버전이 출시되면 이 두 API 레벨 값을 모두 업데이트합니다. 하지만

cool-developer.tistory.com