[Android Studio] Gradle 이란?

ideal dev·2023년 1월 17일
0
post-custom-banner

Gradle 이란?

작성한 소스 코드와 의존성 라이브러리를 묶어서 APK 등 배포할 수 있는 형태로 패키징 해주는 빌드 배포 도구(build toolKit) 입니다.

.gradle 파일은 JVM 동적 언어인 Groovy DSL(Domain Specific Language)을 사용해야합니다.

안드로이드 스튜디오에 적용

프로젝트를 생성하면, Gradle 파일들도 같이 생성되는 것을 볼 수 있습니다.
안드로이드 스튜디오는 코드의 편집만 할 수 있는 IDE(통합 개발 환경) 로,
별도의 빌드 배포 도구가 필요하기 때문에 채택한 빌드 배포 도구가 Gradle 입니다.
( 이외에 Ant, Maven 등이 있습니다 )
따라 안드로이드 스튜디오(IDE)와 빌드 시스템이 서로 독립적으로 실행된다는 것을 알 수 있습니다

안드로이드 스튜디오는 코드의 편집만을 담당하고,
빌드하여 패키징하는 과정은 모두 이 Gradle이 담당합니다.

때문에 간혹 안드로이드 스튜디오의 프로젝트 설정과 Gradle빌드 설정이 동기화되지 않아 스튜디오에서 에러로 표시하는 경우도 있습니다.


그림을 보겠습니다.
점선부분이 Gradle과 Android Plugin이 관리하는 부분입니다.
컴파일러는 소스코드를 dex파일로 변환하고, 그 외에는 컴파일된 리소스 형태로 변환합니다.
이를 모아 APK 등의 형태로 패키징하는 것 입니다.

  • 컴파일러는 소스코드를 DEX(Dalvik Executable) 파일로 변환합니다.
    - 여기에는 안드로이드 기기에서 실행되는 바이트 코드와 그 밖의 모든 것이 컴파일 된 리소스로 포함
  • APK Packager는 DEX 파일과 컴파일 된 리소스를 단일 APK로 결합
    - 앱을 Android 기기에 설치하고 배포하려면 먼저 APK에 서명해야 함
  • APK Packager는 디버그 또는 릴리즈 키 저장소를 사용하여 APK에 서명
  • 빌드 프로세스가 끝나면 외부 사용자에게 배포, 테스트 또는 출시하는데 사용할 수 있는 디버그/릴리즈된 APK 패키징 완료

(dex파일 : Android Runtime에서 궁극적으로 실행되는 코드가 포함된 파일, 기계어 )


코드 내부 구조

build.gradle(project)

  • 프로젝트의 모든 모듈에 적용되는 빌드의 구성을 정의
  • buildscript 블록 안에 프로젝트의 모든 모듈에 적용되는 항목을 정의
  • classpath와 같이 build.gradle (module)에서 사용할 플러그인의 환경을 정의

build.gradle(module)

  • 해당 build.gradle 파일이 위치해있는 특정 모듈에 해당 빌드의 구성을 정의
// 안드로이드 플러그인 사용을 gradle에 적용하는 것 (top-level에 선언되어야 함)
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

// 안드로이드와 관련된 빌드 설정
android {
    namespace 'com.sejin.recordwod'
    compileSdk 33 // 앱 컴파일 시 사용할 SDK 버전 지정

	// AndroidManifest.xml 에서 사용하는 설정들에 대해 동적인 옵션을 주고싶을 때, 이 블록 내에 포함
    defaultConfig {
        applicationId "com.sejin.recordwod"
        minSdk 24
        targetSdk 33
        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
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

// 라이브러리와 같은 의존성 추가 시 작성
dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.6.0'
    implementation 'com.google.android.material:material:1.7.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}

참고

https://developer.android.com/studio/build?hl=ko
https://uroa.tistory.com/64
https://velog.io/@twaun95/Android-Dependencies-관리-방법1

빌드배포도구
https://wangmin.tistory.com/50

post-custom-banner

0개의 댓글