Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Different app names for different build flavors in Android?

I have 2 build flavors, say, flavor1 and flavor2

I would like my application to be named, say, "AppFlavor1" when I build for flavor1 and "AppFlavor2" when I build for flavor 2

Here is a my manifest source's snippet

<application
    android:name=".PApplication"
    android:allowBackup="true"
    android:hardwareAccelerated="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".ui.activities.SplashActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

Here is a gradle file's source snippet

apply plugin: 'com.android.application'
    android {

        compileSdkVersion 25
        buildToolsVersion '26.0.2'
        flavorDimensions "default"
        defaultConfig {
            minSdkVersion 16
            targetSdkVersion 25
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
            multiDexEnabled true
        }

        signingConfigs {
            release {
            }
        }

        buildTypes {
            release {
                minifyEnabled false
                signingConfig signingConfigs.release
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }

        productFlavors.whenObjectAdded { flavor ->
            flavor.ext.set("app_name", "")
        }

        productFlavors {
            photographer_prod {
                app_name = "flovor1name"
                buildConfigField "String", "API_URL", ""
                buildConfigField "boolean", "IS_PHOTOGRAPHER_APP", "true"
                applicationId "me.flovor.package_1"
                versionCode 1048
                versionName "1.0.48"
            }

            agent_prod {
                app_name = "flovor2name"
                buildConfigField "String", "API_URL", ""
                buildConfigField "boolean", "IS_PHOTOGRAPHER_APP", "false"
                applicationId "me.flovor.package_2"
                versionCode 1016
                versionName "1.0.16"
            }


        }

        applicationVariants.all { variant ->
            def flavor = variant.productFlavors*.name[0]
            def appName = variant.productFlavors*.app_name[0]

            variant.mergeResources.doLast {
                File valuesFile = file("${variant.mergeResources.outputDir}/values/values.xml")
                if (valuesFile.exists()) {
                    String content = valuesFile.getText('UTF-8')
                    content = content.replaceAll("app_name_string", appName)
                    valuesFile.write(content, 'UTF-8')
                } else {
                    println("File: " + valuesFile.path + " does not exist")
                }
            }

            if (variant.buildType.name == "debug") {
                return;
            }

            variant.outputs.each { output ->
                def SEP = "_"
                def buildType = variant.variantData.variantConfiguration.buildType.name
                def version = variant.versionName
                def date = new Date();
                def formattedDate = date.format('ddMMyy_HHmm')

                def newApkName = flavor + SEP + buildType + SEP + version + SEP + formattedDate + ".apk"

                output.outputFileName = new File(output.outputFile.parent, newApkName)
            }
        }
    }

In string.xml default value is

<string name="app_name">app_name_string</string>

When I try to build both flavors realize version, the app name is always app_name_string (String from string.xml file)

How do i solve this problem? thanks

like image 489
BekaKK Avatar asked Apr 06 '18 10:04

BekaKK


People also ask

What are app flavors?

Android Product Flavors are used to create different app versions. App versions can be free or paid. They can have different themes and texts. They can use different environments or APIs. Let's assign two product flavors free and paid in our application.

What are product Flavours in Android?

Product flavours lets you create multiple variants of an android app while using a single codebase. To create product flavours you need to define rules in the build.

What are build variants in Android?

Build variants are the result of Gradle using a specific set of rules to combine settings, code, and resources configured in your build types and product flavors. Although you do not configure build variants directly, you do configure the build types and product flavors that form them.

How can I get flavor on my Android?

You can add a config file, say 'Appconfig. java' to your productFlavor specific source folders i.e. src/<productflavor>/java/<packagename>/Appconfig. java ; you can then use Appconfig. PRODUCT_FLAVOR in your app.


2 Answers

Just add the string

<string name="app_name">app_name_string</string>

in the folders:

app/src/photographer_prod/res/values/strings.xml
app/src/agent_prod/res/values/strings.xml

You can also add resource values directly to your build.gradle file

productFlavors { 
    photographer_prod {
      resValue "string", "app_name", "the app name.."
    }
    agent_prod {
      resValue "string", "app_name", "the app name.."
    }
  }
like image 124
Gabriele Mariotti Avatar answered Nov 14 '22 23:11

Gabriele Mariotti


In addition to Gabriele Mariotti's answer, make sure application / android:label attribute's value is set to @string/app_name in your AndroidManifest.xml file.

like image 35
rockneverdies Avatar answered Nov 15 '22 00:11

rockneverdies