티스토리 뷰

개발/ANDROID

Android Flavors

카렐 2018. 10. 1. 15:01


Flavors

프로젝트에서 몇가지 기능만 수정해서 따로 출시해야할 경우가 있다.

그럴때 프로젝트를 복사해서 2개 이상을 관리하지 않고 Android의 Flavors를 이용하여 간단하게 관리하는 방법에 대해 알아보자



productFlavors

build.gradle(app)에 productFlavors를 구현합니다.

android {
compileSdkVersion 28
defaultConfig {
applicationId "karrel.kr.co.myapplication"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

flavorDimensions "default"

productFlavors {
demo {
applicationIdSuffix ".demo"
versionNameSuffix "-demo"
}
full {
applicationIdSuffix ".full"
versionNameSuffix "-full"
}
}
}

위와 같이 productFlavors를 이용하여 applicationoId와 version의 후미의 표기를 변경할 수 있습니다.


그런데 저의 경우에는 productFlavors를 구현하면 아래와같은 오류가 발생하였는데, flavorDimensions "default" 라는 옵션을 주면 해당 오류를 해결 할 수 있습니다.


Caused by: org.gradle.api.GradleException: All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com/r/tools/flavorDimensions-missing-error-message.html

flavorDimensions "default"


이렇게 선언하고 알림 막대에서 Sync Now 하면 안드로이드 좌측 하단에 Build Variants에 아래와같이 선택할 수 있는 Flavors가 생깁니다.



변수 사용하기

buildConfigField 를 사용하여 코드상에서 빌드별로 분기처리 할 수 있습니다.

flavorDimensions "default"

productFlavors {
aType {
applicationIdSuffix ".a"
versionNameSuffix "-a"

buildConfigField "String", "appType", "\"A\""
}
bType {
applicationIdSuffix ".b"
versionNameSuffix "-b"

buildConfigField "String", "appType", "\"B\""
}
}

위와같이 buildConfigField에서 "타입", "변수명", "값" 을 지정해주면 코드상에서 아래와 같이 꺼내서 사용할 수 있습니다.

주의할 점은 String 형의 경우 값에 \" 를 추가해주어야 한다는것입니다.

private fun initFlavors() {
if (BuildConfig.appType == "A") {
text.text = "A 타입의 앱입니다."
} else if (BuildConfig.appType == "B") {
text.text = "B 타입의 앱입니다."
}
}

이렇게 소스상에서 분기처리를 할 수 있습니다.



manifestPlaceholder 이용하기

manifestPlaceholders 프로퍼티를 사용하면 AndroidManifest에 값을 입력시킬 수 있습니다.

아래와같이 구현합니다.

productFlavors {
aType {
applicationIdSuffix ".a"
versionNameSuffix "-a"
buildConfigField "String", "appType", "\"A\""
manifestPlaceholders = [appName: "Atype"]
}
bType {
applicationIdSuffix ".b"
versionNameSuffix "-b"

buildConfigField "String", "appType", "\"B\""
manifestPlaceholders = [appName: "Btype"]
}
}

appName: "Atype" 이라는 프로퍼티를 만들어서 선언하면

AndroidManifest에서 아래와같이 사용할 수 있습니다.

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="${appName}"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>


관련 샘플은 아래의 저장소에서 확인하실 수 있습니다.


참고사이트



minifyEnabled false 의 의미

build.gradle을 보다니 minifyEnabled에 대해서 궁금해졌다. 알아보자

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
  • 코드 축소
  • 빌드 시간을 느리게 하므로 디버그 빌드에서는 사용하지 말아야 한다.
  • 테스트에 사용되는 최종 APK에서는 코드 축소를 활성화하는 것이 중요하다.
참조



'개발 > ANDROID' 카테고리의 다른 글

안드로이드 투명 인디케이터 만들기  (0) 2018.10.17
fontFamily  (0) 2018.10.15
WIFI를 통해 기기 연결  (0) 2018.09.20
Android Context  (0) 2018.08.12
안드로이드 프로젝트에서 사용하는 .gitignore  (0) 2018.07.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크