본문 바로가기

안드로이드/자바

[안드로이드/Android] Flavors로 여러 버전별 빌드

반응형

안녕하세요. 오늘 포스팅은 'Flavors로 여러 버전별 빌드' 입니다.



개발중인 프로젝트를 테스트하는 과정에서 다수의 APK를 배포해야할 경우가 있습니다. 그런 경우 필드 값이나 flag 값을 변경해서 업데이트 후 테스트를 진행 했었는데 Flavors를 사용하면 더 간편하게 빌드할 수 있다는걸 알게되어 포스팅을 합니다. 



buildTypes


기본적으로 AndroidStudio에서 프로젝트를 생성하면 debug,release 2가지 버전의 빌드 버전을 생성합니다.

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

app레벨의 build.gradle에서 위와 같이 확인할 수 있습니다. debug 버전은 따로 명시되어 있지 않지만, 위와 같은 옵션들이 디폴트로 설정되어 있습니다. 

'minifyEnabled' 은 빌드시 불필요한 코드 및 리소스를 축소 시켜 apk의 용량을 줄여줍니다. 하지만 빌드시 시간이 오래걸리기 때문에 release단계에서 사용하는걸 권장합니다.  그리고 minifyEnabled는 프로가드 유/무를 뜻하기도 합니다.



productFlavors 이용하기


빌드 타입과는 다른 제품 버전을 설정할 수 있습니다. 제품 버전별 설정값을 다르게해서 똑같은 여러개의 앱을 빌드할 수 있습니다.

예를들어 광고의 유/무를 나타내는 필드 값을 다르게 설정해 광고가 있는 버전과 없는 버전을 나눠서 빌드하기 때문에 테스트시 용이합니다.

그리고 gradle에 defaultConfig의 모든 속성을 지원하기 때문에 버전 코드와 버전 이름도 다르게 지정할 수 있습니다.

productFlavors {
dev {
applicationIdSuffix ".dev"
versionCode 1
versionName "1.0.0"
buildConfigField "String", "url_base", "\"www.naver.com\""
manifestPlaceholders = [appLabel: "1번앱"]
}

ope {

applicationIdSuffix ".ope"
versionCode 1
versionName "1.0.0"
buildConfigField "String", "url_base", "\"www.naver.com\""
manifestPlaceholders = [appLabel: "2번앱"]
}

}

위 예시는 앱의 이름과 'url_base'이름을 가진 String 변수의 값을 이분화 시켰습니다.

applicationIdSuffix 속성을 이용하면 '설정패키지명. applicationIdSuffix' 으로 패키지명이 바뀌기때문에 2개의 앱을 생성할 수 있습니다.

  • applicationIdSuffix : 어플리케이션 아이디의 접미사
  • crunchPngs : 압축되지 않은 png 리소스를 줄인다. ( 릴리즈는 기본 true , 빌드시간 증가 ) 
  • debuggable : ( 해당 apk 디버그 가능 여부, 디폴트로 생성되는 debug release 단계중 debug true ) d
  • minifyEnabled : 사용하지 않는 자바 코드 제거 ( 디폴트 false , 릴리즈는 디폴트 true )
  • buildConfigField : buildConfig 파일에 새로운 필드를 추가합니다.


flavorDimensions 이용하기


제품 버전과 빌드 유형외의 더 많은 버전의 조합을 사용하고자 할때는 flavorDimensions 속성을 사용합니다. flavorDimensions을 사용하면 '차원'이라는 이름으로 buildType, productFlavors 과 더 많은 조합의 버전을 생성할 수 있습니다.

flavorDimensions 에 정의된 차원들을 구분하기 위해선 각 제품 버전에 dimension 속성으로 명시해서 구분해야합니다.


단, 안드로이드 스튜디오 3.0부터는 단일차원을 사용하더라도 flavorDimension을 명시해줘야 빌드시 에러가 발생하지 않습니다. 명시하지 않을 경우 에러가 발생합니다. Error:All flavors must now belong to a named flavor dimension. The flavor 'flavor_name' is not assigned to a flavor dimension.

flavorDimensions "flavors"
productFlavors {
dev {
dimension "flavors"
applicationIdSuffix ".dev"
versionCode 1
versionName "1.0.0"
buildConfigField "String", "url_base", "\"www.naver.com\""
manifestPlaceholders = [appLabel: "1번앱"]

}

ope {

dimension "flavors"
applicationIdSuffix ".ope"
versionCode 1
versionName "1.0.0"
buildConfigField "String", "url_base", "\"www.naver.com\""
manifestPlaceholders = [appLabel: "2번앱"]

}
}



빌드타입 선택


안드로이드 스튜디오 좌측 'Build Variants'를 선택하시면 빌드타입별 빌드가 가능합니다.




빌드타입 비생성


varianFilter를 사용해서 위 사진의 드롭다운 박스에 빌드타입을 비노출할 수 있습니다.

android.variantFilter { variant ->
def name = variant.getFlavors().get(0).name
def isDebug = variant.buildType.name.equals('debug')
//if (name1.equals('ignoredName1') && name2.equals('ignoredName2') && isRelease)
if (name.equals("flavors") && isRelease)
variant.setIgnore(true);
}


포스팅을 마칩니다.



참고자료

developer,flavors



해당 포스팅은 지극히 주관적인 내용으로 저자의 복기 목적으로 작성된 것이고, 내용에대해 수정이나 추가 요청은 언제든 환영합니다. 










반응형