태스크를 건너뛰게 된 배경

위 캡쳐된 이미지를 보면 총 빌드시간에서 특정 태스크(RealmAccessorsTransformer) 가 상당한 부분을 차지하는 것을 확인할 수 있다.

왜 그런지 구글링을 해봤더니 프로젝트를 AGP 8.0로 업데이트 한 이후에 Realm(모바일용 DB)에 포함된 Gradle 플러그인이 새로운 Transformer API 상에서 증분빌드를 지원하지 않아 프로젝트 코드 전체를 새로 빌드하다보니 시간이 많이 소요되는 것으로 확인되었다.

Realm에서 먼저 해결하지 않는 이상, 내가 해결 할 수 있는 이슈는 아니다. 하지만 빌드시간이 20분을 넘길 때가 부지기수라 생산성이 너무 떨어져버렸다. “Realm의존성을 걷어내고 Room을 써야하나?”, “Realm을 다른 모듈로 격리할까?” 뭐 하나 쉬운작업이 없다. 게다가 이 프로젝트에서 Realm을 쓰는 사람은 내가 아니라 다른 팀원이다.

내가 작업하는 부분에서는 Realm에 대한 의존성이 없으므로, debug 스테이지에서 앱을 빠르게 빌드할 수만 있다면 Realm을 의존한 다른 피쳐가 어떻게 되던 난 상관이 없다. 그래서 Realm과 연관된 태스크를 건너뛸 수 있도록 셋팅하기로 결심했다.

특정 태스크 건너뛰기

의외로 태스크를 건너뛰는 방법은 간단했다. 앱모듈의 build.gradle.kts에 다음과 같은 코드를 삽입하면 된다.

tasks.whenTaskAdded {
    if(name.contains("RealmAccessorsTransformer")){
        enabled = false
    }
}

특정 이름의 태스크를 비활성화함으로써 빌드시에 해당 태스크를 건너뛸 수 있다.
하지만 이렇게 변경한 코드를 develop 브랜치에 푸시한다면 다른이의 질타를 받을 수 있다. 나만의 환경에서만 해당 작업을 수행하도록 변경해보자.

local.properties에서 속성 읽기

local.properties 마지막 줄에 다음과 같이 원하는 이름으로 속성을 하나 선언한다.

# local.properties
skipRealmAccessorsTransformer=true

이제 build.gradle.kts 에서 다음과 같이 해당 속성을 불러올 수 있다.

// build.gradle.kts
...
tasks.whenTaskAdded {
    val skip: Boolean = gradleLocalProperties(rootDir)
        .getProperty("skipRealmAccessorsTransformer")
        .toBoolean()
    if(skip && name.contains("RealmAccessorsTransformer")){
        println("skipped ${this.name}")
        enabled = false
    }
}

이렇게 하면 내 개발환경에서만 skip값이 true이므로 해당 태스크를 건너뛰게 된다.

카테고리: etc

2개의 댓글

안드 · 2023년 11월 27일 10:31 오전

task 를 건너뛰었는데 빌드후 앱실행하면 정상동작 하나요?
궁금하네요…

    Charlezz · 2023년 12월 6일 4:59 오후

    포스팅 내용의 경우 정상동작하는 경우가 있는데, 이전 캐시를 참조하는 경우입니다.
    일반적인 상황에서는 태스크를 건너뛰는 것을 권장하지 않습니다.

답글 남기기

Avatar placeholder

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.