이글을 작성하는 시점의 개발환경
- Android Studio Chipmunk | 2021.2.1 Patch 1
- AGP (Android gradle plugin) : 7.2.1
- Gradle Version : 7.3.3
- Gradle 파일 타입 : Groovy
계속해서 개발환경 버전이 올라가니 이 글은 참고하고,
어차피 공식문서를 봐야함.
// 서론
- 이 글을 쓰게 된 이유
skydove님의 pokedex 프로젝트를 공부하기위해서,
새로 프로젝트를 만들어서 옮겨 심는 작업을 하고 있는데
gradle쪽에서 모르는 문법들이 많아서,
도저히 라이브러리들 depenecies를 어떻게 가져오는지 모르겠다.
그래서 코드쪽은 아직 구경도 못했다...
이번에 gradle 관련하여 구글문서를 좀 읽어보았고, 정리하고자한다.
그런데 자세히 알려면 시간과 노력이 많이들기에,
야매와 선무당 코딩법을 적용하여 내 수준으로 알게끔 정리.
문장에 '?' 로 끝맺은것들은 내 추측이며,
정확하지 않은 내용이라서 대충 보기 바람.
// 공식문서 링크
--------------
(구글doc)
https://developer.android.com/studio/build
시간이 없으면
개요 읽고,
Gradle 도움말 및 레시피 읽고.
그 외에 필요한게 생기면 부분적으로 찾아보면 될 듯하다.
심심하면(?) 가볍게 다 읽어보시길.
---------------
(Gradle doc)
https://docs.gradle.org/current/userguide/userguide.html
여기 목차가 후덜덜한데,
Working with Dependencies - Learing the Basic 섹션에 주로 볼 것들이 있지 않을까?하는 추측
// 용어정리
공식문서 읽을때마다, 모르는 용어가 좀 튀어나오는데
이것도 야매로 정리.
Gradle
: 빌드를 자동화 해주는 도구.
android 빌드를 쉽게 만들어줌.
(*빌드는 내가 짜둔 소스코드들을 실행할 수 있는 파일들로 만드는 작업이다.)
-----------------
AGP (Android Gradle Plugin)
: gradle로 빌드할때,
gradle만으로는 부족해서?
android에 맞게 빌드 할 수 있도록..
거시기가 추가 되는 뭐시깽이?
........?
중요한건 AGP + Android Studio + Gradle 저 3가지가 호환되는 버전을 가져야함.
아래의 링크에서 호환되는 버전을 찾자.
( AGP와 Gradle버전의 호환성)
( AGP와 Android Studio 호환성)
-----------------
DSL (Domain-Specific Language)
: 도메인 특화 언어gradle에서 쓰는 블럭&문법들을 말하는듯? (이것들 또한 실제로는 메서드, interface인것 같던데...? )그리고 AGP와 연관이 있을수도?
구글 문서를 보면 Kotlin DSL이라는 용어를 kts(gradle kotlin파일)와 동일시하던데,그냥 gradle파일에서 쓰는 언어쯤으로 알고 있으면 될 듯 하다?
(여기 개요부분에서 DSL refence 링크를 찾아볼 수 있다.)https://developer.android.com/studio/releases/gradle-plugin
// 본론
-------------------------
// Groovy인가 Kotlin인가?
gradle파일 이름이
build.gradle이면 groovy타입(자바 계열?) 스크립트이고
build.gradle.kts (뒤에 확장자 kts가 붙으면) 코틀린 스크립트이다.
어떤 파일인지에 따라서
문법이 달라지니 인지해야한다.
-------------------------
// 기본적으로 생성되는 gradle관련 파일들 간략 설명
(구글 문서에서 개요를 읽어보시길)
- build.gradle (Project level) : 프로젝트 수준에서 적용될 빌드 설정
- build.gradle (Module level) : 모듈 수준에서 적용될 빌드 설정, 따로 추가한 모듈이 없으면 보통 app일것이다.
- gradle-wrapper.properties (Gradle Version) : Gradle에 대한 버전과 설정이 작성되어 있는듯하다?
- proguard-rules.pro (모듈app에 대한 프로가드 규칙) : 프로가드 설정을 더 추가 할 때 작성하는 파일?
- gradle.properties (Project Properties) : 속성파일 (프로젝트 수준에 적용될 옵션들을 넣는듯?)
- settings.gradle (Project Settings) : 프로젝트에 적용될 모듈 설정 및 remote저장소 관리
- local.properties (SDK Location) : 속성파일 (빌드 시스템의 로컬환경 속성을 구성, 특정 경로를 지정하는 등, version control system에 포함되지 않을 옵션들을 여기 보통 쓰는듯?)
-------------------------
저 위에 적힌 여러 파일중에서도,
build.gradle (Project level)
build.gradle (Module level)
settings.gradle (Project Settings)
위 3개의 파일들에 대해서 주석을 달아보았다.
기본으로 생성된 코드에 대해서 주석을 달았다.
훨씬 더 많은 기능이 있으므로, 필요 할 때 구글 문서를 읽어야한다.
// build.gradle (Project level)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// 프로젝트 최상위 레벨에 대한 gradle 설정 정보가 들어가는 파일이다.
plugins {
// 최상위 프로젝트에서는 아래 apply 옵션을 false로 둬야하고,
// 모듈부분에서는 이 apply옵션을 주지 않는다는듯함.
// apply옵션의 의미가 여기 써둔게 root project에 적용되는게 아니라?,
// 나중에 모듈들에 적용된다는것 같음. (여기는 그냥 쓸거 버전이랑 미리 적어둔다는 느낌??)
// 여기 있는 패키지명을 구글링하거나,
// https://mvnrepository.com/에서 패키지 명으로 검색해보면 라이브러리 이름을 알 수 있다.
id 'com.android.application' version '7.2.1' apply false // Android Application Gradle Plugin
id 'com.android.library' version '7.2.1' apply false // Android Library Gradle Plugin
id 'org.jetbrains.kotlin.android' version '1.6.21' apply false // Kotlin Android Plugin
}
// 빌드한거 클린할때의 디렉토리 위치라는듯.
task clean(type: Delete) {
delete rootProject.buildDir // 이 함수는 따로 변경 안되는듯?
}
// 이 블록에서 프로젝트 수준에서 특정 속성을 정의(definition)해서,
// 다른 모듈설정 파일에서 참조 및 공유가능.
ext {
// sdkVersion = 28
// 다른 모듈에서 엑세스 -> rootProject.ext.sdkVersion
// 문자열 안에서 엑세스 -> ${rootProject.ext.sdkVersion} 라고 쓰면 되네
}
--------------------
// build.gradle (Module level)
// 이 모듈에 적용할 플러그인들
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
// android 에 대한 구체적인 빌드 옵션
android {
// 컴파일할 sdk버전
compileSdk 32
// 모든 build variants에 대한 기본 셋팅
// -> 이게 buildType이랑, flavor의 차이점에 대해서도 알아야겠네.
// -> defaultConfig에 대한것들은 flavor에서 따로 override할 수 있다는듯.
// 또, 이후에 빌드되서 flavor+buildtype으로 조합된다는듯하다.
defaultConfig {
// 앱 게시 할때 사용할 고유id
// 웹뷰를 쓰면, 패키지명이랑 어플리케이션 id를 같이하는게 좋다는거 같네? 이것에 대한 이슈가 있는듯하다.
applicationId "com.example.pokedex_meltdown"
// 설치가능한 최소sdk
minSdk 21
// 테스트된 sdk버전
targetSdk 32
// 버전코드를 숫자로
versionCode 1
// 버전 네이밍을 유저 친화적으로 문자로.
versionName "1.0"
// 기본 계측 테스트(instrumentation test)로 지정
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
// instrumentation test시, applicationId를 따로 주는 옵션 -> testApplicationId
}
// 다양한 빌드 타입을 구성, 보통 debug, release를 둔다.
// debug는 따로 작성안해도 알아서 암시적으로 돌아간다는듯함.
buildTypes {
release {
minifyEnabled false // true로 두면 코드 축소됨.
// 프로가드 설정
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.5.1'
implementation 'com.google.android.material:material:1.6.1'
// implementation 앞에 prefix로 test, androidTest붙는거는
// prefix이름과 같은 해당 buildType에서만 dependency로 적용된다함.
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
----------------------------------------------------
// settings.gradle (Project Settings)
// Plugin 을 가져오는 저장소라는 것 같다?, 여기 레포지토리 적힌 순서대로 가져온다함.
//
// (아래 문서 참고)
// https://docs.gradle.org/current/userguide/plugins.html#sec:plugin_management
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
// app module level에 디펜던시들에 대해서 가져오는 저장소들?, 여기 레포지토리 적힌 순서대로 가져온다함.
//
// (아래 문서를 참고)
// https://docs.gradle.org/current/userguide/dependency_management.html#sub:centralized-repository-declaration
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) // 저장소에서 가져오는거 실패하면, 빌드 중단 되는 옵션인듯?
repositories {
google()
mavenCentral()
}
}
// 다른 잡다한 설정도 올 수 있는듯??
rootProject.name = "Pokedex-Meltdown"
// 빌드할때 이 프로젝트에 포함될 모듈들
include ':app'
-----------------------------------
추가적으로,
예전 gradle버전에서는
저장소 위치 가져오는 부분을 작성 할 때
build.gradle (Project level)파일에 아래처럼 작성을 했었다.
allprojects {
repositories {
google()
mavenCentral()
}
}
요즘 프로젝트를 생성해보면
settings.gradle에 따로 작성하는게 의아해서,
오픈채팅방에 질문 & 구글링을 해보니 (pluu님 감사합니다★)
gradle 6.8이 되면서 새로운 문법이 생겨서 적용된듯하다.
요즘 쓰는 이러한 방식이
centralized repository declaration이라고 한다.?
아래 블로그를 보니 안드로이드 스튜디오 북극여우부터, AGP버전 바뀌고, gradle버전 바뀌면서.. 바뀌었나보다?
https://ideajini.tistory.com/15
// 결론
- 나중에 제대로 알게되면 이 글이 자주 수정될 수 있음(?)
- groovy파일을 kts로 마이그레이션 해보기
- buildSrc는 뭐지
- 공식문서를 자주 봐야함.
// AGP가 뭔지 구글링하다가 찾은 글인데 ,
아래 링크가 내가 쓴 이 글과 비슷한 컨셉으로 작성되어 있던데,
참고하면 좋을듯 합니다.
https://zion830.tistory.com/156
'Android > Gradle' 카테고리의 다른 글
gradle ext(extra), buildSrc, libs.versions.toml 파일을 이용한 공통변수 사용 및 버전 관리하기 (0) | 2022.10.05 |
---|---|
[Android Gradle] Groovy에서 kts파일로 마이그레이션 하기 (0) | 2022.10.02 |