공부를 하면서 정리를 한 것이라 정확한 건 Gradle공식 문서를 통해서 확인해 보시면 됩니다.
일반적인 Gradle의 사용보다는 익숙한 안드로이드 빌드과정을 생각해보자....
- cf. Gradle은 하나의 소프트웨어 빌드의 과정을 위함이 아닌 모든 소프트웨어 대상으로 한다.
1. 들어가기
Android Studio를 통해서 개발하면,
간단한 앱의 경우 코딩테스트를 하듯 자신이 원하는 Architecture와 구성으로 코딩하고
Emulator로 동작을 확인할 수 있다
내가 작성한 코드가 어떤 과정을 통해 앱으로 빌드된 걸까??
우리는 이 과정을 Gradle을 통해 자동으로 앱으로 빌드시켜준다
2. 앱 실행파일이 빌드되는 과정
빌드란?
코드로 작성한 kts, java, xml등의 파일들을 컴파일, assemble하여 하나의 AAB(Android App Bundle)로 만들어 배포하고
다운로드하는 사용자들은 AAB 중 필요한 부분을 APK형식으로 다운로드하여 사용을 하게 된다.
물론 다른 Android Library 소스코드를 인터넷을 통해 다운로드하는 과정도 있을 것이다.
위의 과정 (내 코드들을 하나의 aab파일을 만드는)이 Build의 한 기능이라고 볼 수 있다.
아래의 그림은 우리가 필요로 하는 APK 파일로 만들어지는(빌드되는) 과정이다.
작성한 코드(Source Code)로 DEX파일로 전환하고 APK로 묶어주게 된다.
외부에서 가져다 쓰는 Library는 JAR 또는 AAR형식으로
외부에서 다운로드 받아오고 해당 형식의 파일을 Compiler가 DEX파일로 변경시킨다.
JAR(Java Archive : 순수Java파일, 메타데이터 등)
AAR(Android Archive : Android 메니페스트 등 포함 가능 ex. Android Compose Navigation Library)
필요로 하는 JAR파일을 하나하나 다운로드하고 계층을 설정하고 CMD를 통해서 실행파일을 만드는 과정을 손수 하려면 그 과정을 익히는 것만으로도 앱의 내부 코드를 개발하기 전에 포기할 수 있다.
아니, 매번 앱을 확인하기 위해 같은 과정을 CMD를 통해서 한다고 하면 앱 확인하는데 시간 다 가겠다....
3. Gradle의 필요성
다행히도 우리에게는 Maven, Gradle이 있다.
이들은 프로그램을 만들 때 거쳐야 하는 빌드(압축, 생성, 계층화 등) 과정을 Task 등으로 정의하고 자동 빌드를 수행함
(A, B파일을 C폴더에 컴파일해서 저장하고... 등의 작업 Flow)
위의 Library에서 사용하는 JAR파일은 Setting.gradle을 통해 repository를 명시해주고
해당 repository에서 JAR파일을 다운받아온다.
(Dependencies설정으로 어떤 라이브러리를 가져올 것인가만 명시해주면 Gradle이 자동으로 적용해줌)
다시 한번 Android Build과정을 보면, 대부분의 앱은 위의 과정을 따라 빌드가 이루어지기 때문에 Android Developer에서 제공하는 잘 만들어진 Build과정을 내가 사용하기만 하면, 초보자들도 쉽게 한두 줄의 코딩으로도 Emulator에서 돌릴 수 있는 파일로 BUILD할 수 있게 된다.
정리하자면
1. 어떤 구성, 계층 등의 일정한 패턴을 따르는 소프트웨어 빌드 과정을 매번 실행하지 않고, 그 과정을 개발자 스스로가 정의하여 다음번 빌드 시에 같은 동작을 하도록 도와준다.
2. 공유 검증된 안드로이드 빌드 과정(Android 기준) 빌드 과정을 Plugin을 통해서 나의 프로젝트에 적용하여 해당 플랫폼에 맞는 실행파일을 쉽게 만들어 줌
이렇게 해서, 빌드를 관리하는 업무와 개발을 하는 업무가 분리될 수 있는 거 같다.
이런 빌드 과정은 사용하기에 따라 업무의 중복을 방지할 수 있다.
하나의 프로젝트에서 만든 여러 모듈 중에 필요한 부분만 압축하고(컴파일, 빌드하고), 앱 버전(릴리즈, 디버그 용 등)에 따라 다르게 빌드하는 등 폭넓게 사용.
위의 모든 과정을 Gradle을 통해서 환경설정을 해주고 명시를 해주는 것만으로 할 수 있다
4. Plugin 과 Dependency
가장 핵심은 TASK다.
Gradle은 Task를 정의하고 Plugin을 통해서 쉽게 재사용할 수 있다.
그러므로 Plugins에 'com.android.application', 'com.android.library'등을 사용한다는 말은 사용하려는 Plugin에 정의된 Task들을 사용한다는 말임.
Plugin : Build를 함에 있어서 필요한 Task를 가져옴. (Task Library의 느낌?이지만 간단히 사용의 기능도 있지만 이미 존재하는 Task의 확장 기능 또한 가능한 거 같은데?.. 좀 더 확인이 필요함)
Dependency : 간단히 말하자면 Library이다. 외부, 내부의 Library를 DependencyResolutionManagement에 정의된 maven 등의 저장소에서 Resolve 한다.
큰 차이는 Plugin의 경우 빌드의 과정이 정의되어 Build시에 사용할 수 있지만, Dependency의 경우는 단순히 경로에 JAR파일을 추가하는 역할을 할 뿐이다.
5. Gradle 공식 문서에 있는 Gradle의 기본사항
1) Gradle은 Build를 하기 위해 일반적으로 사용되는 툴이다.
제약 없이 Software을 빌드하기 위해 사용한다. Swift도 Plugins에 추가하여 ComplieTask를 할 수 있다고 한다.
(코틀린 멀티플랫폼의 빌드를 Gradle에서 지원하기 위해 엄청난 업데이트가 매번 있음)
2) 'Task'들의 집합으로 모델링 되어있다.
그래프처럼 각 Task를 사용해서 빌드 과정을 모델링을 할 수 있다.
그리고 이러한 Task들을 이미 만들어진 Plugin을 통해서 내가 사용할 수 있고, 직접 Groovy나 Kotlin을 통해서 스크립트를 작성하여 사용할 수 있다(하드코딩을 하지 않고 여러 모듈이나 프로젝트에서 공유하기 위함).
개인적으로는 위의 Plugin의 기능이 정말 주요한 기능 같다.
우리가 Android Studio를 통해서 앱을 빌드하는 과정은 거의 비슷하고, 이 과정이 Task로 묶여있으니,
오픈소스로 공유되는 Task들의 집합인 Android-application plugin만 내 프로젝트에 삽입하면 그 복잡한 과정을 하나의 Task로 실행할 수 있다.
Hilt를 떠올려 보자
Hilt를 적용할 때 Plugins을 추가하여 빌드 과정에서 필요한 TASK(아마도 Dependency 자동 주입을 컴파일 과정에서 진행하지 않을까?)를 추가한다.
Hilt Plugin을 추가하고 빌드를 실행하면 아래와 같은 TASK가 추가되어있는 것을 확인할 수 있다
> Task :app:hiltAggregateDepsDebug
> Task :app:hiltJavaCompileDebug NO-SOURCE
하지만, Compose 등의 일반적인 Depencies를 추가할 경우 Plugins를 추가하지 않는다. 그저 소스코드만 필요하기 때문이다
3) Gradle은 초기화 과정, 설정 과정, 실행 과정으로 구성되어있다.
Maven의 경우 Gradle에서 제공하는 Task 모델링 과정을 수행하기 위해서 수명주기가 존재한다.
하지만 Gradle은 위의 Task 모델링의 과정은 LifeCycleTask에 의해서 구조화된다.
(Gradle이 더 다양한 기능을 가지고 있다는 말)
잘 구성된 Build Script는 명령적인 논리보다는 선언적인 논리로 구성하여야 한다. (간단히 말해서 추상화가 이루어진 고수준의 언어로 사용해라는 말임, 예로 "버스 타고 가다가 야탑역에서 내려서 킥보드로 아파트까지 가서 엘리베이터 탄 뒤에 5층에서 내려라"가 아닌 "집에 가라"로 사용)
설정 과정에서 환경을 설정한 뒤 빌드가 실행된다고 하더라도,
빌드 실행 과정 중 환경설정 단계에서 알 수 없는 변화를 적용하기 위한 Task가 필요하다.(doFirst, doLast 등)
4) Gradle은 여러 방법을 통해서 확장 가능하다. (추후에 알아보도록 하자)
참조
https://stackoverflow.com/questions/16754643/what-is-gradle-in-android-studio
What is Gradle in Android Studio?
Gradle is a bit confusing to me, and also for any new Android developer. Can anyone explain what Gradle in Android Studio is and what its purpose is? Why is it included in Android Studio?
stackoverflow.com
[Gradle] Plugin이란 무엇인가? 플러그인 이해하고 Custom Plugin 만들기
Gradle Plugin이란? Plugin이란 Gradle Task의 집합이다. Gradle Task는 어플리케이션 빌드부터 테스트까지 다양한 작업을 수행하는 작업 단위를 뜻한다. *만약 Task에 대한 이해가 부족하다면 다음글을 참조
kotlinworld.com
https://developer.android.com/studio/build#settings-file
빌드 구성 | Android 개발자 | Android Developers
Android 빌드 시스템은 앱 리소스 및 소스 코드를 컴파일하고 개발자가 테스트, 구축, 서명 및 배포할 수 있는 APK로 패키징합니다.
developer.android.com
'gradle' 카테고리의 다른 글
3. Gradle Plugin 알아보기 (0) | 2024.08.22 |
---|---|
2. Gradle의 TASK 이해하기 (0) | 2024.08.16 |
3. Android Gradle Plugin Extend해보기 (0) | 2022.10.23 |
2. Gradle의 Plugin (0) | 2022.10.21 |
Gradle이란? (0) | 2022.09.25 |