相关疑难解决方法(0)

用Gradle更改apk名称

我有一个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)

android gradle apk android-gradle-plugin

41
推荐指数
3
解决办法
4万
查看次数

根据buildType使用gradle覆盖资源

我想用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

23
推荐指数
2
解决办法
2万
查看次数

是否可以在Gradle中定义Android字符串数组资源?

在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中表达它们.

有没有人有任何指导?我在网上看了一遍,但没找到任何东西.

java android gradle build.gradle android-gradle-plugin

9
推荐指数
1
解决办法
4012
查看次数

如何从xml获取BuildConfig值?

我有一个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来获取它?

xml android gradle android-xml

4
推荐指数
1
解决办法
3973
查看次数