우리는 Android Studio의 Gradle 빌드 시스템을 사용하여
빌드에 "외부 바이너리 또는 기타 라이브러리 모듈을 dependencies(종속성)으로 쉽게 포함"할 수 있다.
이 때문에 우리는 수많은 라이브러리들을 내 프로젝트에 추가하지 않아도 된다.
dependencies는 컴퓨터 또는 원격 리포지토리에 있을 수 있으며 이에 대해 알아보고자 한다.
Gradle이 가져오는 dependencies 구조
Artifact (아티팩트) ?
도구나 예술 작품, 특히 고고학적 관심 대상과 같이 인간이 만들거나 모양을 부여한 항목에 대한 일반적인 용어
- 소프트웨어쪽에서는 "프로그래밍하는 동안 또는 실행 시 생성되거나 생성된 모든 것"을 일컫는다. (매우 광범위한 용어)
= '디자인 및 기능을 설명하는 데 도움이 되는 소프트웨어 개발의 부산물'.
= 프로세스에 관련된 사람들이 생성한 "사물".
- 생성된 모든 것을 총칭하므로 특정 형태 정해지지 않고 위 의미에 맞으면 모두 아티팩트라 칭할 수 있다.
ex) 설계 문서, 데이터베이스, 데이터 모델, 컴파일된 바이너리/소프트웨어 패키지, 워크플로 다이어그램, 테스트 매트릭스 및 계획, 설정 스크립트 등
- 소프트웨어 개발자가 전체 소프트웨어 개발 프로세스를 추적하는 데 사용할 수 있는 로드맵 역할을 해준다.
=> 즉, 일반적으로 다른 사람이 보고 공유할 수 있도록 누군가가 생성하고 공유 드라이브나 문서 리포지토리에 저장해야 하는 특정 필수 아티팩트 목록 중 원하는 아티팩트를 프로젝트로 가져와 사용하는 것이다.
Artifact 사용되는 예
- 안드로이드 스튜디오에서의 Artifact 는 프로젝트에서 app->build->outputs 폴더에 존재하는 부산물?들이라고 한다.
- 리포지토리를 사용하여 소프트웨어 Artifact 를 저장하고 적절하게 관리 및 유지 관리하며, 이 리포지토리는 로컬, 원격 또는 가상일 수 있다.
- 로컬 리포지토리 : 쉽게 액세스할 수 있는 사내 스토리지 시설
- 원격 리포지토리 : 일반적으로 타사 서버를 사용한 원격 외부 스토리지 시설. => 사용자가 아티팩트에 원격으로 액세스하고 저장할 수 있는 장점이 있다.
- 가상 리포지토리 : 동일한 대상 리포지토리에서 원격 및 로컬 Artifact 를 수용하도록 설계됨
cf) 안드로이드에 'Artifacts' 라는 인터페이스도 있다.
- 안드로이드에서 aritifact 찾다가 잘못 찾을 수 있는 'Artifacts'라는 이름의 interface가 있으니 헷갈리지 말자.
- Arrifact 인터페이스란?
- com.android.build.api.artifact.Artifacts
- 빌드 중에 Android Gradle 플러그인에 의해 생성되는 임시 또는 최종 파일 또는 디렉토리
Artifact repository (아티팩트 레포지토리)?
- Artifact 를 중앙에서 저장하고 dependencies 항목을 통합 Cloud 서버 환경의 일부로 빌드할 수도 있다.
- end-to-end 아티팩트 수명 주기 를 관리 하고 다양한 소프트웨어 패키지 관리 시스템 을 지원함
- CI/CD 워크플로 에 일관성을 제공함
- 대표적으로 'Google cloud artifact registry'가 있다.
그래서 안드로이드의 Gradle에선 어떻게 사용되는데?
Gradle에서 사용가능한 대표적인 공개 아티팩트 리포지토리는
Maven Central 및 Google's Maven repository 이 2가지가 대표적으로 사용된다.
( ※ 주의 : 2022년 2월 1일까지로 jcenter()는 Deprecated되었으므로 mavenCentral()로 사용하자! )
[사용법]
1. Gradle이 위 2가지 리포지토리용 속기 표기법을 제공하므로 gradle파일에 이를 명시한다.
- Maven Central 속기 표기법
mavenCentral()
google()
=> (build.gradle.kts 에 존재했으나) 최근 예제 플젝을 보면 settings.gradle로 선언 위치가 변경되었다.
settings.gradle.kts
pluginManagement {
repositories {
gradlePluginPortal()
mavenCentral() // Maven Central 속기 표기법
google() // Google's Maven Repository 속기 표기법
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google() // Google's Maven Repository 속기 표기법
mavenCentral() // Maven Central 속기 표기법
}
}
+) 특정 디렉토리(내 라이브러리)는 'Flat directory repository'을 사용한다.
- (플랫) 파일 시스템 디렉토리를 리포지토리로 사용하는 것
- 보통 프로젝트 내 libs 디렉토리를 만들고 이 디렉토리 내 라이브러리 파일을 포함시키는 방식으로 주로 사용한다.
- flatDir {} 로 표기
- 얘도 (build.gradle.kts 에 존재했으나) 최근 예제 플젝을 보면 settings.gradle로 선언 위치가 변경되었다.
settings.gradle.kts
pluginManagement {
repositories {
flatDir {
dirs("./libs")
}
}
}
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
flatDir {
dirs("./libs")
}
}
}
+) URL로 사용자 지정 repository 지정가능하다.
- 대부분의 엔터프라이즈 프로젝트는 인트라넷 내에서만 사용할 수 있는 바이너리 저장소를 설정하고,
사내 리포지토리를 통해 팀은 내부 바이너리를 게시하고 사용자 관리 및 보안 조치를 설정하고 가동 시간과 가용성을 보장할 수 있다.
- 위와 같이 써본 적은 없고 대표적으로 카카오 API에서 사용한 적이 있다.
- maven { url 'url주소' } 표기
settings.gradle.kts
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }
}
}
2. build.gradle.kts에 원하는 dependency를 추가한다.
- (앱 모듈단) build.gradle.kts 에는 3가지 유형의 dependencies로 포함가능하다.
(앱 단) build.gradle.kts
plugins {
id("com.android.application")
}
android { ... }
dependencies {
// 1) 프로젝트 내 라이브러리 모듈 사용하기
implementation(project(":mylibrary"))
// 2) 로컬 바이너리 사용하기
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
// 3) 원격 리포지토리의 바이너리 사용하기
implementation("com.example.android:app-magic:12.3")
}
[dependency 유형]
1) 프로젝트 내 라이브러리 모듈 사용하기
implementation(project(":mylibrary"))
- ※ 필수: 위의 'mylibrary'란 이름은 settings.gradle.kts 파일 내 include:에 정의된 라이브러리 이름과 일치해야 함
2) 로컬 바이너리(<아티팩트로 폴더, 파일 등) 사용하기
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
- Gradle은 프로젝트 디렉토리 내 JAR 파일에 대한 종속성을 선언한다.
- 아래처럼 개별 파일도 지정가능
implementation(files("libs/foo.jar", "libs/bar.jar"))
3) 원격 리포지토리의 바이너리 사용하기
implementation("com.example.android:app-magic:12.3")
- ※ 필수 : 원격 종속성 은 Gradle이 라이브러리를 찾아야 하는 적절한 원격 리포지토리 를 선언 해야한다. -> 위 '[사용법] 1번'참조
[동작]
위 사용법과 같이 Dependencies를 추가하면 아래와 같이 동작한다.
(1) Gradle은 settings.gradle.kts에 명시한 Repository Server에 원하는 라이브러리가 존재하는지 질의한다. (2) Dependency가 존재한다면 앱 단 build.gradle.kts 명시한 라이브러리의 경로를 조회한다. (주로 PACKAGE:ARTIFACT_ID:VERSION 의 형태) (3) Android Studio가 Dependency 파일들을 다운로드하고 컴파일한다. 끝! 이렇게 원격 라이브러리를 가져오게 된다. |
주로 사용하는 방식은 위와 같고 이 외 방식은 공식문서에 다양하게 나와있다.
https://developer.android.com/studio/build/dependencies
https://docs.gradle.org/current/userguide/dependency_management.html#dependency_management_in_gradle
이외에도 자신이 개발한 라이브러리도 업로드 할 수 있다는데 언젠가 꼭 해보고 싶다.
https://www.holaxprogramming.com/2015/07/29/android-deploy-to-jcenter/
[출처]
- jcenter deprecation
https://stackoverflow.com/questions/66651640/jcenter-deprecation-impact-on-gradle-and-android
- artifact
https://www.techtarget.com/searchsoftwarequality/definition/artifact-software-development
https://softwareengineering.stackexchange.com/questions/106473/what-does-artifact-mean
https://stackoverflow.com/questions/7130282/what-is-an-artifact
- Where to find/set up for 'Artifact' in Android Studio?
https://stackoverflow.com/questions/29356628/where-to-find-set-up-for-artifact-in-android-studio
- Dependency, Repository
- [공식][android] https://developer.android.com/studio/build/dependencies
- [공식][Gradle] https://docs.gradle.org/current/userguide/dependency_management.html
- [공식][Google's Maven Repository] https://maven.google.com/web/index.html
- [공식][mavenCentral] https://maven.apache.org/repository/index.html
- https://nittaku.tistory.com/57
- https://www.holaxprogramming.com/2015/07/29/android-deploy-to-jcenter/
- 카카오 : https://developers.kakao.com/docs/latest/ko/getting-started/sdk-android#apply-sdk-gradle