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

Sim*_*mas 13 android intellij-idea gradle build.gradle android-gradle-plugin

我已经看到了操纵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"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

resValue "string", "authority", applicationId + ".dataprovider"
Run Code Online (Sandbox Code Playgroud)

我尝试过的:

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

寻找替代方案.

PS我正在使用Android Studio 0.8.12.

Sim*_*mas 34

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

productFlavors.all {
    resValue "string", "authority", applicationId + ".dataprovider"
}
Run Code Online (Sandbox Code Playgroud)

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


额外:

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

def final String AUTHORITY = '.dataprovider'

productFlavors.all {
    applicationId "com.my.app." + name
    resValue "string", "authority", applicationId + AUTHORITY
    buildConfigField "String", "AUTHORITY", "\""+applicationId + AUTHORITY+"\""
}
Run Code Online (Sandbox Code Playgroud)

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

<provider
    android:name="com.my.app.DataProvider"
    android:authorities="@string/authority"
    android:exported="false" />
Run Code Online (Sandbox Code Playgroud)


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

  • 我刚刚注意到已经生成了BuildConfig.APPLICATION_ID,以及其他常量的build-type,flavors incl.尺寸和版本信息.然而,如果没有你的回答我就不会看到这些信息. (2认同)