DEV Community

Ajmal Hasan
Ajmal Hasan

Posted on

React Native: Multi-Environment/Flavour Setup (App Icon, App Name, GoogleService.json) in Android

When developing an application, developers often need to create multiple builds with different configurations to simplify maintenance and testing. Typically, three builds are created: development, staging, and production. In this case, we will focus on setting up both production and development environments, as staging will be similar to development.

Step 1:

Installing react-native-config

// yarn 
yarn add react-native-config && cd ios && pod install && cd ..
// or
// npm 
npm install react-native-config --save && cd ios && pod install && cd ..
Enter fullscreen mode Exit fullscreen mode

Step 2:

Create .env files for each configuration in project root directory:

i) .env.development

ENV=development
API_URL=https://api.dev.com
ANDROID_VERSION_CODE=1
ANDROID_VERSION_NAME=1.0
ANDROID_APPLICATION_ID="com.myapp"
Enter fullscreen mode Exit fullscreen mode

ii) .env.production

ENV=production
API_URL=https://api.com
ANDROID_VERSION_CODE=1
ANDROID_VERSION_NAME=1.0
ANDROID_APPLICATION_ID="com.myapp"
Enter fullscreen mode Exit fullscreen mode

ANDROID CONFIGURATION:

Step 1:

Go to android/app/build.gradle and add these:

//react-native-config
project.ext.envConfigFiles = [
    productionDebug: ".env.production",
    productionRelease: ".env.production",
    developmentRelease: ".env.development",
    developmentDebug: ".env.development",
]
// ---
apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"
//react-native-config
Enter fullscreen mode Exit fullscreen mode
    defaultConfig {
        applicationId project.env.get("ANDROID_APPLICATION_ID") // mentioned in .env files
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode project.env.get("ANDROID_VERSION_CODE").toInteger() 
        versionName project.env.get("ANDROID_VERSION_NAME")
        resValue 'string', 'build_config_package','com.myapp'
    }
Enter fullscreen mode Exit fullscreen mode
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
            matchingFallbacks = ['debug', 'release'] //react-native-config
        }
Enter fullscreen mode Exit fullscreen mode

Use applicationIdSuffix/applicationId which should be based on GoogleService.json's android_client_info.package_name if it exist

android {
    ndkVersion rootProject.ext.ndkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion
    compileSdk rootProject.ext.compileSdkVersion

....

        //react-native-config
    flavorDimensions "default"
    productFlavors {
        production {
            // Can be used as per requirement for different environments
            // minSdkVersion rootProject.ext.minSdkVersion
            // applicationId "com.myapp"
            // targetSdkVersion rootProject.ext.targetSdkVersion
            // resValue "string", "build_config_package", "com.awrostamani"
            // applicationId "com.myapp.myappprod"

            applicationIdSuffix ".myappprod"  // change as per googleservice.json's package_name, also add in package.json command
        }
        development {
            // applicationId "com.myapp.myappdev"
            applicationIdSuffix ".myappdev"
        }
    }
        //react-native-config

....
Enter fullscreen mode Exit fullscreen mode

Step 2:

Android Change App name,App Icon, GoogleService.json as per environment(if multiple):

Image description

In this setup, we copied the main folder and created a development folder where we modified the app icon and app name for the development environment. Additionally, we configured the GoogleService.json files based on the environment. For the debug and development builds, we used the development version of GoogleService.json, while the production version was placed in the main folder for production builds.


Step 3:

In package.json add these scripts:

  "scripts": {
...
cleanCache": "npm start -- --reset-cache",
    "start": "react-native start",
    "killAllBundler": "killall node",
    "adb": "adb reverse tcp:9090 tcp:9090 && adb reverse tcp:8081 tcp:8081 && adb reverse tcp:3000 tcp:3000",
    "installAll": "yarn && cd ios && pod install && cd ..",
    "cleanGitIgnoredFiles": "rm -rf .jso node_modules package-lock.json yarn.lock && cd ios && rm -rf build pods .xcode.env.local Podfile.lock && cd .. && cd android && rm -rf build && cd app && rm -rf build && cd .. && cd .. && yarn installAll",
    "setDevelopment": "ENVFILE=.env.development",
    "setStaging": "ENVFILE=.env.staging",
    "setProduction": "ENVFILE=.env.production",
    "aos:check": "react-native run-android --list-devices",
    "aos:dev": "yarn installAll && yarn setDevelopment  react-native run-android --mode=developmentDebug --appIdSuffix=myappdev",
    "aos:dev-release": "yarn installAll && yarn setDevelopment react-native run-android --mode=developmentRelease --appIdSuffix=myappdev",
    "aos:prod": "yarn installAll && yarn setProduction  react-native run-android --mode=productionDebug --appIdSuffix=myappprod",
    "aos:prod-release": "yarn installAll && yarn setProduction  react-native run-android --mode=productionRelease --appIdSuffix=myappprod",
    "aos:clean": "cd android && ./gradlew clean",
    "aos:DR-apk": "yarn setDevelopment &&  yarn aos:clean  && cd android && ./gradlew assembleDevelopmentRelease",
    "aos:PR-apk": "yarn setProduction &&  yarn aos:clean  && cd android && ./gradlew assembleProductionRelease",
    "aos:DD-apk": "yarn setDevelopment &&  yarn aos:clean  && cd android && ./gradlew assembleDevelopmentDebug",
    "aos:PD-apk": "yarn setProduction &&  yarn aos:clean  && cd android && ./gradlew assembleProductionDebug",
    "open-apk": "open ./android/app/build/outputs/apk/",
    "aos:dev-apk": "yarn aos:DD-apk && yarn open-apk",
    "aos:prod-apk": "yarn aos:PD-apk && yarn open-apk",
    "uninstallApks": "cd android && ./gradlew uA && cd ..",
    "aos:dev:release-apk": "yarn aos:DR-apk && yarn open-apk",
    "aos:prod:release-apk": "yarn aos:PR-apk && yarn open-apk"
...
}
Enter fullscreen mode Exit fullscreen mode

i) Run yarn aos:dev to run in emulator in development environment.
ii) Run yarn aos:dev-apk to make build/apk in development environment.
Similarly, you can check for all

Top comments (0)