빌드 구성

안드로이드 빌드 시스템은 앱 리소스 및 소스 코드를 컴파일하고 개발자가 테스트, 구축, 서명 및 배포를 할 수 있는 APK 또는 Android App Bundle(ABB)로 패키징한다. 안드로이드 스튜디오는 빌드 툴킷은 Gradle을 사용하여 빌드 프로세스를 자동화하고 개발자가 유연한 맞춤 빌드 구성을 정의하도록 허용한다. 각 빌드 구성에서는 모든 앱 버전에서 공통되는 부분을 재사용하면서 자체 코드 및 리소스를 세트를 정의할 수 있다.

 

Gradle과 안드로이드 플러그인은 안드로이드 스튜디오가 설치되어 있지 않은 컴퓨터에서도 안드로이드 앱을 빌드할 수 있도록 독립적으로 실행된다.

 

빌드 프로세스

빌드 프로세스에서는 프로젝트를 Android Application Package(APK) 또는 Android App Bundle(ABB)로 변환하는 여러 가지 도구와 프로세스가 포함된다. 

 

안드로이드 앱 모듈의 빌드 프로세스

 

빌드가 되기 전에 직접 작성한 소스코드(Java, Kotlin), 리소스 파일들(drawable, layout 등 각종 xml 파일들) 그리고 AIDL(Service IPC definition) 파일들이 써드 라이브러리들의 소스코드, 리소스들이 각자 컴파일러를 통해 컴파일 되어 최종적으로 DEX(Dalvik Executable) 파일로 변환하고 그 외 모든 것은 컴파일 된 리소스로 변환된다. 이 과정을 세분화하면 다음 그래프와 같다

 

 

 

 

리소스: AAPT(Android Asset Packaging Tool)을 통해 컴파일되고 패키징 된다. AAPT2는 안드로이드 플렛폼에 최적화된 바이너리 형식으로 파싱하고 ID를 생성하여 컴파일한다. 컴파일 단계에서 파일을 파싱하면 확장자가 .flat인 중간 바이너리 파일이 생성된다. 링크 단계에서 AAPT2는 컴파일 단계에서 생성된 모든 중간 파일(리소스 테이블, 바이너리 xml 파일, 처리된 PNG파일)을 병합하여 단일 APK로 패키징한다. R.java(컴파일 단계에서 생성된 ID 값을 담는 클래스) 및 ProGuard 규칙 파일과 같은 기타 보조 파일도 이 단계에서 생성될 수 있다. 그러나 생성된 APK는 DEX 바이트 코드를 포함하지 않으며 서명되어 있지 않기 때문에 이 APK만으로는 배포를 할 수 없다. Android Gradle Plugin을 사용하여 명령줄에서 앱을 빌드하지 않는 경우 d8과 같은 다른 명령줄 도구를 사용하여 바이트 코드를 DEX 바이트 코드로 컴파일 하고 apksigner를 사용하여 APK에 서명할 수 있다.

 

소스코드: 자바나 코틀린의 소스 코드들은 각자 javac와 kotlinc라는 컴파일러를 이용해 자바 바이트 코드(.class)로 변환된다. 다른 라이브러리들은 JAR이나 AAR 파일 안에서 .class로 이미 변환된 상태로 존재한다.

 

R8&D8

D8은 안드로이드 스튜디오와 안드로이드 그레이들 플러그인에서 프로젝트의 자바 바이트 코드를 안드로이드 기기에서 실행되는 DEX 바이트 코드로 컴파일하는데 사용하는 명령줄 도구이다. R8이 등장하기 전에는 D8이 독립적으로 dex 파일로 컴파일 하는 역할을 했다.

https://proandroiddev.com/android-default-proguard-rules-guide-20058ba7a486

.class -> .dex 변환 과정

 

코드 축소(Code shrinking or three-shaking): 앱 및 라이브러리 종속 항목에서 미사용 클래스, 필드 메서드, 속성을 감지하여 안전하게 제거한다. 예를 들어 라이브러리 종속 항목에서 몇 개의 API만 사용한다면 축소는 앱이 사용하지 않는 라이브러리 코드를 식별하고 앱에서 그 코드만 제거할 수 있다.

 

리소스 축소(Resource shrinking): 앱 라이브러리 종속 항목의 미사용 리소스를 포함하여 패키징된 앱에서 사용하지 않은 리소스를 제거한다. 이는 코드 축소가 진행된 후에 진행되는 것이 유리하다. 왜냐하면 코드 축소가 끝난 다음에야 정확이 어떤 리소스들이 참조되어 사용될 지 판단 가능하기 때문이다.

 

난독화: 클래스와 멤버 이름을 줄여 DEX 파일 크기를 줄인다. 이는 코드 보안을 증진시키고 소스 코드의 길이를 줄임으로써 APK 크기 축소에 도움이 된다.

 

최적화: 코드를 검사하고 다시 작성하여 앱 DEX 파일의 크기를 더 줄인다. 예를 들어 주어진 if/else 구문의 else {} 분기가 전혀 사용되지 않음을 R8에서 감지한 경우 이 R8이 else{} 분기 코드를 삭제한다.

 

 

 

 

실제 apk 

cclasses.dex 파일은 디컴파일 할 경우 소스 코드를 확인 가능하다

res 폴더는 별도 변환 없이 프로젝트에서 사용되는 파일이 추가되어 있다.

 

 

참고

안드로이드 공식 가이드 문서

https://medium.com/mj-studio/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%96%B4%EB%94%94%EA%B9%8C%EC%A7%80-%EC%95%84%EC%84%B8%EC%9A%94-1-build-process-df6a69f73337

복사했습니다!