본문 바로가기
Android

Android Build process 훑어보기 (1) - 빌드, 배포, 컴파일,런타임

by 안스 인민군 2024. 3. 5.

빌드와 배포

서버에 기능을 추가 하려면 개발자가 로컬 PC에서 개발을 하고 테스트까지 진행한 뒤에 문제가 없을 경우 사용자가 사용할 수 있도록 수정된 코드를 실 서버에 반영해야 한다. 실서버에 반영을 하는 것을 "배포"라고 하고 배포를 하기 위한 과정을 "빌드"라고 한다.

 

컴파일(Compile)

컴파일은 프로그램을 생성하기 위해 개발자가 작성한 소스코드을 "컴파일" 이라는 과정을 통해 기계가 알아들을 수 있는 과정을 말한다.

그러나 Java 와 kotlin은 조금 다른 과정을 거친다. (우리는 안드로이드 개발자이니 여기를 좀더 중점적으로 보자.

자바(확장자 : '.java')와 코틀린(확장자 : '.kt')으로 구성된 파일이 있을때 각각의 javac 와 kotlinc에 의해서 자바 바이트 코드로 컴파일 된다. 이때의 확장자는 '.class' 로 변한다. 이 자바 바이트 코드(확장자 '.class') 는 JVM의 JIT컴파일러에 의해서 기계가 이해 할 수 있는 언어로 변경된다. 이후 해독된 기계언어를 메모리에 할당 후, cpu에 의해 실행한다.

JDK에서는 어떻게 동작을 하는 걸까?

먼저 JDK, Development Tools, JRE, JVM, Java 클래스 라이브러리, Java 클래스 로더, JIT 가 무엇인지 알아보고 안드로이드 스튜디오로 개발하는 우리와 어떻게 연관되는지까지 알아보자.

 

JDK란(Java Development Kit)

Java 개발 키트로, Java 프로그램을 개발할 필요한 프로그래밍 도구들의 집합이다. Java 컴파일러(javac), 자바 애플리케이션 런처(java), 디버거 다양한 개발 도구가 포함되어 있다.

안드로이드 스튜디오와 함께 사용되어 Java 코드를 컴파일하고, 개발을 위한 다양한 도구를 제공한다. 최근에는 Android Studio 내장된 JDK 사용하기 때문에 별도로 설치할 필요가 없어졌다.

 

Development Tools

소프트웨어 개발 과정을 돕기 위해 설계된 다양한 프로그램과 유틸리티를 의미한다. Android Studio Gradle, Android SDK, 다양한 플러그인이 여기 속한다.

안드로이드 스튜디오에 내장된 다양한 개발 도구들이 여기에 해당한다. 예를 들어, 코드 편집, 디버깅, 프로파일링 도구 등이 있으며, 안드로이드 앱을 개발, 테스트, 디버깅하는 필수적이다.

 

JRE란

JRE는  JDK(java development kit)의 구성요소의 일부이며 'Java Runtime Environment'의 약자로, '자바를 실행하기 위한 환경' 이다. 컴퓨터에 자바로 작성된 프로그램을 실행하려면, 그 프로그램을 이해하고 동작시킬 수 있는 환경이 필요한데 이 역할을 하는 것이 바로 JRE이다. , JRE 있어야만 우리의 컴퓨터는 자바로 작성된 프로그램을 동작시킬  있는 환경을 갖추게 된다.

그러나 안드로이드 개발 시에는 직접적으로 JRE 사용하지 않는다. 대신, 안드로이드 앱은 안드로이드 런타임(ART) 또는 이전 버전인 Dalvik 가상 머신 위에서 실행된다. 이들은 자바 가상 머신(JVM) 역할을 하며, 안드로이드 특화된 최적화와 기능을 제공한다.

 

JVM이란

Java 가상 머신으로, Java 바이트코드를 실행하는 가상 컴퓨터이다. JVM 덕분에 Java 프로그램은 작성하면 어떤 플랫폼에서도 실행될 있는 ' 작성하면 어디서나 실행(WORA)' 이점을 가진다.

안드로이드 개발에서는 JVM 대신 Dalvik 또는 ART(Android Runtime) 사용됩니다. 가상 머신들은 안드로이드 디바이스에서 앱을 실행할 중요한 역할을 하며, Java 코드를 실행하는 필요한 환경을 제공한다.

 

Java 클래스 라이브러리

자바 프로그램이 동작하는 데 필요한 기능들을 미리 만들어 놓은 것들 이다. 예를 들면, 파일을 읽어오는 기능, 네트워크 연결 기능 등이 이에 해당한다.

안드로이드 개발 사용하는 주된 클래스 라이브러리는 Android SDK 포함되어 있다. 라이브러리는 Java 클래스 라이브러리를 기반으로 하면서도, 안드로이드 특화된 API 클래스들을 제공하여, UI, 네트워킹, 데이터 저장 안드로이드 개발에 필요한 다양한 기능을 지원한다.

 

Java 클래스 로더

 자바 클래스 파일(*.class 파일)을 로드하고, JVM(Java Virtual Machine)에 링크하고, 초기화한다.

클래스 로더는 클래스가 프로그램에서 처음으로 참조될 때 해당 클래스를 메모리에 로드한다. 이 과정을 '동적 클래스 로딩'이라고 한다. 이이로 인해 자바 애플리케이션은 필요한 클래스만 메모리에 로드하게 되므로 메모리 사용 효율성이 향상된다.

자바 클래스 로더는 계층적이며, 세 가지 내장 클래스 로더가 있다.

  1. 부트스트랩 클래스 로더: JVM 시작될 코어 자바 클래스를 로드한다.
  2. 확장 클래스 로더: 확장 디렉토리에 있는 클래스를 로드한다.
  3. 시스템 클래스 로더: 시스템 클래스 경로에 있는 클래스를 로드한다.

안드로이드 앱을 실행할 , Java 클래스 로더는 앱의 .dex 파일(안드로이드 앱의 코드가 포함된 실행 파일)에서 클래스를 로드하는 사용된다.

 

JIT

JIT (Just-In-Time) 컴파일러는 Java 바이트 코드를 실행 시점에서 기계어로 변환하는 역할을 한다. 즉  ‘Just-In-Time’ 필요한 시점에'라는 의미를 가지고 있다. JVM이 Java 바이트 코드를 기계어로 해석하면서 실행하는 대신, JIT 컴파일러가 바이트 코드를 기계어로 미리 변환해두고, 이후 동일한 코드가 실행될 때는 미리 변환해둔 기계어를 사용한다.

이 방식의 장점은 빈번하게 사용되는 코드의 경우, 한 번 기계어로 변환해두면 이후에는 해석 없이 빠르게 실행할 수 있다. 즉, 실행 시점에서의 성능을 획기적으로 향상시킬 수 있다.

단, JIT 컴파일러의 작업은 CPU 리소스를 사용하므로, 컴파일에 필요한 시간과 리소스가 추가적으로 소요된다. 따라서 JIT 컴파일러는 프로그램의 실행 횟수와 복잡성 등을 고려하여 컴파일 여부를 결정하게 된다.

안드로이드 런타임(ART)에서는 JIT 컴파일러가 포함되어 있어, 앱의 실행 속도를 향상시킨다. 앱을 처음 실행할 바이트코드를 기계어로 컴파일하여, 앱의 성능을 최적화한다.

런타임(Runtime)

런타임이란 말 글대로 프로그램에서 실행되고 있는 동안의 동작을 말한다.

  1. JDK를 통해 바이트코드를 생성한다.
  2. 생성된 바이트코드를 JRE에 넘겨준다.
  3. JRE를 사용해서 바이트코드를 JAVA 명령어로 실행시킨다.
  4. 그러면 JVM이 실행시킨다.

JWM이란?

  • JVM이란 Java Virtual Machine 의 줄임말로, Java Byte Code 를 운영체제에 맞게 해석해주는 역할을 한다. 즉, 작성한 자바 프로그램의 실행 환경을 제공하는 자바 프로그램의 구동 엔진이다.
  • Java compiler 는 .java 파일을 .class 라는 자바 바이트코드로 변환시켜주는데 Byte Code 는 기계어(Native Code)가 아니므로 OS 에서 바로 실행이 되지 않는다. 이때 JVM은 OS가 Byte Code 를 이해할 수 있도록 해석해주는 역할을 담당한다.
  • JVM 메모리 관리도 담당한다. 이를 '가비지 컬렉터'라고 하는데, 가비지 컬렉터는 Java7부터 영역의 객체들을 관리하는 역할을 담당한다.

'Android' 카테고리의 다른 글

RecyclerView  (0) 2023.08.24