프로그램 개발서

[안드로이드 스튜디오]APK, AAB 버전 자동 관리하기 본문

Android

[안드로이드 스튜디오]APK, AAB 버전 자동 관리하기

rairen 2021. 12. 13. 17:26

안녕하세요?

안드로이드 스튜디오에서 APK, AAB 파일 생성 시 자동 관리하는 방법에 대한 글입니다.

이전에도 작성을 했는데, 현재 수정이 되지 않아 정리하여 다시 작성을 하게되었습니다.

build.gradle 파일과 version.properties 파일을 이용하여 자동 관리를 할 겁니다.

 

우선 버전 정보를 기록할 파일을 준비합니다.

일단 /app 폴더 내에 version.properties 파일을 생성합니다.

그리고 버전 프로퍼티 파일 내에는 아래와 같은 코드를 작성합니다.

VERSION_BUILD=0
VERSION_RELEASE=0
VERSION_DATE=0
VERSION_RUN=0
VERSION_PATCH=0

이러면 버전 정보를 기록할 파일이 준비된 겁니다.

이후 빌드 그레이들 파일을 수정을 하면됩니다.

빌드 그레이들 파일에서 제일 하단에 아래 코드를 작성합니다.

static def getDate() {
    def date = new Date()
    def formattedDate = date.format('yyyyMMdd')
    return formattedDate
}

버전기록 일시를 위한 함수 입니다.

이제 파일 내에서 android { } 내에 코드를 작성할 겁니다.

코드는 아래와 같습니다.

 

    //File 불러오기
    def versionPropsFile = file('version.properties')
    
    //File Read 여부 체크
    if (versionPropsFile.canRead()) {
        def Properties versionProps = new Properties()

        versionProps.load(new FileInputStream(versionPropsFile))

        def UPDATE = 1
        def versionRelease = versionProps['VERSION_RELEASE'].toInteger()
        def versionBuild = versionProps['VERSION_BUILD'].toInteger()
        def versionPatch = versionProps['VERSION_PATCH'].toInteger()
        def versionRun = versionProps['VERSION_RUN'].toInteger()

        def runTasks = gradle.startParameter.taskNames

        // Release 할 경우 COUNT UP
        if (':app:assembleRelease' in runTasks || ':app:bundleRelease' in runTasks) {
            versionRelease = versionRelease + 1
        }

        // Build만 할 경우 COUNT UP
        if (':app:assembleDebug' in runTasks || ':app:bundleDebug' in runTasks) {
            versionBuild = versionBuild + 1
        }

        // Patch 날짜가 기존과 다를 경우 COUNT IP
        def versionDate = getDate()
        if(versionProps['VERSION_DATE'] != versionDate){
            versionPatch = versionPatch + 1
        }

        // 어떤 것을 행하던 무조건 COUNT UP
        versionRun = versionRun + 1

        versionProps['VERSION_RELEASE'] = versionRelease.toString()
        versionProps['VERSION_BUILD'] = versionBuild.toString()
        versionProps['VERSION_DATE'] = versionDate.toString()
        versionProps['VERSION_PATCH'] = versionPatch.toString()
        versionProps['VERSION_RUN'] = versionRun.toString()

        //update 된 설정값들을 다시 version.properties 파일에 쓰기
        versionProps.store(versionPropsFile.newWriter(), null)

        signingConfigs {
            release {
            }
        }

        compileSdkVersion 31
        buildToolsVersion "30.0.3"

        defaultConfig {
            applicationId "[앱 아이디]"
            minSdkVersion 16
            targetSdkVersion 31
            versionCode versionRelease
            versionName "${UPDATE}.${versionRelease}.${versionBuild}.${versionPatch}.${versionRun} Release"
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
            //aab 파일이 생성되는 명칭
            def aabName = "${UPDATE}.${versionRelease}.${versionBuild}.${versionPatch}.${versionRun}"
            setProperty("archivesBaseName", aabName)
        }

        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
        compileOptions {
            sourceCompatibility 1.8
            targetCompatibility 1.8
        }

        buildscript {
            repositories {
                // Check that you have the following line (if not, add it):
                google()  // Google's Maven repository
            }
            dependencies {
                // Add this line
                classpath 'com.google.gms:google-services:4.3.10'
            }
        }

        allprojects {
            repositories {
                // Check that you have the following line (if not, add it):
                google()  // Google's Maven repository
            }
        }

        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                output.outputFileName = "${UPDATE}.${versionRelease}.${versionBuild}.${versionPatch}.${versionRun}-Release.apk"
            }
        }

    } else {
        throw new GradleException("Could not read version.properties!")
    }

여기서 커스텀할 변수는 UPDATE 가 됩니다.

release 마다 VERSION_RELEASE 값이 1씩 오르고,

debug 마다 VERSION_BUILD , 작업일이 다르면 VERSION_PATCH가 오릅니다.

RUN은 무조건 1씩 오르게끔 되어있구요.

저는 UPDATE 변수를 대대적으로 앱이 변경 될 경우 사용하기위해 UPDATE 변수를 두었습니다.

표시하고싶은 버전정보가 있으면 추가적으로 추가도 가능하니 변경해도 무방합니다.

이전 글과 차이점은 아래 내용을 보시면됩니다.

 

변경 전

                //apk 파일이 생성되는 folder 및 파일이름
                def relativeRootDir = output.packageApplication.outputDirectory.toPath().relativize(rootDir.toPath()).toFile()
                def apkName = "${UPDATE}.${versionRelease}.${versionBuild}.${versionPatch}.${versionRun}-Release.apk"
                output.outputFileName = new File("$relativeRootDir/app/release", apkName)

변경 후

output.outputFileName = "${UPDATE}.${versionRelease}.${versionBuild}.${versionPatch}.${versionRun}-Release.apk"

 

ouput -> 안에 코드가 달라졌습니다

rootDir 값이 못가져오는 상황이 있어 경로까지 지정이 아닌 파일명만 변경하는 코드로 변경했습니다.

반응형