[ 앱 개발자 도전기 : 안드로이드_코틀린 ]
안드로이드 빌드 과정(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역할.
-- 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
'App_Dev > Android : Kotlin' 카테고리의 다른 글
[ 앱 개발자 도전기 : 안드로이드_코틀린 ] 코틀린 기본 문법 훑어보기.-[1] (3) | 2024.11.12 |
---|---|
[ 앱 개발자 도전기 : 안드로이드_코틀린 ] Kotlin 특징 - 코틀린이란?? 왜 쓰는걸까?? (0) | 2024.11.10 |