Flutterで開発環境、本番環境の切り替え(Android)

2020-09-29
プログラミング

前提

## ローカル開発環境
$ flutter run --debug --flavor dev --dart-define=app.flavor=dev

## 開発環境ビルド
$ flutter build apk --debug --flavor dev --dart-define=app.flavor=dev

## 本番環境ビルド
$ flutter build apk --release --flavor prod --dart-define=app.flavor=prod

上記のコマンドで各環境を切り替えるようにする

  • --debug--release でbuild.gradleのsigningConfigsを切り替える
  • --flavor で build.gradleのproductFlavorsを切り替える
  • --dart-define=app.flavor でFlutter内のコードを切り替える

方法(Android側の設定)

key.propertiesの追加

  • debugのためのkey.propertiesdevelop.key.properties として、同じディレクトリに保存する
  • 上で追加したファイルを.gitignoreに追加(android/.gitignore)

android/app/build.gradle のファイルを修正

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

// debugためのdevelopKeystorePropertiesを追加
def developKeystoreProperties = new Properties()
def developKeystorePropertiesFile = rootProject.file('develop.key.properties')
if (developKeystorePropertiesFile.exists()) {
    developKeystoreProperties.load(new FileInputStream(developKeystorePropertiesFile))
}

– androidの中の設定項目

    defaultConfig {
        ...
        signingConfig signingConfigs.develop
    }
    signingConfigs {
        // --releaseの設定
        release {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
            storePassword keystoreProperties['storePassword']
        }
        // --debugの設定
        develop {
            keyAlias developKeystoreProperties['keyAlias']
            keyPassword developKeystoreProperties['keyPassword']
            storeFile developKeystoreProperties['storeFile'] ? file(developKeystoreProperties['storeFile']) : null
            storePassword developKeystoreProperties['storePassword']
        }
    }

    flavorDimensions "default"

    productFlavors {
        dev {
            dimension "default"
            applicationIdSuffix ".dev"
            versionNameSuffix ".dev"
       // アプリケーション名を変更したい場合
            resValue "string", "app_name", "名前(dev)"
            resValue "string", "facebook_app_id", "..........."
            resValue "string", "fb_login_protocol_scheme", "..........."
        }
        prod {
            dimension "default"
       // アプリケーション名を変更したい場合
            resValue "string", "app_name", "名前"
            resValue "string", "facebook_app_id", "..........."
            resValue "string", "fb_login_protocol_scheme", "..........."
        }
    }

    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }

android/app/src/main/AndroidManifest.xml の変更

  • 名前が直書きされている箇所を@string/app_name に変更
  • 他にapp_nameが定義されている場合(android/app/src/main/res/values/strings.xml)、コメントアウトする必要がある
    <application
        android:name="io.flutter.app.FlutterApplication"
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher">

google-services.jsonの各環境の切り替え

以下に開発環境、本番環境、それぞれのファイルを保存する。
– android/app/src/develop/dev/google-services.json
– android/app/src/release/prod/google-services.json

方法(Flutter側での切り替え)

--dart-define が以下のコード取得できるので、環境ごとに変更することが可能

const flavor = String.fromEnvironment('app.flavor');
if (flavor == 'dev') {
    ...
} else {
    ...
}