Android

[Android] 안드로이드 프로젝트에 DFM 모듈 추가하기 (feat. 멀티모듈, Dynamic Feature Module)

NukeOlaf 2020. 8. 3. 22:09

현재 진행하고 있는 아재트 프로젝트는 멀티모듈 형태로 구성되어있다.

아재트 프로젝트의 기능(페이지) 별 feature 마다 모듈을 하나씩 추가하면서 만들고 있다. 안드로이드 스튜디오에서 아재트의 패키지구조를 보면 다음과 같이 구성되어있다. 여기에 "알림 페이지"모듈을 추가하려고 한다.

 

1.  새로운 모듈 추가하기

(1) File > New > New Module 로 들어간다.

File > New > New Module
Dynamic Feature Module 선택

그러면 모듈 타입을 설정하는 창이 뜬다. 상황에 맞게 모듈 타입을 설정하면 된다. 보통은 Android Library 타입을 가장 많이 사용하게 될 것 같다. Android Library 타입의 모듈은 재사용할 수 있는 코드를 (예를 들면 내 프로젝트의 다른 앱 모듈이나, 다른 프로젝트에서 import 하여 종속적으로 사용할 수 있는 코드) 위한 "컨테이너"를 제공하는 개념이다. 이 타입의 모듈은 어플리케이션에서 기본적으로 "constant"한 부분이다. 그러나 Dynamic Feature Module 은 Android Module 과는 조금 다르다. DFM 을 사용하면 Google play 의 Dynamic Delivery 기능을 통해 apk 에서 사용자가 그때그때 사용할 기능(feature) 별로 다운로드된다. 즉, 필요하지 않은 모듈은 앱 설치시에 같이 다운로드되지 않는것이다. 그렇게 되면 앱 설치 시 apk 의 모든 코드를 다운로드하지 않아도 되기 때문에 앱 사이즈를 줄일 수 있다. 내가 지금 추가하려는 알림 페이지 모듈도 Android Library 타입으로 만들 수 있지만, 지금은 Dynamic Feature Module 로 설정할 것이다.

 

(2) 모듈의 이름과 패키지 네임을 설정해준다.

Next 를 누르면 다음과 같은 화면이 나온다. 이 부분에서 모듈의 Base application module 을 설정해줄 수도 있다. 나는 app 모듈이 Base application 모듈이기 때문에 따로 설정을 건들이지 않았다. 다만, Minimun SDK 가 API 29 로 설정되어 있길래 API 21 로 바꿔주었다. 필요한 경우 언어를 Java 로 바꿀 수도 있다.

 

 

(3) DFM 의 다운로드 옵션을 설정해준다.

사용자들이 해당 DFM 의 기능을 사용해야할 때 보여질 수 있는 이름과, install-time 등을 설정해줄 수 있다. 보통 Moudle Title 은 Camel case 로 작성하는 것이 권장되지만, 아재트는 소문자로 Module name 과 똑같이 작성하고 있다. 나머지 옵션은 default 값이다. 

Finish 를 누르고 기다리면 alarm 모듈이 빌드된다.

 

3. Gradle 에 alarm  모듈 추가하기

(1) buildSrc 에 Alarm 모듈명 상수 추가

아재트는 BuildSrc 모듈(*참고 : Better Gradle Dependency Management, Kotlin(buildSrc 로 Dependency 관리하기)에서 Gradle Dependency 를 관리하고 있다.  Alarm 모듈을 features 라는 서브 디렉토리로 옮긴 뒤에 ":feature:alarm"이라고 작성해줬다. 이러한 방식으로 depedency 를 관리하지 않는다면, 그냥 ":features:alarm" 을 매번 작성해줘도 무방하다.

 

(2) settings.gradle.kts 에서 Alarm 모듈 include

settings.gradle.kts 파일은 루트 프로젝트 디렉토리에 있으며, 앱을 빌드할 때 포함해야하는 모듈을 Gradle 에게 알려준다. 멀티모듈 프로젝트에서는 최종빌드에 들어가야하는 각 모듈을 지정해줘야 한다.

아마 settings.gradle.kts 파일에 들어가보면 맨위에 자동으로 include 되어있을 것이다.

아래처럼 Alarm 모듈을 추가해준다. ":features:alarm" 이라고 적어줘도 된다.

 

(3) build.gradle.kts (:app) 의 android 블럭에 dynamicFeatures 에 Alarm 모듈 추가

app 모듈의 gradle 파일에도 Alarm 모듈을 추가해준다.

android {
    ...
    dynamicFeatures = mutableSetOf(
        ...
        BuildModules.Features.Alarm
    )
}

 

4. alarm 모듈 수준의 build.gradle.kts 설정해주기

alarm 모듈의 build.gradle 을 kts 로 바꿔서 사용할 것이다. 아재트 프로젝트는 Gradle Groovy DSL 대신 Gradle Kotlin DSL 을 사용하고 있다. 멀티 모듈 프로젝트와 Kotlin DSL 을 함께 사용하면 큰 시너지 효과가 발휘된다. 프로젝트에서 새 모듈을 만들때마다 기존 빌드 파일에서 많은 공통구성을 복사 붙여넣기할 필요가 없다고 한다. (참고 링크 : Multi-module Android project with Kotlin DSL for Gradle)

 

5. DFM 모듈 추가 완료

alarm 모듈이 추가되었다. 이제 추가한 모듈에서 작업을 진행하면 된다.