-
[Android Studio] Gradle 알아보기개발/Android 2021. 10. 15. 21:28
이 포스팅에선 Android Studio에서 경험하는 Gradle을 중점으로 다룰 것이다.
Android Studio를 하면 Gradle을 볼 수가 있다. 라이브러리를 추가할 때 Gradle을 건드리는데, Gradle은 무슨 기능을 할까? Gradle은 빌드 도구다. 그렇다면 빌드는 무엇인가? 빌드는 앱 리소스와 소스코드를 컴퓨터가 읽을 수 있는 바이트코드로 변환하고(컴파일), 이를 모아 실행파일(APK, AAB)을 만드는 과정이다. 프로젝트에 외부 라이브러리를 추가할 때마다 설정을 건드려주어야 한다. 이를 일일이 하기엔 시간이 많이 드니 이를 자동을 처리해주는 것이 빌드 도구다. 빌드 도구는 이런 라이브러리를 쉽게 추가해주며, 자동으로 업데이트도 해주고 설정하는 시간을 단축시켜주고 테스트까지 자동으로 하여 호환성까지 맞춰준다. 특히 라이브러리를 많이 쓰는 앱이나 웹 개발자는 빌드 도구를 쓸 줄 알면 개발 시간이 대폭 단축된다. Android Studio는 공식 빌드 도구로 Gradle을 채택하고 있다.
Android Studio의 첫 프로젝트를 만들었을 때, 처음 보는 파일들이 많다. 그중 많이 보이는 게 gradle인데, 각 파일들은 어떤 역할을 하고 어떤 내용을 가지고 있는지 알아보자. gradle의 디렉터리를 정리해보면
- gradle
- wrapper
- gradle-wrapper.jar
- gradle-wrapper.properties
- wrapper
- build.gradle
- gradlew
- gradle.bat
- settings.gradle
gradle 디렉터리에는 Gradle 환경을 정리한 Wrapper 파일들이 저장되어 있다. Wrapper 파일은 Gradle의 정보를 담고 다른 개발 환경에서 빌드 환경을 맞춰주어 Gradle 버전 미일치에 대한 오류가 나지 않게 만들어 준다.
gradle-wrapper.jar 파일은 명시된 Gradle 버전의 jar 파일이다.
gradle-wrapper.properties 파일은 Gradle의 path, Url 등이 저장되어 있다.
build.gradle 파일은 Gradle 기본 빌드 설정 파일이다. 의존성이나 플러그인 설정과 같은 내용이 저장되어 있다.
gradlew과 gradlew.bat 파일은 Gradle Wrapper 실행 스크립트다. gradlew는 Unix, Linux에서 실행되며, gradlew.bat은 Windows 환경에서 실행된다.
settings.gradle 파일은 앱을 빌드할 때 포함해야 하는 모듈들이 저장되어 있다.
의존성이라는 말이 나왔는데 A 클래스가 B 클래스를 사용할 때 A가 B를 의존한다고 한다. 외부 라이브러리를 쓸수록 이 의존성을 관리해줄 필요가 있는데 Gradle에 선언을 해놓으면 자동으로 의존성을 관리해준다.
Android 앱 모듈의 기본 프로젝트 구조(developer.android.com/studio/build) build.gradle에는 무엇이 있고 무엇을 할 수 있을까? 먼저 Android Studio의 build.gradle에는 (Project)와 (Module :app) 두 가지로 나뉘어 있는데 (Project)는 모듈에게 모두 적용되며 (Module :app)은 앱 모듈에만 적용된다. 보통의 안드로이드 프로젝트는 앱 모듈만 있다. 프로젝트를 처음 만들면 build.grade (Module :app)은 다음과 같다.
plugins { id 'com.android.application' } android { compileSdk 31 defaultConfig { applicationId "com.example.arduinorobotarmcontrol" minSdk 26 targetSdk 31 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { implementation('com.google.android.material:material:1.4.0') implementation 'androidx.appcompat:appcompat:1.3.1' implementation 'androidx.constraintlayout:constraintlayout:2.1.1' testImplementation 'junit:junit:4.+' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' }
컴파일이나 jar 파일 생성과 같은 작업들을 해주는 플러그인이 있으며 이런 플러그인을 적용할 때 plugins 블록 안에 넣어주거나 apply plugin: 코드를 쓴다. 기본적으로 'com.android.application'이 추가되어 있는데, Gradle용 안드로이드 플러그인이 안에 들어있다.
android 블록에는 안드로이드 전용 빌드 옵션들이 들어있다.
compileSdkVersion은 안드로이드의 API수준을 지정하여 해당 API 이하의 모든 기능을 사용할 수 있도록 한다.
defaultConfig 블록은 빌드의 기본 설정을 캡슐화하고 AndroidManifest의 일부를 동적으로 재정의할 수 있다.
applicationId는 고유 패키지명을 식별한다. 프로젝트를 생성하면 applicationId와 AndroidManifest의 package이름이 동일하다. 그래서 둘의 값이 같아야 한다고 생각할지 모르는데, applicationId는 실제 애플리케이션의 패키지 이름이고 AndroidManifest의 package는 소스코드에서 쓰이는 패키지 이름이다. 즉 둘이 달라도 아무 문제가 없다. 다만 어느 한 곳을 앱을 Google Play 스토어에 게시했다면 이 applicationId를 변경해서는 안된다. 완전히 다른 앱으로 취급하기 때문이다.
minSdk는 이 애플리케이션이 깔릴 수 있는 최소 API 버전을 말한다. 이 값보다 낮은 버전의 안드로이드는 이 앱을 설치할 수 없다. targetSdk는 앱이 설정된 API의 모드로 실행이 된다. 31 버전으로 컴파일을 하더라도 28을 타깃으로 설정했다면 28 방식으로 UI와 작동방식이 바뀐다. versionCode는 앱의 버전 번호를 정의하며 integer 값으로 넣는다. 이 값은 업데이트를 검사하는 용도로 쓰인다. versionName은 String의 형태이며, 유저에게 공개된다.
buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { applicationIdSuffix ".debug" debuggable true } } // https://developer.android.com/studio/build/build-variants?hl=ko#build-types
buildTypes 블록에는 release와 debug 두 가지 유형을 정의한다.
release 블록은 기본적으로 minifyEnabled와 proguardFiles를 지정하는데
minifyEnabled은 R8 컴파일러를 이용하여 미사용 코드와 리소스를 삭제하고 난독화와 코드 최적화 기능을 사용할 수 있게 한다.
proguardFiles는 ProGuard를 정의할 규칙들이 있는 파일을 가져온다.
debug 블럭은 디버깅 도구가 있으며 디버그 키가 서명되어 있다.
applicationIdSuffix는 애플리케이션 ID를 변경해준다. "com.example.project.debug" 형식으로 뒤에 붙는다.
debuggable은 사용자 모드로 기기에서 실행할 때에도 애플리케이션을 디버그 할 수 있는지 설정한다.
compileOptions 블록 안에는 컴파일할 Java JDK 버전이 들어있다.
dependencies 블록은 외부 라이브러리 모듈을 빌드에 종속 항목으로 넣을 수 있다.
implementation은 외부 라이브러리를 종목 할 때 쓰인다.
// 로컬 라이브러리 모듈 종속 항목 implementation project(':mylibrary') // 로컬 바이너리 종속 항목 implementation fileTree(dir: 'libs', include: ['*.jar']) implementation files('libs/foo.jar', 'libs/bar.jar') // 원격 바이너리 종속 항목 implementation 'com.example.android:app-magic:12.3' implementation group: 'com.example.android', name: 'app-magic', version: '12.3'
로컬 라이브러리 모듈 종속 항목 방법은 setting.gralde의 include:로 정의한 라이브러리 이름과 일치해야 하며. 앱을 빌드할 때 빌드 시스템은 라이브러리 모듈을 컴파일하고 컴파일된 콘텐츠를 APK에 패키징 한다.
로컬 바이너리 종속 항목 방법은 Gradle은 build.gradle 파일에 관한 경로를 읽기 때문에 프로젝트의 module_name/libs/ 디렉터리 내의 JAR 파일 종속성을 선언한다.
원격 바이너리 종속 항목 방법은 Gradle이 라이브러리를 찾아야 하는 적절한 원격 저장소를 선언해야 한다. 로컬에 라이브러리가 존재하지 않으면 빌드할 때 자동으로 원격 사이트에서 가져온다.
// Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { google() jcenter() mavenCentral() } dependencies { classpath "com.android.tools.build:gradle:7.0.2" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } task clean(type: Delete) { delete rootProject.buildDir }
build.gradle (project)의 코드는 다음과 같다.
buildscript 블록은 Gradle을 위한 repositories와 dependencies(의존성)을 추가한다.
repositories 블럭은 위에서 말한 원격 바이너리 종속 항목에서 로컬에 라이브러리가 없을 때 블록에서 지정된 원격 저장소에서 라이브러리를 찾는다.
여기서 dependencies 블록은 Gradle의 의존성을 다룬다.
Gradle은 코드들을 task로 묶어 task 단위로 실행한다. 직접 코드를 짜서 custom task를 만들 수 있다.
https://developer.android.com/studio/build?hl=ko
빌드 구성 | Android 개발자 | Android Developers
Android 빌드 시스템은 앱 리소스 및 소스 코드를 컴파일하고 개발자가 테스트, 구축, 서명 및 배포할 수 있는 APK로 패키징합니다.
developer.android.com
https://developer.android.com/studio/build/configure-app-module?hl=ko
앱 모듈 구성 | Android 개발자 | Android Developers
build.gradle에서 설정된 유용한 설정에 관해 자세히 알아보세요.
developer.android.com
https://developer.android.com/studio/build/dependencies?hl=ko
빌드 종속 항목 추가 | Android 개발자 | Android Developers
Android 스튜디오에서 Gradle 빌드 시스템을 이용하여 빌드 종속성을 추가하는 방법에 관해 알아보세요.
developer.android.com
https://developer.android.com/studio/build/build-variants?hl=ko
빌드 변형 구성 | Android 개발자 | Android Developers
빌드 변형을 구성하여 단일 프로젝트에서 여러 버전의 앱을 만드는 방법을 알아보세요.
developer.android.com
https://developer.android.com/studio/build/shrink-code?hl=ko
앱 축소, 난독화 및 최적화 | Android 개발자 | Android Developers
사용하지 않는 코드와 리소스를 삭제하기 위해 출시 빌드에서 코드를 축소하는 방법을 알아보세요.
developer.android.com
https://goateedev.tistory.com/133
Gradle Wrapper
IntelliJ에서 gradle 프로젝트를 생성하면, default gradle wrapper를 사용할 것인지 아니면 로컬 gradle 배포 버전을 사용할지 선택하는 화면이 나오는데, gradle wrapper 가 recommend 가 되어 있어 의식하지..
goateedev.tistory.com
https://galid1.tistory.com/194
Build Tool - 빌드도구란(Build Tool)
빌드도구란? - 소스 코드를 컴파일, 테스트, 정적분석 등을 실히하여 실행 가능한 애플리케이션으로 자동 생성하는 프로그램 - 계속해서 늘어나는 라이브러리 자동 추가 및 관리 - 프로젝트를
galid1.tistory.com
- gradle