프로젝트의 빌드넘버 자동증가 시키기

이번 포스팅에서는 프로젝트의 빌드넘버를 자동으로 증가시키는 법에 대해 알아보도록 하겠습니다.

버전넘버와 빌드넘버

버전넘버

소프트웨어의 기능이 변할때마다 그것을 구분하기 위해서 버전넘버를 사용하는데요, 일반적인 규칙은 1.0.0 과 같이 세자리로 결정을 합니다.

첫째자리는 뒤로 되돌릴 수 없는 수준의 큰 변경이 있을때, 둘째자리는 여러가지 새로운 기능이 추가되었을 때 증가를 시키고, 셋째자리는 기능이 추가되지는 않지만 버그가 수정되었을 때 증가를 시킵니다.

그래서 첫째자리는 메이저 버전, 둘째자리는 마이너 버전, 셋째자리는 패치버전이라고 하는 이름이 있습니다.

다만 이것은 꼭 지켜야 하는 규칙은 아니고, 날짜를 버전넘버로 사용하는 소프트웨어도 있습니다.

빌드넘버

빌드넘버란 어떤 버전을 출시할 때 여러번 반복해서 빌드를 할 때마다 숫자를 증가시키는 방법으로 사용하는 숫자인데요, 그러니까 버전넘버가 동일하다고 해도 여러가지 서로다른 빌드넘버를 가질 수 있습니다.

그래서 빌드를 수행할 때마다 어쨌든 변화가 있어야 되는데, 일반적으로는 증가시키는 형식으로 빌드넘버를 사용을 하구요, 보통은 이 빌드넘버를 일반 사용자가 알 필요가 없기 때문에 이걸 보여주지는 않지만, 개중에는 보여주는 소프트웨어도 있습니다. 윈도우같은 경우는 이 빌드넘버를 프로그램 안에서 확인할 수도 있습니다.

그런데 이 빌드넘버는 빌드를 수행할 때 하나씩 증가를 시켜야 하는데 안드로이드 스튜디오에서는 이걸 자동으로 증가시켜주지 않기 때문에 이 부분을 자동으로 증가시켜주는 기구를 프로젝트에 적용하는 법에 대해 설명하도록 하겠습니다.

프로그램 작성

app 레벨의 gradle에서 빌드넘버는 versionCode가 됩니다. 그래서 빌드를 한 번 할 때마다 versionCode는 증가가 되야 하구요, versionName은 기능 추가가 있을때마다 그때그때 개발자가 필요에 의해서 증가를 시켜주면 되겠죠.

1
2
3
4
5
6
android {
    defaultConfig {
        versionCode 1
        versionName "1.0"
    }
}

versionCodeversionName을 프로그램 안에서 표시할 수 있습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class MainActivity : AppCompatActivity() {
    private val versionNumber = BuildConfig.VERSION_NAME.replace("'", "")
    private val versionBuild = BuildConfig.VERSION_CODE
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        textView.text = "App Version: $versionNumber ($versionBuild)"
    }
}

하지만 verionCode를 빌드할때마다 증가시켜주는건 귀찮기 때문에 이 부분을 자동으로 증가시켜주는 기구를 만들어 볼 겁니다.

일단은 앱 안에 version.properties라는 파일을 만들고 이 파일 안에서 버전넘버와 빌드넘버를 관리할 겁니다.

1
2
VERSION_NUMBER='1.0.0'
VERSION_BUILD=1

그다음은 app 레벨의 gradle에서 version.properties에 있는 값을 불러와서 빌드넘버를 1 증가시키고 그걸 저장하는 코드를 작성합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
android {
    // 저장된 값을 불러오는 부분
    def versionPropsFile = file('version.properties')
    def versionBuild
    def versionNumber
    if (versionPropsFile.canRead()) {
        def versionProps = new Properties()
        versionProps.load(new FileInputStream(versionPropsFile))
        versionBuild = versionProps['VERSION_BUILD'].toInteger()
        versionNumber = versionProps['VERSION_NUMBER'].toString()
    } else {
        throw new FileNotFoundException("Could not read version.properties!")
    }
    
    // 읽어온 빌드넘버를 증가시키는 부분
    ext.autoIncrementBuildNumber = {
        if (versionPropsFile.canRead()) {
            def versionProps = new Properties()
            versionProps.load(new FileInputStream(versionPropsFile))
            versionBuild = versionProps['VERSION_BUILD'].toInteger() + 1
            versionProps['VERSION_BUILD'] = versionBuild.toString()
            versionProps.store(versionPropsFile.newWriter(), null)
        } else {
            throw new FileNotFoundException("Could not read version.properties!")
        }
    }
    
    // 함수를 실행시키는 부분
    gradle.taskGraph.whenReady { taskGraph ->
        if (taskGraph.hasTask(assembleDebug)) {
            autoIncrementBuildNumber()
        } else if (taskGraph.hasTask(assembleRelease)) {
            autoIncrementBuildNumber()
        }
    }

    compileSdkVersion 29

    // 수정한 내용을 앱에 반영해 줌
    defaultConfig {
        applicationId "com.example.autobuildnum"
        minSdkVersion 21
        targetSdkVersion 29
        versionCode versionBuild
        versionName versionNumber

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
}

이제 빌드를 할때마다 빌드넘버가 자동으로 증가하게 됩니다.

Built with Hugo
Theme Stack designed by Jimmy