Android/Build(Gradle)

빌드 종속성 추가 : 수많은 라이브러리 파일들이 내 플젝 안에 없는 이유

네모메모 2023. 1. 27. 23:36
반응형

 

우리는 Android Studio의 Gradle 빌드 시스템을 사용하여

빌드에 "외부 바이너리 또는 기타 라이브러리 모듈을 dependencies(종속성)으로 쉽게 포함"할 수 있다. 

이 때문에 우리는 수많은 라이브러리들을 내 프로젝트에 추가하지 않아도 된다.

 

dependencies는 컴퓨터 또는 원격 리포지토리에 있을 수 있으며 이에 대해 알아보고자 한다.

 

 


Gradle이 가져오는 dependencies 구조

https://docs.gradle.org/current/userguide/dependency_management.html

 

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's Maven repository 속기 표기법
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

 

빌드 종속 항목 추가  |  Android 개발자  |  Android Developers

Android 스튜디오에서 Gradle 빌드 시스템을 이용하여 빌드 종속성을 추가하는 방법에 관해 알아보세요.

developer.android.com

https://docs.gradle.org/current/userguide/dependency_management.html#dependency_management_in_gradle

 

Learning the Basics

A common pattern, in multi-project builds, is that one project consumes the artifacts of another project. In general, the simplest consumption form in the Java ecosystem is that when A depends on B, then A would depend on the jar produced by project B. As

docs.gradle.org


이외에도 자신이 개발한 라이브러리도 업로드 할 수 있다는데 언젠가 꼭 해보고 싶다.

https://www.holaxprogramming.com/2015/07/29/android-deploy-to-jcenter/

 

자신이 개발한 Android Library를 JCenter Maven Repository에 업로드하기 · 안녕 프로그래밍

Overview 이 문서는 TOAST Cloud 의 상품인 IAP의 Android Library Project를 jcenter와 Maven central과 같은 표준 Maven Repository에 업로드한 과정을 정리한 문서입니다. 팀 내에서 사용하는 Maven Repository는 사내망으

www.holaxprogramming.com

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


[출처]

- jcenter deprecation

https://stackoverflow.com/questions/66651640/jcenter-deprecation-impact-on-gradle-and-android

 

- artifact

cf) https://developer.android.com/reference/tools/gradle-api/4.2/com/android/build/api/artifact/Artifacts

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 

 

반응형