Android (안드로이드)

[Android] Build Variants (2) - 파생한 앱에 별도의 리소스 · 기능 적용하기

Oscar:) 2025. 2. 11. 21:00
728x90

 

 

 

 

지난 포스팅에서는 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에 대해 알아보았다.

 

앱을 파생하면 높은 재사용성으로 인해 손쉽게 여러 앱을 찍어낼(?) 수 있어서 상당히 편리했다.

 

 

 

728x90