# Build 및 Flavor 세팅

# 목표

  • Dev 환경과 Prod 환경을 분리하여 환경 변수나 패키지 이름 등을 Flavor에 맞게 자동으로 설정 후 빌드

# 용어 정리

  • Debug : 핫 리로드가 가능하고 에뮬레이터에서 실행 가능한 빌드 모드
  • Release : 실제 기기에서만 실행 가능하고 스토어 게시용 빌드 모드
  • Dev : 개발 서버 환경
  • Prod : 실서버 환경
  • ex) Debug-Dev 환경 : 개발 서버를 활용하는 디버깅 모드 환경

# 사용법

# 기본 명령어 형태

  • flutter run|build (run이면 공백)|apk|appbundle|ios --debug|release --flavor dev|prod

# 실행 (Android Studio)

  1. Edit Configurations... 클릭

  1. 항목에 맞게 수정

  • Name : flavor에 맞게 작명
  • Dart entrypoint : main.dart
  • Additional run args : --debug 또는 --release
  • Build Flavor : dev 또는 prod

# 빌드

# Android (Dev 서버 Test용)

  • Debug-Dev : flutter build apk --debug --flavor dev

# Android (실서버 Test용)

  • Release-Prod(APK) : flutter build apk --release --flavor prod

# Android (실서버 스토어 제출용)

  • Release-Prod(Appbundle) : flutter build appbundle --release --flavor prod

# iOS

  • iOS는 XCode를 이용하여 빌드
  • Product - Archive 과정 통하여 dev와 prod에 맞게 빌드

# 빌드번호 및 버전

  • 빌드할 때마다 빌드번호를 수정하는 것이 좋음 (스토어 및 TestFlight 제출용은 반드시 수정, 그 외는 권장)
  • pubspec.yaml에서 수정 (iOS에서 반영이 안 될 경우 XCode에서 수동으로 수정)

# 주요 파일 및 설정 과정

# 공통

# config.dart

Config._internal() {
    PackageInfo.fromPlatform().then((PackageInfo packageInfo) {
      switch (packageInfo.packageName) {
        case "com.clnk.ios":
        case "com.clnk":
          isDev = false;
          isProd = true;
          _setProd();
          break;
        default:
          isDev = true;
          isProd = false;
          _setDev();
      }
    });
  }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • 패키지 이름이 com.clnk이거나 com.clnk.ios인 경우에는 실서버, 그 외는 개발 서버 설정
  • flavor dev로 빌드했을 경우에는 패키지 이름 뒤에 .dev가 붙음 (com.clnk.dev, com.clnk.ios.dev)

# Android

# app/build.gradle

{
    flavorDimensions "flavors"
    productFlavors {
        dev {
            dimension "flavors"
            applicationId "com.clnk.dev"
        }
        prod {
            dimension "flavors"
            applicationId "com.clnk"
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
  • 패키지 이름을 dev인 경우 com.clnk.dev, prod인 경우 com.clnk로 변경

# app/src/dev 및 app/src/prod, AndroidManifest.xml

<!-- Dev 환경 -->
<!-- app/src/dev/res/values/string.xml -->
<resources>
<string name="app_name">클링크-DEV</string>
<string name="deep_link"></string>
<string name="facebook_app_id">162540044397262</string>
<string name="fb_login_protocol_scheme">fb162540044397262</string>
<string name="facebook_client_token">4f8ca92787cab29bbaae96f265ce6985</string>
</resources>
1
2
3
4
5
6
7
8
9
  • 설정에 맞게 google-services.json과 string.xml 작성
<!-- app/src/main/AndroidManifest.xml -->
<meta-data
    android:name="com.facebook.sdk.ApplicationId"
    android:value="@string/facebook_app_id" />
<meta-data
    android:name="com.facebook.sdk.ClientToken"
    android:value="@string/facebook_client_token"/>
1
2
3
4
5
6
7
  • string.xml에 넣은 facebook_app_id와 facebook_client_token을 이용
  • dev 환경이면 dev 폴더의 string.xml이, prod 환경이면 prod 폴더의 string.xml이 적용됨

# iOS

# Configurations

  • XCode의 Runner Project - Info - Configurations에서 환경과 모드에 맞게 세팅

# Scheme

  • Product - Scheme - Manage Schemes에서 dev, prod라는 이름으로 스키마 설정

# Build Setting

  • Build Setting에서 패키지 이름이나 환경에 따른 변수들(User-Defined) 설정

# 참고

[Flutter] Flavor 를 이용한 개발, 운영 환경 설정 (opens new window)