在gradle中定义一个字符串,并使用特定于flavor的applicationId

时间:2014-10-23 12:09:09

标签: android intellij-idea gradle android-gradle build.gradle

我已经看过操纵gradle构建任务的脚本,我现在想知道是否可以在`defaultConfig之外设置一个字符串,但将其视为所有风格的默认值。

基本上我有多种口味,所有口味都有一个特定的ApplicationId。我想使用该id来设置稍后在我的java代码中使用的字符串资源。

defaultConfig {
    minSdkVersion 11
    targetSdkVersion 21
    versionCode 1
    versionName "1.0"
}

productFlavors {
    one {
        applicationId "com.my.app.one"
    }
    two {
        applicationId "com.my.app.two"
    }
}

我想设置一个这样的字符串:

resValue "string", "authority", applicationId + ".dataprovider"

我尝试过的事情:

  • 如果我把它放在defaultConfig部分,则applicationId仍然为null,因此我得到一个错误的字符串
  • 将它放到每个风味部分都有效,但由于我有多种口味会产生大量的代码重复

寻找替代方案。

P.S。我使用的是Android Studio 0.8.12。

2 个答案:

答案 0 :(得分:32)

经过大量的搜索,我找到了答案。也许有人会觉得这很有用。

productFlavors.all {
    resValue "string", "authority", applicationId + ".dataprovider"
}

这个简单的代码片段将字符串设置为 后设置的其他变量。它有点像defaultConfig但不完全,因为它是在味道块之后执行的。


<强>附加

结果我甚至可以设置applicationId!到目前为止我的最终结果是:

def final String AUTHORITY = '.dataprovider'

productFlavors.all {
    applicationId "com.my.app." + name
    resValue "string", "authority", applicationId + AUTHORITY
    buildConfigField "String", "AUTHORITY", "\""+applicationId + AUTHORITY+"\""
}

现在我可以通过BuildConfig.AUTHORITY@string/authority来获取每个flavor提供者的权限,我分别在清单和我的类文件中使用它们:

<provider
    android:name="com.my.app.DataProvider"
    android:authorities="@string/authority"
    android:exported="false" />


public class DataProvider extends ContentProvider {
    public static final String PROVIDER = BuildConfig.AUTHORITY;
    public static final Uri SEARCH_URI = Uri.parse("content://" + PROVIDER + "/search");
}

答案 1 :(得分:0)

我想要类似的东西,所以我花了大约两个小时来学习Groovy方法。我希望能够与生产环境,沙箱环境和本地环境相抵触。因为我很懒,所以我只想在一个地方更改URL。这是我想出的:

 flavorDimensions 'environment'
    productFlavors {
        production {
            def REMOTE_HOST = "evil-company.com"
            buildConfigField 'String', 'API_HOST', "\"${REMOTE_HOST}\""
            buildConfigField 'String', 'API_URL', "\"https://${REMOTE_HOST}/api/v1/\""
            buildConfigField 'String', 'WEB_URL', "\"https://${REMOTE_HOST}/\""
            dimension 'environment'
        }
        rickard {
            def LOCAL_HOST = "192.168.1.107"
            buildConfigField 'String', 'API_HOST', "\"${LOCAL_HOST}\""
            buildConfigField 'String', 'API_URL', "\"https://${LOCAL_HOST}/api/v1/\""
            buildConfigField 'String', 'WEB_URL', "\"https://${LOCAL_HOST}/\""
            applicationIdSuffix ".dev"
        }
    }

替代语法,因为在Groovy方法中只能将${variable}与双引号一起使用。

rickard {
    def LOCAL_HOST = "192.168.1.107"
    buildConfigField 'String', 'API_HOST', '"' + LOCAL_HOST + '"'
    buildConfigField 'String', 'API_URL', '"https://' + LOCAL_HOST + '/api/v1/"'
    buildConfigField 'String', 'WEB_URL', '"https://' + LOCAL_HOST + '"'
    applicationIdSuffix ".dev"
}

我很难理解的是,字符串必须声明为带引号的字符串。由于该限制,我不能直接使用引用API_HOST,而这正是我最初想要做的。