이것저것 다 개발

[Android] Flavor 사용하기 (빌드 변형 구성) 본문

Android

[Android] Flavor 사용하기 (빌드 변형 구성)

용용개발 2019. 1. 9. 20:57

Flavor을 이용한 1개의 소스로 여러가지 버전의 앱 만들기


projectFlavors 를 사용하면

기능은 같지만 이름만 다르게 한 앱, 무료/유료 버전의 앱을 구분, SDK 버전에 따른 앱이라던지

하나의 소스로 여러 버전의 앱을 만들 수 있습니다.


먼저 build.gradle(app) 파일에 flavor 설정이 필요합니다.

productFlavors {} 블록에 원하는 설정을 구성합니다.

defaultConfig 는 ProductFlavor 클래스에 속해 있으므로 모든 defaultConfig {} 블록 안의 기본 구성을 사용할 수 있습니다.

예) productFlavors {} 블록 내부에 versionCode를 명시하지 않아도 defaultConfig {} 블록의 versionCode를 사용함.


build.gradle 설정하기


아래는 free version과 paid version 두 가지 버전의 예시 입니다.

free {}  블록과 paid {} 블록을 만들어 각각의 설정을 추가합니다.


build.gradle(Module: app)

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.yongyi.flavor"
        minSdkVersion 19
        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 "version"
    productFlavors {
        free {
            dimension "version"
            manifestPlaceholders = [
                    appLabel: "Free-Flavor"
            ]
            applicationIdSuffix ".free"
            versionCode 10000
            versionName "1.0.0"
            buildConfigField "String", "EXPLAIN", "\"This is FREE-FLAVOR application\""
            resValue "string", "appName", "Free-Flavor"
        }
        paid {
            dimension "version"
            manifestPlaceholders = [
                    appLabel: "Paid-Flavor"
            ]
            applicationIdSuffix ".paid"
            versionCode 20000
            versionName "2.0.0"
            buildConfigField "String", "EXPLAIN", "\"This is PAID-FLAVOR application\""
            resValue "string", "appName", "Paid-Flavor"
        }
    }
}


위와 같은 설정을 마치고 나면 Build Variants의 달라진 점을 확인할 수 있습니다.

free version 과 paid version 의 각각의 Debug, Release가 생긴걸 확인할 수 있습니다.

App 빌드 시 선택해서 빌드하면 됩니다.


각각의 속성 설명


flavorDimensions 는 간략하게 설명하자면 빌드의 구분을 나타냅니다.

"api", "mode", "version" 등 api 버전에 따른 구분, 앱의 기능에 따른 구분, version에 따른 구분 등을 나타냅니다.

manifestPlaceholders 는 AndroidManifest.xml 파일에서 ${appLabel} 처럼 사용할 수 있습니다.

applicationIdSuffix 는 defaultConfig에 명시된 applicationId 뒤에 붙게 됩니다.

각각의 version의 ApplicationId 를 구분하게 해줍니다.

buildConfigField는 BuildConfig라는 클래스에서 호출할 수 있는 값입니다.

BuildConfig.##### 으로 사용합니다.

resValue 는 문자열 정의로 @string/##### 와 같이 사용할 수 있습니다.

strings.xml 파일에서 문자열을 정의해서 사용하는 것과 같습니다.


manifestPlaceholders 사용 예시


AndroidManifest.xml

android:label="${appLabel}"


BuildConfig 사용 예시


MainActivity.java

public class MainActivity extends AppCompatActivity {

    TextView tvVersion;
    TextView tvExplain;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvVersion = (TextView) findViewById(R.id.tv_version);
        tvExplain = (TextView) findViewById(R.id.tv_explain);

        tvVersion.setText(getAppVersion());
        tvExplain.setText(BuildConfig.EXPLAIN);
    }

    public String getAppVersion() {
        PackageInfo packageInfo = null;
        try {
            packageInfo = getPackageManager().getPackageInfo(this.getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        return packageInfo.versionName;
    }
}


결과물




Comments