지난 포스팅에서는 build.gradle 파일 수정을 통해 빌드 변형을 구성하는 방법을 알아보았다.
[Android] Build Variants (1) - 빌드 변형 구성으로 앱 파생하기 / ProductFlavors / BuildTypes
빌드 변형(Build Variants)을 구성하여 단일 프로젝트에서 다양한 버전의 앱을 빌드하는 방법을 알아본다. ✅ 빌드 변형을 구성하는 이유? 앱의 전체적인 구조와 기능들이 동일한 상황에
oscarstory.tistory.com
이제 파생한 앱마다 앱 이름, 아이콘, 기능 등을 다르게 적용해보자.
✅ 리소스 변경 적용하기
지난 포스팅의 예제를 진행했다면 위 처럼 2종류의 Flavor가 세팅되어 있을 것이다.
현재 어떤 Flavor를 선택했는지 기억하고, 안드로이드 스튜디오 좌측 상단의 탭을 [Project] 로 변경해주자.
그리고 [src] 폴더를 우클릭 → [New] → [Directory] 선택 후 각 Flavor의 이름대로 폴더를 2개 생성해준다.
'oscar' Flavor가 선택되어 있으므로 oscar 폴더에 "main" 이 표시되어 있는 것을 확인할 수 있다.
이제 각 폴더 하위에 [res] 폴더를 생성해주자.
🎈 앱 이름
[res] 폴더 하위에 [values] 폴더를 생성해준 뒤, strings.xml 파일을 생성해준다.
strings.xml (oscar)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">OscarApp</string>
</resources>
strings.xml (sam)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">SamApp</string>
</resources>
결과적으로는 다음과 같은 구조다.
각 Flavor 별로 values 리소스를 따로 관리하는 것이다.
매니페스트 파일에서는 앱 이름으로 strings.xml 리소스를 참조하므로,
2개의 앱에 각자 다른 이름이 적용되는 원리다.
AndroidManifest.xml
<application
...
android:label="@string/app_name"
>
결과)
Build Variants를 변경하며 각각 [Run] 하면,
이름이 다른 2개의 앱이 설치된 것을 확인할 수 있다.
🎈 앱 아이콘
아이콘도 마찬가지로, [res] 폴더 하위에 별도로 관리되는 파일을 생성해주면 된다.
이번엔 [drawable] 폴더를 만들고, 이미지 2장을 넣어서 실행해보겠다.
각자 다른 이미지 2개를 동일한 이름의 파일로 넣어야 한다.
그리고 매니페스트 파일의 icon 속성을 다음과 같이 변경해주자.
AndroidManifest.xml
<application
...
android:icon="@drawable/icon"
>
결과)
앱 마다 별도의 아이콘이 적용된 것을 확인할 수 있다.
🎈 기타 리소스
그 외의 리소스 모두 동일한 원리로 사용할 수 있기에, 별도 예제는 생략한다.
[values] 폴더의 colors.xml 파일을 이용하여 앱마다 다른 테마 컬러를 지정할 수도 있고,
[menu] 폴더의 바텀 네비게이션 파일을 이용하여 바텀 네비의 메뉴 목록을 다르게 사용할 수도 있다.
리소스 폴더를 관리하는 방식은 자주 사용하다보면 금방 익숙해진다.
✅ 동적 코드로 앱 별 기능 변경하기
이번에는 리소스가 아닌, 코틀린 파일에서의 기능 적용을 진행해보자.
MainActivty.kt
BuildConfig.APPLICATION_ID // 출력 : com.example.testapp.oscar
this.packageName // 출력 : com.example.testapp.oscar
this.resources.getString(R.string.app_name) // 출력 : OscarApp
액티비티 파일 기준으로 위와 같이 앱의 패키지명과 앱 이름을 확인할 수 있다.
정말 간단하게도 핵심은 현재 빌드된 앱을 식별하는 것이기에,
각자 상황에 맞게끔 더 편리한 방법으로 구분해주면 된다.
예를 들어, 패키지명을 기준으로 구분해준다면
button.setOnClickListener {
when (BuildConfig.APPLICATION_ID) {
"com.example.testapp.oscar" -> startActivity(Intent(this, OscarActivity::class.java))
"com.example.testapp.sam" -> startActivity(Intent(this, SamActivity::class.java))
}
}
동일한 버튼을 눌렀을 때 각자 다른 액티비티로 이동시킬 수 있다.
2차례의 포스팅에 걸쳐 Build Variants에 대해 알아보았다.
앱을 파생하면 높은 재사용성으로 인해 손쉽게 여러 앱을 찍어낼(?) 수 있어서 상당히 편리했다.
