프로그램 개발서

APK 버전 자동 관리하기 본문

Web

APK 버전 자동 관리하기

rairen 2019. 3. 29. 18:18

APK 버전 자동 관리하는 것을 글로 남겨놓기위해 써보네요

 

우선 필요한 파일이 있습니다.

 

version.properties 파일인데요

 

이 파일 안에서 버전 값을 저장을 하면서 관리를 할 겁니다.

 

안드로이드 프로젝트에서 app폴더 안에 넣어주시면 됩니다.

 

 

이제 안드로이드 스튜디오에서 빌드 그레이들을 열어 봅시다.

 

열어보시면 

android { 로 시작하는 부분이 있습니다.

 

이부분 다음에 

def versionPropsFile = file('version.properties') //File 불러오기

생성해놓은 파일을 불러옵니다.

파일을 불러와서 해당 파일을 생성하지 않았다면 없을 수 있잔아요?

그러니 파일을 읽었는지 여부를 체크합시다.

 

if (versionPropsFile.canRead()) { //File Read 여부 체크

}

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

 

읽지 못했다면 버전 프로퍼티즈 파일을 읽지 못했다고 에러 뿜뿜 뿜어주시면 됩니다.

 

읽기 여부를 체크했으면 이제 변수를 지정해놓을 겁니다.

 

Properties versionProps = new Properties() //프로퍼티 객체에요!
versionProps.load(new FileInputStream(versionPropsFile)) // 객체에 프로퍼티 파일 내용을 써넣죠
def TYPE
def NEW_SEASON = 1
def SEASON = versionProps['SEASON'].toInteger()
def RELEASE = versionProps['RELEASE'].toInteger()
def DEBUG = versionProps['DEBUG'].toInteger()
def RECODE = versionProps['RECODE']
def runTasks = gradle.startParameter.taskNames

 

 

변수지정 했으면 이제 값을 정하면 됩니다.

 

if(":app:assembleRelease" in runTasks){
// Release 실행 시 Release Count +1
RELEASE = RELEASE + 1
TYPE = "RELEASE"
}
if (':app:assembleDebug' in runTasks) {
// Debug 실행 시 Debug Count +1
DEBUG = DEBUG + 1
TYPE = "DEBUG"
}
if(NEW_SEASON != SEASON){
// 시즌을 올리면
// 이전 시즌 마지막 버전 저장 후
// RELEASE, DEBUG를 새 시즌 초기화
RECODE = RECODE + "/${SEASON}.${RELEASE}.${DEBUG}"
SEASON = NEW_SEASON
RELEASE = 1
DEBUG = 1
}

 

릴리즈일때 빌드 타입은 릴리즈로 그리고 릴리즈 카운팅을 업합니다.

디버그일 때는 디버그에 맞춰서 하죠.

 

 

그리고이제 버전 프로퍼티즈 파일에 다시 써넣을겁니다.

 

// 변경된 값을 property 객체에 저장
versionProps['RECODE'] = RECODE
versionProps['SEASON'] = SEASON.toString()
versionProps['RELEASE'] = RELEASE.toString()
versionProps['DEBUG'] = DEBUG.toString()

 

객체에 넣었으면 넣은걸 파일에 써야합니다.

 

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

 

간단하죠?

 

그리고 버전코드와 버전이름을 설정을 해야 손을 건드리지 않고 APK만든것을 바로 업데이트 가능합니다.

 

versionCode RELEASE
versionName "${SEASON}.${RELEASE}.${DEBUG}"

 

버전코드는 릴리즈 버전을 올리므로 릴리즈 카운팅 숫자로 넣습니다.

버전명에는 다넣는거죠 ㅋ

 

그리고 APK를 만들었을 때 생성되는 경로를 조금 변경할 겁니다.

변경하지 않으면 만들어진 곳으로 찾아가기 귀찮아서 말이죠 하하하;

 

buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.jks
applicationVariants.all {
variant ->
variant.outputs.all {
output ->
def apkName = "${TYPE}-${SEASON}.${RELEASE}.${DEBUG}.apk"
output.outputFileName = new File(apkName)
}
}
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.jks
applicationVariants.all {
variant ->
variant.outputs.all {
output ->
def apkName = "${TYPE}-${SEASON}.${RELEASE}.${DEBUG}.apk"
output.outputFileName = new File(apkName)
}
}
}
}

 

디버그와 릴리즈 둘다 선언해주면 간단합니다.

선언해주면 app폴더에 debug폴더와 release폴더가 생기고

debug APK생성시 debug폴더에 생성되고, release APK생성 시 release 폴더에 생성됩니다.

 

 

이상으로 제가 APK 자동으로 버전을 관리하기위한 그레이들 소스 설명이였습니다.

 

나중에 제가 보든 누군가 보든 도움이 되면 좋겠네요.

 

===================================================================

2021.12.08

간만에 확인해서 수정하게 되었군요

aab파일로 생성시 release, debug 카운팅 올리는 방법

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

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

APK 는 릴리즈 시 테스크에서 ':app:assembleRelease' AAB는 ':app:bundleRelease' 가 진행됩니다.

if문에서 좌측이 apk 우측이 aab로 보시면 됩니다.

 

aab 파일명은 apk랑 작성위치가 다릅니다.

android {
	defaultConfig {
    	//aab 파일이 생성되는 명칭
        def aabName = "${UPDATE}.${versionRelease}.${versionBuild}.${versionPatch}.${versionRun}-Release"
        setProperty("archivesBaseName", aabName)
    }
}

android > defaultConfig 안에 작성해주셔야합니다.

 

아래는 aab파일 용 코드 추가 build.gradle 파일 코드입니다.

 

android {
    //File 불러오기
    def versionPropsFile = file('version.properties')
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    //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 IP
        if (':app:assembleRelease' in runTasks || ':app:bundleRelease' in runTasks) {
            versionRelease = versionRelease + 1
        }

        // Build만 할 경우 COUNT IP
        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)

        compileSdkVersion 28
        defaultConfig {
            applicationId "[앱 어플리케이션 아이디]"
            minSdkVersion 14
            targetSdkVersion 31
            versionCode versionRelease
            versionName "${UPDATE}.${versionRelease}.${versionBuild}.${versionPatch}.${versionRun} Release"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            //aab 파일이 생성되는 명칭
            def aabName = "${UPDATE}.${versionRelease}.${versionBuild}.${versionPatch}.${versionRun}-Release"
            setProperty("archivesBaseName", aabName)
        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }

        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                //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)

            }
        }

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

 

반응형