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;
}
}
결과물
출처 : https://yongyi1587.tistory.com/42
'프로그래밍 > Android' 카테고리의 다른 글
[Android] Fragment에서 뒤로가기 (0) | 2023.01.15 |
---|---|
[Android] isNullOrBlank, isNullOrEmpty의 차이점 (0) | 2023.01.10 |
[Android] 앱 빌드후 자동으로 실행되지 않을때 해결법 (0) | 2023.01.05 |
[Android] MPAndroidChart 를 이용하여 Line Graph 만들기 (0) | 2022.12.30 |
[Android] SQLite 사용법 정리 (0) | 2022.12.29 |
댓글