Android

무료앱 유료앱 2가지 버전 만들기! Flavors를 적용하기

SUMMIT-CORP 2020. 3. 29. 18:30

 

 

오늘 알아볼주제는 Flavors 입니다!

 

 

우선 Flavors란 무엇일까요?

 - Flavors란 소스코드는 대부분 일치하지만 다른앱을 만들고싶을떄 유용하게 사용됩니다.

   예를들어 내용은 같지만 앱아이콘은 다르게하고싶다던지 업로드하는 스토어에 따라 메인페이지를 다르게 띄운다던지, 유료앱과 무료앱으로 2개의 버전으로 배포를 한다던지 하는상황입니다..!

 

 

 

간단하게)

1. 유료앱/무료앱을 다르게 하고 싶은 경우

2. 배포하는 마켓에 따라서 표시하는 내용이나 값을 다르게 하고 싶은 경우

3. 고객용/관리자용 혹은 고객용/업체용 등으로 버전을 나누어야 하는 경우

4. 기획자가 개발,스테이징,운영 환경에 따른 각각의 앱동작을 확인하고 싶은 경우

5. 국가별/언어별로 앱의 내용을 달리 해서 보여주고 싶은 경우

 

가 있겠습니다.

 

 

 

유료앱 무료앱 생성으로 예를 들어보죠!

 

 

STEP 1.

< build.gradle (App) 전체 >

android {

    compileSdkVersion 29

    buildToolsVersion "29.0.2"

    defaultConfig {

        applicationId "com.test.flavors"

        minSdkVersion 19

        targetSdkVersion 29

        versionCode 1

        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }

    buildTypes {

        release {

            minifyEnabled false

            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

        }

    }

    flavorDimensions "versionCode"

    productFlavors {

        free {

            applicationIdSuffix ".free"

           versionCode 32

            versionName "3.0.2"

        }

        paid {

            applicationIdSuffix ".paid"

           versionCode 40

            versionName "4.0.0"

        }

    }

}

 

 

 

android { } 안에 아래 내용을 작성해줍니다.

   flavorDimensions "versionCode"

    productFlavors {

        free {

            applicationIdSuffix ".free"

            versionCode 1

            versionName "1.0.0"

        }

        paid {

            applicationIdSuffix ".paid"

            versionCode 2

            versionName "1.0.1"

        }

    }

 

flavorDimensions "versionCode" 라고 작성한 후 

productFlavors 안에 free{} 와 paid{} 로 나누겠습니다.

 

applicationIdSuffix ".free" 와 applicationIdSuffix ".paid" 라고 두가지를 작성합니다.

기존 applicationId 가 com.test.flavors 였다면,

com.test.flavors.free

com.test.flavors.paid

가 생성됩니다.

 

versionCode, versionName을 각각 설정해서 버전관리를 해주도록 합니다.

 

 

 

sync now를 하고나면 아래이미지처럼 Build Variants가 나뉘어짐을 확인할 수 있습니다.

 

STEP 2.

이제 유료앱 무료앱 구분을위해 변수를 추가해주겠습니다.

 

    flavorDimensions "versionCode"

    productFlavors {

        free {

            applicationIdSuffix ".free"

            versionCode 1

            versionName "1.0.0"

            buildConfigField 'boolean''IS_PAID'"false"

        }

 

        paid {

            applicationIdSuffix ".paid"

            versionCode 2

            versionName "1.0.1"

            buildConfigField 'boolean', 'IS_PAID', "false"

        }

    }

 

--> buildConfigField 'boolean', 'IS_PAID', "true or false"

로 설정하여 광고를 다는 코드쪽에서 구분할 수 있도록 변수를 만들어줍니다.

 

 

 

그러면 아래 코드처럼 변수를 사용할 수 있습니다.

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

 

        /**

         *  광고추가 예시

         * */

        if(BuildConfig.IS_PAID){

            // PAID true 이므로 광고제거

        }else{

            // 광고 추가

        }

 

    }

 

 

앱이름 변경은 어떻게하죠?

 

STEP 1.

    flavorDimensions "versionCode"

    productFlavors {

        free {

            applicationIdSuffix ".free"

            versionCode 1

            versionName "1.0.0"

            buildConfigField 'boolean''IS_PAID'"false"

            manifestPlaceholders = [ appLabel: "Flavor(무료)" ]

        }

        paid {

            applicationIdSuffix ".paid"

            versionCode 2

            versionName "1.0.1"

            buildConfigField 'boolean''IS_PAID'"true"

            manifestPlaceholders = [ appLabel: "Flavor(유료)" ]

        }

    }

 

--> manifestPlaceholders = [ appLabel: "Flavor(무료)" ]

처럼 해당 빌드를 할때 사용할 앱 네임을 설정해주고,

 

 

STEP 2.

    <application

        android:allowBackup="true"

        android:icon="@mipmap/ic_launcher"

        android:label="${appLabel}"

        android:roundIcon="@mipmap/ic_launcher_round"

        android:supportsRtl="true"

        android:theme="@style/AppTheme"

        tools:ignore="GoogleAppIndexingWarning">

        <activity android:name=".MainActivity">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

 

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

 

 --> android:label="${appLabel}"

로 설정해주면 됩니다..!

 

 

 

 

더 자세한 내용은

구글 공식 문서를 참고하시면 될꺼같습니다..!

https://developer.android.com/studio/build/build-variants?hl=ko