我有一个Android项目,它使用Gradle进行构建过程.现在我想添加两个额外的构建类型登台和生产,所以我的build.gradle包含:
android {
buildTypes {
release {
runProguard false
proguardFile getDefaultProguardFile('proguard-android.txt')
}
staging {
signingConfig signingConfigs.staging
applicationVariants.all { variant ->
appendVersionNameVersionCode(variant, defaultConfig)
}
}
production {
signingConfig signingConfigs.production
}
}
}
Run Code Online (Sandbox Code Playgroud)
和我的appndVersionNameVersionCode看起来像:
def appendVersionNameVersionCode(variant, defaultConfig) {
if(variant.zipAlign) {
def file = variant.outputFile
def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
variant.outputFile = new File(file.parent, fileName)
}
def file = variant.packageApplication.outputFile
def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
variant.packageApplication.outputFile = …Run Code Online (Sandbox Code Playgroud) 我想用gradle覆盖res/strings.xml中的一些字符串.
我知道,因为Android Gradle Plugin 0.7.+ theres可能有一个变种特定的源文件夹.但我的应用程序有很多口味,我不想添加额外的变体特定文件夹.
更新2014-01-17
我想要的详细信息:
我的资源中有一些变量只依赖于buildType(例如"release").首先,我认为我的SOLUTION_1(在资源合并后覆盖数据)很好,因为如果我必须更改这些变量,我只需要在build.config(只有一个地方)中更改它们.但正如Scott Barta在下面的评论中所写的那样,为什么这个解决方案不是一个好主意有一些很好的理由.
所以我尝试了另一个解决方案SOLUTION_2(只是合并正确的资源)基于shakalaca的这个GitHub项目.我认为这种方式更优雅,我仍然有一个优势就是在一个地方改变变量!
SOLUTION_1(在资源合并后覆盖数据):
我在AS 0.4.2中做了什么:
在build.gradle我尝试将字符串"Hello World"覆盖为"OVERRIDE"(根据我在这篇文章中的回答):
android.applicationVariants.all{ variant ->
// override data in resource after merge task
variant.processResources.doLast {
overrideDataInResources(variant)
}
}
def overrideDataInResources(buildVariant){
copy {
// *** SET COPY PATHS ***
try {
from("${buildDir}/res/all/${buildVariant.dirName}") {
// println "... FROM: ${buildDir}/res/all/${buildVariant.dirName}"
include "values/values.xml"
}
} catch (e) {
println "... EXCEPTION: " + e
}
into("${buildDir}/res/all/${buildVariant.dirName}/values")
// …Run Code Online (Sandbox Code Playgroud)android gradle android-studio build.gradle android-gradle-plugin
在Gradle for Android中,我正在尝试生成相应的字符串数组资源...
<resources>
<string-array name="url_array">
<item>http://www.url1.com</item>
<item>http://www.url2.com</item>
<item>http://www.url3.com</item>
</string-array>
</resources>
Run Code Online (Sandbox Code Playgroud)
...在我的应用程序的build.gradle配置文件中.我不想在res/values/arrays.xml中对这些值进行硬编码,因为我希望能够为不同的构建变体(dev与prod)生成不同的数组内容.我知道有解决方法,但如果可能的话,这将是最干净的解决方案.
我已经尝试过类似下面摘录的resValue类型的"string-array"或"array",但是我得到一个错误,说resValue()不存在.当然,resRalue类型的"string"参数适用于单个字符串,但我需要生成一个字符串数组资源.
resValue "string-array", "url_array",
["http://www.url1.com",
"http://www.url2.com",
"http://www.url3.com"]
Run Code Online (Sandbox Code Playgroud)
Gradle for Android文档没有帮助.它列出了这种方法......
void resValue(字符串类型,字符串名称,字符串值)
...但它不表示类型参数的有效值.它只是有一个链接,上面写着" 查看资源类型 ",但它只指向常规的Android资源类型文档,并没有描述如何在Gradle Android DSL中表达它们.
有没有人有任何指导?我在网上看了一遍,但没找到任何东西.
我有一个xml文件.在xml文件中,我想获得BuildConfig值.BuildConfig值在build.gradle中设置.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="com_my_api_key">**REPLACE_WITH_YOUR_API_KEY**</string>
</resources>
Run Code Online (Sandbox Code Playgroud)
我想从buildConfig获取api Key,类似于我在java代码中获取这些值的方式.
public class MyApp extends Application{
public String APPTIMIZE_KEY = BuildConfig.APPTIMIZE_KEY;
}
Run Code Online (Sandbox Code Playgroud)
这是在build.gradle中设置的值,它来自外部文件.
release {
buildConfigField "boolean", "APP_DEBUG", "false"
buildConfigField "String", "APPTIMIZE_KEY", "\"${props.getProperty("apptimizeKey_App1")}\""
Run Code Online (Sandbox Code Playgroud)
我如何在xml文件中引用这个---> BuildConfig.APPTIMIZE_KEY来获取它?