App_Dev/Android : Kotlin

[ 앱 개발자 도전기 : 안드로이드_코틀린 ] 안드로이드 빌드 과정(Android APK build Process)를 이해해보기.

안다미로 : Web3 & D.S 2024. 11. 11. 16:21

 

 

 

[ 앱 개발자 도전기 : 안드로이드_코틀린 ]

 안드로이드 빌드 과정(Android APK build Process)를 이해해보기.

 

 


 

∇ 안드로이드 빌드 과정 : JVM 베이스 - > Dalvik.

목   차

1. 컴파일러(Compiler)란 무엇일까?
2. Android Build Process.

 

 


 

ⅰ. 컴파일러( Compiler )란 무엇일까?


  ◎ ' 컴파일러 ' 란

        특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램입니다.

 

             -- >> 컴파일러는 고급 프로그래밍 언어(Java, Kotlin) 를 "실행 프로그램"으로 만들기 위해서,

                            저급 프로그래밍 언어(어셈블리, object코드, 기계어 등) 로 바꾸는데 사용됩니다.

 

자바언어도 같이 컴파일하는 코틀린의 컴파일러 과정.

 

            

                  ∇   " .kt "    & " .java "  파일은 각각의 컴파일러에 의해서   " .class(바이트코드) " 로 변환 이후에

                                   " .jar " 로 패키징됩니다.

 

                          =>  "  .class  "  자바스 클래스 파일은  JVM에서 실행 가능한 자바-바이트코드를 포함하는 파일입니다.

                                    * Java-바이트코드  == JVM(Java Virtual Machine)의 명령어 세트.

 

 

 

                  ∇   JAR ( Java Archive, 자바 아카이브 )는 여러개의

                        자바 클래스 파일과, 클래스들이 이용하는 관련 리소스(텍스트, 그림 등) 및 메타데이터들을 

                        하나의 파일로 모아서,

                        자바 플랫폼에 응용 소프트웨어나 라이브러리를 배포하기 위한 소프트웨어 패키지 파일 포맷.

 

 

 

                  ∇   Kotlin runtime : 코틀린 자체 표준 라이브러리 클래스와  Java API 기능을 확장한 내용이 들어있습니다.

                               - 코틀린 컴파일러로 컴파일한 코드는, '코틀린 런타임 라이브러리'에 의존성을 가지기 때문에

                                      애플리케이션을 배포할 때는 코틀린 런타임을 넣어 같이 배포합니다.

 

                                   * JVM : 자바 바이트 코드를 플랫폼(윈도우, 맥, 안드로이드 등..)에서 독립적을 실행 가능토록 해줌.

                                   * JIT(Just-In-Time) 컴파일러

                                         : 런타임 시 바이트 코드를 원시-시스템-코드로 컴파일하여,

                                              Java애플리케이션의 성능을 향상시키는 런타임 환경의 컴포넌트.

 

 


 

 

ⅱ.  AndroidBuild Process


 

    ☆ Android build란?

 

        : " 소프트웨어 빌드 프로세스 " 는

               소스 코드를 사용자에게 배포할 수 있는 상태인 독립 실행형 결과물로 변환시키는 프로세스입니다.

 

            - Android 빌드 시스템은, 

                " 앱 리소스 및 소스 코드를 컴파일하고 개발자가 테스트, 구축, 서명 및 배포 " 를 할 수 있는

                     APK 또는 Android App Bundle(AAB)로 패키징합니다.

 

          ☆ 빌드의 결과물,

                    ⓐ App Project Build : 사용자에게 배포, 테스트 또는 출시할 수 있는 

                                                          앱의 디버그 혹은 출시 용 APK 또는 AAB를 생성합니다.

 

                    ⓑ Third Party Liberary Build

                           :  Android Archive 파일(AAR) 또는 Java Archive 파일(JAR) 라이브러리를 생성합니다. 

 

 


 

    ☆ Dalvik, ART

 

          - ' Android OS ' 를 탑재한 모바일 디바이스는 여러 제조업체에서 생산이 되며,

             각 제조사에서 사용하는 CPU는 서로 상이합니다.

 

                -- > arm,  x86 등등....  CPU 아키텍처에 독립적으로 자바 바이트 코드를 실행시키기 위한 JVM이 필요했습니다!

 

            -> 'JVM '을 사용하게 되면 다양한 유형의 CPU 아키텍쳐를 처리해야 하는 문제가 해결됩니다.

                 =>> 그렇지만,    JVM은 대용량 저장 공간과 전력을 갖추고 있는 시스템용으로 설계된 반면에 !

                              안드로이드 OS를 탑재하고 있는 모바일 디바이스는 메모리와 배터리 용량이 비교적 낮습니다.

                                === Google은 Dalvik라는 Anroid JVM ( " AVM " )을 채택했습니다.( Android 4.4(키켓) 까지)

                                === Google은 ART라는 Anroid JVM ( " AVM " )로 점차 변경 ( Android 5.0(롤리팝) 이후 )

 

 

 

             - Dalvik 바이트 코드가 포함된 단일 class.dex 파일로 변환을 하여 Android Run Time시 실행이 가능 !!

 

 


           § 빌드 과정 정리.

빌드 과정

 

             ∑ ApplicationModule.

 

                     √ Source code  :  src 폴더 속의 Java 및 Kotlin 파일.

 

                     √ Resource File  :  res 폴더에 있는 파일.

 

                     √ AIDL(Android Interface Definition Language) File 

                           : 클라이언트와 서비스가 IPC를 사용하여 통신하기 위한 프로그래밍 인터페이스를 정의.

                              [ *IPC(Inter-Process Communication) : 프로세스 간 통신  ]

 


             ∑ Dependencies.

 

                     √ Library Modules 

                          :  Java 또는 Kotlin 클래스, Android-component 및 리소스가 포함되어 있지만 Asset은 포함되지 않습니다.

                             라이브러리 프로젝트의 코드와 리소스는 애플리케이션과 함께 컴파일되고 패키징됩니다.

                                 == > 라이브러리 모듈은 컴파일 타임 Atrifact로 간주될 수 있습니다.

 

                     √ AAR Library 

                         :  'Android 앱 모듈에 대한 종속성' 으로 사용할 수 있는 AAR(Android Archive) 파일로 컴파일됩니다.

                              AAR 파일에는 Android 리소스와 매니페스트 파일이 포함될 수 있습니다.

                            + Java 또는 Kotlin 클래스 및 메소드 외에도 Layout 및 Drawable과 같은 공유 리소스도 묶을 수 있음.

 

                     √ JAR Library

                           : JAR는 Java 라이브러리이며, AAR과 달리, Android 리소스와 매니페스트를 포함할 수 없습니다.


 

 

             ∑ Compiler()  /   .dex로의 컴파일 프로세스 정리.

 

                  - javac( 자바 컴파일러 )

                  - Kotlinc( 코틀린 컴파일러 )

                  - AAPT2 ( Android Asset Packging Tool )

                  - R8, D8

                  - Proguard

 

      

                  ∇ javac ( 자바 컴파일러 ) , kotlinc( 코틀린 컴파일러 )

                      : 각각의   xx.java  //  xx.kt  파일들을 자바 바이트 코드로 변환시킵니다.

      

                  ∇ AAPT2(Android Asset Packging Tool)

                      : AndroidManifest 및 리소스 파일을 단일 APK로 컴파일합니다.

                      : AAPT2는 drawable 및 XML 파일과 같은 모든 Android Resource type의 컴파일을 지원.

 

               - 리소스 파일들은 해당 리소스 파일을 참조할 수 있는 'ID'가 부여되어 ' R.java ' 라는 클래스안에 담김.

                      + proguard-rules도 생성 가능.(≒보안화 과정)

 

                     == 컴파일 & 링크 두 단계로 구분.

 

                                 - 파일 하나만 변경된 경우 해당 파일 하나만 다시 컴파일하고 'link' 명령을 사용하여,

                                      모든 중간 파일을 연결하면 되므로 성능이 향상.

 

                                 - 링크 단계에서는, 컴파일 단계에서 생성된 모든 중간 파일(xx.flat)을 병합하고

                                                                  하나의 .apk 파일을 출력합니다.

 

 

                      *resources.arsc

                         : 지금까지의 과정으로 만들어진 .apk 파일에는 dex파일이 포함되어 있지 않고

                           signed되지 않았기 때문에 실행이 불가능한 APK 입니다.

 

                             APK에는 AndroidManifes, 바이너리 XML 파일 및 resources.arsc가 포함됩니다.

 

                           *resources.arsc에는 패키지에 있는 resource에 대한 모든 메타정보가 포함.

 

 

 

                  ∇ D8 and R8

                          - 안드로이드 스튜디오 3.1 부터 D8이 기본 컴파일러로 지정.

 

                     * R8 은 D8을 포함하고 있습니다.

                          : R8이 나오기전에는,  D8이 독립적으로 .class(자바 바이트 코드)를    .dex(DEX)코드로 변경.

 

                            **D8

                                  - 클래스 파일을 DEX 파일로 변환하는 dexer 역할

                                  - Java 8 기능을 Android에서 실행 가능하도록 바이트코드로 변환하는 desugar역할.

 

desugar

 

                                 -- Sugaring :   java.time을 사용할 수 있게 해주는 것

                                 -- Desugaring :   D8이 MinimumSdkVersion 보다 낮은 기기에서 해석 가능하도록

                                                                  .dex 코드로 변환시켜주는 것.

 

 

                            **R8

                                  -  dex 바이트코드를 더욱 최적화.

                                  -  최적화, 난독화, 사용하지 않는 클래스 제거와 같은 기능을 제거.

                                   - 코드를 분석해서 최종 APK 파일의 크기를 줄이는 최적화 진행.

                                   -  class.dex라는 하나의 DEX 파일을 출력합니다.

 

                         **Code 축소

                            소스 코드나 라이브러리의 코드에서 실제로 사용되지 않는 클래스들, 필드들, 메소드들, 속성들을 제거                                사용되지 않는 코드를 제거 하여 APK의 크기를 줄입니다.

 

                            또한, 1 개의 dex 파일에는 참조 라이브러리를 포함하여 적용 메소드 개수가 65,536개를 초과하면

                            빌드 오류가 발생합니다.

 

                              이를 방지하려면 애플리케이션의 종속성을 검토하고

                              R8을 사용하여 사용하지 않는 코드를 제거하거나 Multidex를 사용해야 한다.

 

 

 

                             **Resource 축소

                                  사용되지 않는 리소스들을 제거합니다.

 

 

 

 

 


             ∑ Signing the APK

 

                       - 모든 APK는 디바이스에 설치하거나 업데이트하기 전에 '디지털 서명'이 필요합니다.

 

 

 

 

                      √ 디버그(debug) 빌드의 경우 Android Studio는 실행할 때

                         Android SDK 도구에서 생성된 디버깅 인증서(debug certificate)를  사용하여 앱에 자동으로 서명합니다.

                            debug Keystore와 debug certificate는 자동으로 생성된다.

                                  + Gradle에 설정상 : zipAlig false

 


                     √  릴리스(Release) 빌드의 경우 키 저장소가 필요하며 키를 업로드하여 서명된 앱을 빌드합니다. 

                          apkbuilder를 사용하여 APK 파일을 만들고 cmd에서 zipalign을 사용하여 최종적으로 최적화하거나                                      Android Studio에서 '생성된 서명된 APK 옵션'을 사용하여 이를 처리하도록 할 수 있습니다.

                                  + Gradle에 설정상 : zipAlig true.

 

 

 

                     * keystore :    .keystore 혹은   .jks의 확장자를 가진 파일로, key를 반환합니다.

                               √ upload key : 플레이스토어에 앱을 등록할 때 사용되는 key

                               √ signing key : ,디바이스에 실제로 설치될 apk에 서명을 위해 사용되는 key