build.gradle (보통 Module:app)으로 가서 직접 작성하거나
안드로이드 스튜디오 상단 툴바 메뉴에서
File → Project Structure → Build Variants
에 가면 설정이 가능하다.
< 소스 세트 우선 순위 > 왼쪽이 우선 순위가 가장 높음
빌드 변형 (build variant) > 빌드 유형 (build type) > 제품 버전 (product flavor) > 기본 소스 세트 (main source set) > 라이브러리 종속성 (library dependencies)
< Build Variants >
공통 : Build Types와 Flavors에서 공통적으로 설정할 수 있는 옵션
Application Id Suffix | |
Version Name Suffix | |
ProGuard Files | |
Matching Fallbacks | |
Signing Config | |
Multi Dex Enabled | |
Manifest Placeholders |
Build Types : 개발 과정에 따른 분리 (예 : 디버그 모드, 릴리즈 모드, 베타 모드 등)
Debuggable | |
Jni Debuggable | |
Renderscript Debuggable | |
Renderscript optimization Level | |
Minify Enabled | |
Zip Align Enabled |
Flavors : 동일한 앱의 서로 다른 버전 (예 : 유료앱, 무료앱, VVIP 등)
Dimension | |
Min SDK Version | |
Max SDK Version | |
Application Id | |
Target SDK Version | |
Resource Configs | |
Test instrumentation runner class name | |
Test instrumentation Runner Arguments | |
Test Functional Test | |
Test Handle Profiling | |
Test Application ID | |
Version Code | |
Version Name |
※ flavorDimensions
만일 flavor를 정의하고자 하면, 비록 1차원이라도 이녀석을 정의하는 것이 좋다고 한다. (안드로이드 스튜디오 3.0 이슈)
소스세트
리소스의 경우에는 flavor에서 지정한 resource와 main을 기준으로 resource가 병합된다. 그래서 병합할 데이터를 잘 설정해야 한다.
"도감" 관련된 앱을 만든다고 가정을 하고, 데이터는 Assets에 저장되어 있다고 하자. 1) flavor "과일" - 과일 데이터 2) flavor "채소" - 채소 데이터 3) main은 "종합 도감" - 과일데이터, 채소데이터
여기서 1번 과일 앱을 빌드를 하면, 과일 앱에서 채소 데이터가 보이게 된다. (반대로 2번도 상황이 비슷하다) 기본적으로 main과 resource가 병합이 되기 때문에 main이 가지고 있는 데이터도 같이 취급하게 되는 것이다. 이럴 때는 차라리 아래와 같이 설정하는 것이 좋다.
1) flavor "과일" - 과일 데이터 2) flavor "채소" - 채소 데이터 3) flavor "종합 도감" - 과일데이터, 채소데이터 4) main - 이 쪽에는 데이터를 두지 않는다.
이렇게 설정하면 main에 데이터가 없기 때문에 main과 병합이 되어도 문제가 없게 된다. (물론 sourceSets를 잘 설정해줘야한다.) |
코드(자바코드) 의 경우에는 병합이 되지 못한다. 만일 같은 클래스를 사용하고 싶다면 main에다만 소스코드를 남겨두거나, (상단의 접은 글의 방법처럼) main폴더에 소스코드를 없애고, 다른 flavor에서 각자 정의 하는 방법을 사용해야 한다.
※ BuildConfig.DEBUG issue
https://medium.com/@elye.project/checking-debug-build-the-right-way-d12da1098120
해당 포스트에 의하면 어플리케이션이 디버그 모드일지라도 BuildConfig.DEBUG 값이 항상 true을 반환하는 것은 아니라고 한다. BuildConfig가 어떤 패키지를 이용하는지 확인하거나 (라이브러리에 있는 BuildConfig를 가져오면 결과가 달라질수 있다.) 해당 포스트에서 제공하는 코드를 사용하면 된다.
boolean isDebug = ((getContext().getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0);
※ 참고 자료
GitHub (android best practices)
'Study > Java, Android' 카테고리의 다른 글
[Android] 귀찮은 것 정리 (0) | 2021.08.12 |
---|---|
[링크스크랩] Manage (or Hide) Api Key / 안드로이드 API 키 관리 (1) | 2019.06.13 |
Android Theme.MaterialComponents의 button 문제 (0) | 2019.04.10 |
안드로이드 스튜디오 단축키 (0) | 2019.02.12 |
Uri를 Intent로 전달 할 때... (0) | 2018.11.13 |