기존 안드로이드 프로젝트에서 free, paid Version 구성 또는 인앱 결제 모델, 구독 결제 모델을 나누는 방법으로 좋은 Flavor에 대해서 알아보겠습니다 ㅎㅅㅎ
Flavor란 무엇일까?
Flavor이란 Gradle에서 제공하는 옵션으로, Flavor를 통해 한 프로젝트에서 여러개의 빌드 버전을 생성할 수 있습니다. 필자는 안드로이드 개발 중 구독, 인앱 결제를 제외하고 같은 기능을 수행하는 프로젝트를 병합하기 위해 사용했습니다.
Flavor를 통해 여러 빌드를 생성하는 방법
applicationIdSuffix는 프로젝트 패키지 마지막에 설정될 이름을 설정할 수 있습니다. 이 옵션을 통해 구글 플레이에 각각 다른 패키지 명으로 앱을 추가할 수 있습니다.
manifestPlaceHolder는 AndroidManifest.xml 파일에 변수를 주입할 수 있습니다. 필자의 경우 앱 이름을 manifest에 앱 이름을 설정하는데 사용했습니다.
여기까지 설정되었다면 gradle Sync Now를 실행하면 아래와 같이 Build Variants에 Flavor 마다 Debug, Release가 생성된것을 확인할 수 있습니다.
그렇다면 각각 free, pro 버전을 분기하는 방법에 대해 알아보겠습니다.
만약 pro 버전과 free 버전을 나누는 부분이라면 pro 버전의 경우 광고가 표시되지 않고, free 버전의 경우 사용시 광고가 표시되는 등의 기능을 제외하고는 모두 같은 기능을 공유하게 될 것입니다.
제가 테스트했던 두가지 방법을 소개해드립니다.
1. 버전마다 디렉토리 생성 하여 클래스 파일로 분기하기
우선 프로젝트 구조를 Android 에서 Project로 변경합니다.
이후 디렉토리 구조를 위와같이 생성해줍니다.
build.gradle에 선언된 id와 같은 구조로 생성되어야 합니다. (이거때메 조금 헤매었음;;)
저는 free 버전을 main으로 사용하고, pro 버전을 새로 생성하여 테스트 했습니다.
pro버전의 AndroidManifest.xml 파일의 불필요한 코드를 제거해줍니다.
pro 버전이지만 패키지 이름이 com.hyeonwoo.free 인것을 주의해주셔야 합니다.
pro로 바꾸면 오류남여;
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hyeonwoo.free">
<application>
<activity android:name="com.hyeonwoo.pro.MainActivity">
</activity>
</application>
</manifest>
이후 각각 flavors에 따라 xml 파일에 표시되는 문자를 변경하여 테스트 해보시면 됩니다.
2. 하나의 소스코드로 BuildConfig에 따라 분기하기
분기할 코드의 양이 적다면 이 방법이 더 편리할 수 있어보입니다.
위의 디렉토리 구조 생성을 스킵하시고 build.gradle로 이동합니다.
flavorDimensions "version"
productFlavors {
free {
applicationIdSuffix ".free"
manifestPlaceholders = [appLabel: "free Version"]
buildConfigField "boolean", "PRO_VERSION", 'false'
}
pro {
applicationIdSuffix ".pro"
manifestPlaceholders = [appLabel: "[pro Version"]
buildConfigField "boolean", "PRO_VERSION", 'true'
}
}
buildConfigField를 사용하여 PRO_VERSION 이라는 boolean 타입 변수를 생성해줬습니다.
이제 한 액티비티에서 빌드 버전에 따라 분기할 수 있습니다.
package com.hyeonwoo.free;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (BuildConfig.PRO_VERSION) {
Log.d("MainActivity", "Pro Version");
} else {
Log.d("MainActivity", "Free Version");
}
}
}
빌드스크립트를 사용하시는 경우 각 빌드에따라 signingConfig도 설정하실 수 있읍니당 ㅎㅅㅎ
마지막으로 데모코드는 제 깃헙에서 확인하실 수 있습니다.
https://github.com/gogoadl/Android_FlavorsDemo
질문이나 추가하실 사항이 있다면 댓글남겨주세요!
'Android' 카테고리의 다른 글
[Android] ExoPlayer2 PlayerControlView가 일정시간 후 사라질 때 (1) | 2022.03.13 |
---|---|
[Android] 디버깅 중 크래시로 종료되었을 때 로그 보는법 (0) | 2021.11.23 |
[Android] Json to Kotlin 플러그인 사용하기 (0) | 2021.08.19 |
[Android Studio] 안드로이드 스튜디오 테마 변경, 외부 테마 적용 (1) | 2021.04.25 |
[안드로이드 스튜디오] 소프트키보드가 레이아웃에 영향을 줄 때 해결방법 (0) | 2020.08.31 |