Android Gradle合并字符串资源

时间:2013-10-15 13:44:26

标签: android android-studio android-gradle gradlew

我想使用Gradle创建2个不同的APK(发布和调试),我想为它们使用不同的名称('appName'和'appName debug')。

我找到了一些解决方案,但它对我不起作用:
link 1
link 2

我想在设备上安装两个apks但是我有以下错误:

 Duplicate resources: 
 ...\src\release\res\values\config.xml:string/config_app_name,
 ...\src\main\res\values\config.xml:string/config_app_name

如果我从config_app_name删除main\res\values\config.xml密钥,则Gradle会说找不到该密钥。

我有3个清单文件:

...\src\main\AndroidManifest.xml (this uses the `android:label="@string/config_app_name"`)

...\src\release\AndroidManifest.xml

...\src\debug\AndroidManifest.xml

buildTypes {

    debug {
        packageNameSuffix ".debug"
        versionNameSuffix "-debug"
        buildConfig "public static final String PROVIDER_AUTHORITY = \"" + PROVIDER_DEBUG + "\";"
        signingConfig signingConfigs.debug
    }
    release {
        buildConfig "public static final String PROVIDER_AUTHORITY = \"" + PROVIDER_RELEASE + "\";"
        signingConfig signingConfigs.release
    }
}

sourceSets {
    debug {
        java.srcDirs = [
                'src/main/java']
        res.srcDirs = [
                'src/main/res',
                'src/debug/res']
    }

    release {
        java.srcDirs = [
                'src/main/java']
        res.srcDirs = [
                'src/main/res',
                'src/release/res']
    }
}

是否可以在项目的主要部分中使用一个公共密钥(字符串,整数,维度)并在发布/调试部分中覆盖它?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我刚才意识到这只是一个命名问题。发布包的名称拼写错误。抱歉这个愚蠢的问题。

现在合并正在按预期工作。

答案 1 :(得分:1)

请看这里:http://tools.android.com/tech-docs/new-build-system/resource-merging

您为构建类型定义了多个资源来源。在这种情况下,它们具有相同的优先级,并可能导致冲突。

如果要进行正确的合并,则需要创建单独的主要源集。它的优先级低于构建类型资源。

sourceSets {

    main {
        java.srcDirs = ['src/main/java']
        res.srcDirs = ['src/debug/res']

    }

    debug {
        res.srcDirs = ['src/debug/res']
    }

    release {
        res.srcDirs = ['src/release/res']
    }
}

但是使用这样的目录结构,它必须从没有sourceSets定义的框中解决。