我已经看过操纵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。
答案 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
,而这正是我最初想要做的。