🤖안드로이드🤖

[안드로이드] 프로젝트 구조 뜯어보기 - Android SDK에 대하여

bbooyaaa 2025. 8. 19. 02:49

최근 새로운 프로젝트에 들어가기에 앞서서 기술 스택을 정하는 시간을 가졌어요.

팀원들과 함께 기본적인 것부터 디테일한 것까지 천천히 정해보는데, 문득 그런 생각이 들었습니다.

나 .. 다 정확히 알고 쓰고 있는 게 맞나?

 

항상 기술 스택을 정할 때, 아키텍처나 디자인 패턴 같은 부분에만 신경을 쓰고, 나머지는 그냥 이거 쓰지 뭐 이런 식으로 가볍게 넘어가고 있었어요. 그게 뭔지도 정확히, 자세히 모르면서 말이죠.

 

그래서 시작합니다.

프로젝트 구조 뜯어보기 시리즈 .. 프로젝트 구조 세팅하다가 발견한 것뿐만 아니라 개발하다가도 문득 이게 뭐지? 싶으면 바로바로 작성할 예정입니다. 정기 시리즈로 가보려고 해요.

 

첫 글은 Android SDK로 시작해 볼게요.

 

Android SDK

- **Android SDK**
    - AGP(Android Gradle Plugins) : 8.6.0
    - kotlin: 2.1.0
    - minSdk : 미정
    - compile & targetSdk = 35

API(Application Programming Interface)란?

앱이 호출할 수 있도록 플랫폼이 공개해 둔 클래스/메서드/상수의 묶음입니다.

특히 OS가 제공하는 Java API 프레임워크가 핵심으로, 앱은 이 API를 통해 시스템 서비스(액티비티 관리, 알림, 리소스, 콘텐츠 제공자 등)에 접근합니다. 개발자 앱도 시스템 앱과 동일한 프레임워크 API를 그대로 씁니다.

→ 한 마디로, 앱이 시스템 기능을 사용하는 방법서와 문이 바로 API라고 생각하면 되는 거죠.

안드로이드 소프트웨어 스택(공식문서)

플랫폼 레이어

위의 이미지를 보며 플랫폼 아키텍처에 간단하게 알아봅시다. (자세한 내용은 공식 문서를 참고해 주세요.)

  • Linux 커널
  • 스레딩/메모리 같은 저수준 기능과 보안의 기반. 제조사는 여기에 하드웨어 드라이버를 붙임.
  • 하드웨어 추상화 계층(HAL)
  • 하드웨어 ↔ Java API 프레임워크 사이의 표준 인터페이스. 프레임워크가 카메라/블루투스 같은 하드웨어에 접근하려고 하면 해당 HAL 모듈이 로드됨.
  • Android 런타임(ART)
  • 앱의 바이트코드(DEX)를 실행하고, AOT/JIT 등을 담당
  • 네이티브 C/C++ 라이브러리
  • 핵심 컴포넌트가 쓰는 네이티브 코드들. 일부는 Java 프레임워크 API를 통해 앱에 노출됨.
  • Java API 프레임워크뷰 시스템, 리소스 관리자, 알림 관리자, 활동 관리자, 콘텐츠 제공자 등의 공개 API 집합
  • 우리가 호출하는 곳임.
  • 시스템 앱예를 들어 앱에서 SMS 메시지를 전달하도록 하려면 이 기능을 직접 빌드하지 않아도 됨. 대신 이미 설치된 SMS 앱을 호출하여 지정한 수신자에게 메시지를 전송할 수 있음.
  • 사용자를 위한 앱으로도 작동하고 개발자가 자체 앱에서 액세스 할 수 있는 주요 기능을 제공하기 위해 작동함.

API 흐름 이해

앱이 API를 부르면 내부적으로는 대략 이런 흐름이 일어납니다.

앱 코드(Kotlin) → Java API 프레임워크(Camera2, NotificationManager) 
→ 시스템 서비스가 작업을 수행 → HAL 모듈을 통해 하드웨어 호출
→ 드라이버/커널 → 실제 하드웨어 동작

정리

결론적으로 !

API란 무엇을 할 수 있는지어떻게 호출하는지를 문서화한 계약인 겁니다. (안드로이드에서는 그 대표가 Java API 프레임워크인 것)

그래서 앱은 API를 부르고, 실제 구현/하드웨어 접근은 플랫폼이 맡는 흐름인 거죠.

그럼 API 레벨은?

안드로이드는 플랫폼 API의 버전을 정수로 표현합니다. 이걸 API 레벨, API 수준이라고 불러요.

이 API 레벨에 따라서 지원하는 플랫폼 버전이 다르기 때문에 잘 확인해야 합니다. 제대로 확인하지 않고 사용했다가는 지원하지 않는 기기에서 설치가 막히거나, 컴파일 시 최신 API 미인식/에러가 나는 등의 문제가 발생할 수 있으니까요.

 

각 Android 플랫폼 버전이 지원하는 API 레벨 표(공식문서)

그렇다면 이제 API 레벨이 뭔지 알았으니 minSdk, compileSdk, targetSdk에 대해 넘어가 봅시다.

 

minSdk

앱이 설치·실행될 최소 API 레벨(플랫폼 버전)입니다.

이거보다 낮은 기기에는 설치되지 않아요. ⇒ 최저 지원선

→ 한 마디로, 지원기기 범위가 결정되는 거죠.

낮출수록 더 많은 기기에서 설치되겠지만, 과거 제약(권한/동작 차이, 일부 최신 라이브러리 미지원)도 고려해야 합니다.

compileSdk

이 API 레벨의 SDK를 기준으로 컴파일하겠다는 의미입니다. ⇒ 컴파일 기준선(빌드 타임)

최신 API를 코드에서 사용 가능하게 해 줘요.

런타임 동작을 바꾸진 않지만(코드에서 인식/참조 가능만 해줌 → 실제 API 호출은 OS에서 동작하기 때문), 새 API 심벌을 인식하고 경고/에러 기준이 바뀝니다.

targetSdk

앱이 해당 API 레벨의 동작/제한을 따를 준비가 됨을 의미합니다. ⇒ 최적화 API 레벨

플랫폼은 여기에 맞춰 호환/행동 변경을 적용하죠.

공식 <uses-sdk> 문서도 targetSdk를 앱이 설계된(최적화된) API 레벨로 정의해요.

*Play 배포를 위해서는 2025/08/31부터 신규/업데이트 앱이 API 35+를 타겟해야 한다고 하네요. 그렇지 않으면 최신 기기 사용자에게는 스토어에서 노출/설치가 제한된다고 합니다!(공식문서)

AGP(Android Gradle Plugin)란?

그럼 이제 AGP에 대하여 알아봅시다.

사실 말 그대로 Gradle에 안드로이드 빌드 능력을 붙여주는 플러그인입니다.

내 코드랑 이미지들을 설치 가능한 앱(APK/AAB)으로 만들어 주는 공장장인 거죠.

버튼(빌드/런)만 누르면, 알아서 다 조립·포장·라벨링까지 해주는 애인 겁니다.

그래서 무슨 정확히 무슨 일을 해주는가?

  1. 앱 버전 나눠 만들기
    • debug(개발용) / release(배포용) 같이 여러 버전의 앱을 자동으로 만들어줘요.
    • 필요하면 free/pro, dev/prod 같은 에디션도 한 프로젝트에서 뚝딱.
  2. 파일 다 모아서 컴파일
    • Kotlin/Java 코드 컴파일하고, res/ 폴더(이미지, 레이아웃, 문자열)도 앱에서 쓸 수 있게 변환해요.
  3. 매니페스트(앱 설명서) 합치기
    • 내 프로젝트 + 사용하는 라이브러리들의 설정을 한 장으로 깔끔히 병합해 줘요.
  4. 살 빼고 단단하게(릴리즈 때)
    • 안 쓰는 코드/그림을 자동으로 제거하고, 난독화/최적화해서 용량 줄이고 성능 올려줘요.
  5. 포장하고 도장 찍기
    • 결과물을 APK(바로 설치) 또는 AAB(스토어 업로드용)로 패키징 + 서명까지 완료!
  6. 도구 버전 맞춰주기
    • Android SDK/빌드 도구들과 궁합을 맞춰 빌드가 안정적으로 돌게 해줘요.

이런 중요한 일들을 해주는 친구였는데, 기본적으로 어떻게 동작하는지도 모르고 사용하고 있었네요. 이제라도, 가볍게라도 알게 되어 좋네요.

한 줄 정리

  • Android SDK: 안드 앱 만들 때 쓰는 도구 + 플랫폼 API 묶음.
  • API: 앱이 시스템 기능 쓰는 공식 문/방법서.
  • API 레벨: 그 API의 버전 번호.
  • minSdk: 설치 가능한 최저 OS(지원 기기 범위 결정).
  • compileSdk: 컴파일에 쓰는 API 버전(코드에서 최신 API 참조).
  • targetSdk: 런타임 규칙 기준 버전(버전별 정책·제한 적용, Play 요건).
  • Kotlin: 우리가 쓰는 언어/컴파일러 버전.
  • AGP: Gradle에 안드 빌드 능력 붙여주는 공장장
    빌드 변형 자동 생성, 변형별 코드·리소스·매니페스트 병합,
    (컴파일→병합→최적화→패키징/서명)
  • APK vs AAB: APK=설치 파일, AAB=스토어 업로드용.
  • 빌드 변형: 한 프로젝트에서 Build Type(debug/release)·Product Flavor(free/pro) 같은 여러 버전 뽑기.

이렇게 Android SDK에 대하여 가볍게 알아보았습니다. 오늘은 가볍게 알아보았지만, 글이 올라오는 빈도를 줄이더라도 글이 발행될수록 더 퀄리티가 높아지고, 더 딥다이브할 수 있도록 노력해보려고 해요.(제발!)

구현에 대한 내용도 좋지만 이렇게 기본을 알아가며, 정확히 알고 쓰는 것도 중요하다고 생각합니다. 정기 시리즈 .. 열심히 적어보며 한 학기 열심히 살아볼게요 !