Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gradle resValue causes duplicate string resources

My Android manifest file defines the app name as follows:

android:label="@string/app_name"

A corresponding entry for app_name exists in res/values/strings.xml

Now, in my build.gradle, I redefine the app name for beta build as follows:

buildTypes {

    beta {
        applicationIdSuffix ".beta"
        debuggable true
        resValue "string", "app_name", "MyTest Beta"
    }
}

However, when I assemble the package, Gradle complains of a duplicate string resource.

I could simply remove the app_name token from string.xml. However, in that case, Android Studio reports a problem with the manifest file.

How do I fix this? Regards.

like image 699
Peter Avatar asked Aug 27 '15 21:08

Peter


2 Answers

Shouldn't have to mess with a 'resValue.' You can use the debug sourceset which will allow you to redefine other strings in debug as well. Create the following file and redefine the 'app_name' string in there.

src/debug/res/values/strings.xml

Just make sure you don't have anything like the following in your build.gradle's sourceSets

debug.setRoot('build-types/debug')
like image 168
Mike Avatar answered Nov 08 '22 11:11

Mike


I came across the same issue too. My solution is to use Manifest-placeholder.

<application
    android:label="${APP_NAME}"
    tools:replace="android:label">

In your defaultConfig closure, set the value

defaultConfig {
    addManifestPlaceholders([APP_NAME: "@string/app_name"])
}

And Change that value in your flavors.

buildTypes {
    beta {
        applicationIdSuffix ".beta"
        debuggable true
        addManifestPlaceholders([APP_NAME: "MyTest Beta"])
    }
}

Drawback:

  • HardCode appName in flavor. (which may or may not be a deal)

To fix that drawback, you can combine Manifest-placeholder and resValue, which is to create a resource use resValue and to change android:label to your resource.

like image 45
landerlyoung Avatar answered Nov 08 '22 10:11

landerlyoung