일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 라이렌
- API
- mysql
- CodeIgniter
- CI3
- FCM
- 헬퍼
- 그누보드
- 코드이그나이터
- 옵션표
- codeigniter3
- phpDocumentor
- APK
- 웹 프로그래밍
- jquery
- config
- php
- 설정
- MSsql
- jw player
- 후크
- html
- 안드로이드
- 영카트
- Database
- javascript
- rairen
- ajax
- 함수
- function
- Today
- Total
프로그램 개발서
APK 버전 자동 관리하기 본문
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!")
}
}
'Web' 카테고리의 다른 글
[PHP] 연락처 형식 함수 format_phone (0) | 2019.05.02 |
---|---|
function 0.04 함수 모음집 (0) | 2019.05.02 |
rownum 데이터를 다시 정렬하여 rownum번호 사용하기 (0) | 2018.10.19 |
apk 파일 추출 - 커스텀 apk 파일명 빌드 (0) | 2017.12.31 |
[PageVisivilityAPI]브라우저 최소화 이벤트 (0) | 2017.10.26 |