Gradle

Gradle은 안드로이드뿐 아니라 다양한 빌드에 사용할 수 있는 빌드 시스템입니다.

Gradle로 안드로이드 애플리케이션 파일(apk 파일) 빌드는 물론이고, 빌드 스크립트로 라이브러리 등의 의존관계나 설정을 관리할 수 있다. 또한 소스코드를 체크하는 등 다양한 일을 할 수 있다. 그뿐만 아니라 Gradle의 빌드 스크립트는 그루비라는 스크립트 언어로 빌드를 커스터마이징할 수 있다.

 

Gradle의 장점

다른 환경에서 똑같이 실행할 수 있다.

GradleWrapper라는 매커니즘이 있어 사용시 설정도니 버전으로 자동으로 셋업할 수 있다.

그러므로 프로젝트 팀 간이나 서버에서 같은 버전의 Gradle로 빌드를 실행할 수 있다.

의존관계를 기술할 수 있다.

Gradle의 빌드 스크립트 안에서는 한 줄만 써도 라이브러리 등을 추가할 수 있다.


Android Gradle Plugin의 특징 : 앱에 특화된 설정

앱의 버전을 기술하거나 빌드에 이용할 툴의 버전을 지정할 수 있다.

그 밖에도 빌드 변형(Biuld Variant) 기능으로 제품 특성에 따른 앱을 만들 수 있다.

예를 들어, 무료 버전과 유료 버전으로 앱을 만들거나 디버그 버전과 릴리스 버전에 따라 서로 다르게 동작하게 할 때 이용할 수 있다. 매번 코드를 변경할 필요가 없으므로 효율적으로 개발할 수 있다.

 

안드로이드의 Build 파일

프로젝트의 build.gradle (/build.gradle)

Gradle 파일에서 중괄호로 에워싸인 부분을 가리켜 '블록'이라고 부른다.

우선 buildscript 블록을 보면 빌드 시 Android gradle 플러그인을 이용하기 위한 설정이 들어간다.

  • repository 블록에서 Android Gradle Plugin은 jcenter의 리포지토리에 있으므로 jcenter를 리포지토리로서 지정한다
  • dependencies 블록에서 실제로 Android Gradle Plugin을 의존관계로서 기술한다. 
  • 또한 모든 프로젝트에서 jcenter의 리포지토리를 볼 수 있게 하고자 allprojects 블록에서 jcenter를 리포지토리로서 추가한다.
의존성(dependency)
코드에서 두 모듈 간의 연결.
객체 지향 언어에서는 두 클래스 간의 관계라고도 말함.
일반적으로 둘 중 하나가 다른 하나를 어떤 용도를 위해 사용함.

모듈의 build.gradle (/app/build.gradle)

빌드에 필요한 앱의 설정 등을 기술하는 빌드 스크립트이다.

프로젝트의 build.gradle에서는 Android Gradle Plugin은 의존관계에는 들어 있었지만 실제로 적용은 하지 않았는데

apply plugin: 'com.android.application'

위와 같이 기술함으로써 Gradle Plugin 으로서 Android Gradle Plugin을 이용할 수 있다.

 

android 블록은 빌드 시 이용할 설정이 기술 돼 있다. 

defaultConfig 블록에는 앱의 설정에 관한 사항이 기술돼 있다.

dependencies 블록은 의존하는 라이브러리를 기술하고 있다.

빌드에 필요한 앱의 설정 등을 기술하는 빌드 스크립트. 이 파일은 수정할 일이 아주 많다.

// 1번 Android Gradle 플러그인 적용
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: "androidx.navigation.safeargs.kotlin"

// 2번 Android Gradle 플러그인에서 이용되는 Android 블록
android {
    compileSdkVersion 28
    buildToolsVersion "29.0.1"
    
    // 3번 앱 자체의 설정
    defaultConfig {
        applicationId "com.avon.lv"
        minSdkVersion 20
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    dataBinding {
        enabled = true
    }
}

dependencies {
	// 4번 libs 디렉터리에 있는 jar 파일을 읽어온다.
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // 5번 의존관계
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.core:core-ktx:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.vectordrawable:vectordrawable:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

1번처럼 기술함으로써 Gradle 플러그인으로서 Android Gradle 플러그인을 이용할 수 있다.

2번은 Android 블록은 빌드시 이용할 설정이 기술돼 있다.

3번 defaultConfig블록에는 앱의 설정에 관한 사항이 기술돼 있다.

4번과 5번은 의존하는 라이브러리를 기술하고 있다.

4번의 fileTree에서 인수로 libs와 *.jar을 지정함으로써 libs 디렉터리에 있는 jar 확장자 파일을 가져와 의존관계로서 기술한다.

5번은 이용할 라이브러리를 Maven 리포지토리에서 가져와 이용한다. 그 밖에도 라이브러리를 늘리고 싶을 때는 이곳에 추가해서 이용할 수 있다.

프로젝트의 settings.gradle (/settings.gradle)

gradle에는 일반적으로 settings.gradle 파일이 있어야 한다.

include ':app', ':lib'

위와 같이 어떤 모듈이 있는지 기술한다.

 

위의 3개의 파일이 가장 자주 이용됩니다.

나머지도 알아두면 편리하므로 계속해서 살펴보겠습니다.

Gradle Wrapper 설정 (/gradle/wrapper/gradle-wrapper.properties)

Gradle에는 Gradle Wrapper라는 매커니즘이 있다. Gradle Wrapper는 앱을 빌드할 때 필요한 gradle이 설치돼 있지 않아도 Gradle Binary를 다운로드해서 설정합니다. 이로써 서버 상에 gradle이 설치돼 있지 ㅇ낳아도 실행할 수 있고, 팀으로 개발할 때 모두 같은 환경에서 빌드할 수 있습니다.

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip

distributionUrl 에서 다운로드할 gradle의 URL설정 등을 할 수 있지만 기본값으로 설정돼 있으니 기본적으로 편집할 필요는 없습니다.

 

proguard 설정 파일 (/app/proguard-rules.pro)

프로가드는 빌드 시 코드를 난독화하거나 최적화하는 도구입니다. 또한 빌드 시 사용하지 않는 메서드를 지워줍니다.

코드를 난독화하면 디컴파일해 apk로부터 소스코드를 쉽게 읽어내는 행위를 막을 수 있습니다.

안드로이드에서는 한 앱에서 메서드 수가 65,536개를 넘으면 Multidex라는 특수한 기능을 이용해야 하지만 그것도 프로가드를 이용하면 대개는 관련 오류를 피할 수 있습니다. 기본값은 주석뿐이고 아무것도 쓰여 있지 않지만 이곳에 프로가드로 난독화하지 않을 클래스 등을 지정할 수 있습니다.

 

그 밖에도 라이브러리를 설치할 때 '프로가드 설정에 추가하세요' 와 같은 내용이 있을 경우에 이 파일에 설정할 필요가 있습니다. 또한 디버그할 때는 잘 작동했는데릴리스 빌드일 때 빌드할 수 없거나 메서드를 찾을 수 없는 등의 충돌이 있을 때는 프로가드 설정을 의심해보세요.

 

Gradle 표준 프로퍼티 파일 (/gradle.properties)

gradle.properties에 기술하면 build.gradle에서 참조할 수 있게 됩니다.

 

gradle 표준 프로퍼티 파일(/gradle.properties)

testMessage=this is test!

build.gradle 파일 (/app/build.gradle)

println testMessage

위 와 같이 기술하고 앱을 빌드해보겠습니다.

 

앱을 빌드할 때 아래와 같이 표시되는 것을 확인할 수 있습니다.

 

SDK 위치를 지정하는 프로퍼티 파일 (/local.properties)

이 파일에 SDK 위치가 적혀있지만 이 설정보다도 안드로이드 스튜디오의 설정을 우선합니다.

그래서 SDK 디렉터리를 변경하고 싶을 때는 안드로이드 스튜디오의 설정에서

[Appearance & Behavior] -> [System Settings] -> [Android SDK]를 열어 변경합니다.

이 파일은 개발자마다 다를 수 있어 Git 등의 VCS(Version Control System)에는 포함하지 않도록 합시다.

 

 

+ Recent posts