为什么Gradle会忽略release {}并在调试版本上实现规则呢?

时间:2015-06-19 18:13:57

标签: android-studio android-gradle

我不确定这是否发生过,但我认为它发生在Android Studio及其Gradle的最新更新之后。

即,我正在尝试设置发布APK的输出路径。所以我做了这样的代码

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        signingConfig signingConfigs.config

        def outputPathName = "./apk-release.apk"
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                output.outputFile = file(outputPathName)
            }
        }
    }
}

这会将APK从其默认位置(/build/outputs/apk)移开,并将其放在build.gradle文件旁边。

然而,release{}被忽略,Android Studio将调试版本移动到此位置,并重命名它。因此,无论是创建签名APK还是按调试图标来测试调试版本,都会移动并重命名APK。它应该保持在默认位置,对吗?

为什么会这样? Android Studio Gradle中的错误或我的代码中的错误?

注意:我注意到在我为APK创建自定义名称的其他项目中也发生了同样的情况。它还将重命名调试APK,并以同样的方式忽略release{}

Android Studio版本:1.3。预览5

1 个答案:

答案 0 :(得分:2)

  

发布{}被忽视

不是真的。 处理脚本时会执行build.gradle中代码的每一行

Gradle脚本不能在构建时执行代码。它们用于定义构建过程的对象模型。在Android Studio中,Gradle脚本不会在构建时读入和解释;在项目打开或“与Gradle文件同步项目”时读入它们。正是该对象模型填充了Build Variants视图等内容。

release关闭并没有说“这只是应该在发布版本上完成的东西”。它只是说“嘿,任何你无法识别的东西,比如minifyEnabled,看看这是一个属性或方法,还是这个release对象”。您可以像这样编写release闭包的开头部分:

buildTypes {
    release.minifyEnabled false
    release.proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    release.signingConfig signingConfigs.config
}

甚至:

   buildTypes.release.minifyEnabled false
   buildTypes.release.proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
   buildTypes.release.signingConfig signingConfigs.config

如果你愿意的话。

这就是为什么你会在applicationVariants结束时看到那种android {}循环,因为(我认为)applicationVariants是Gradle for Android插件DSL的一部分,它将迭代所有应用程序变体。

因此,如果您只想影响release构建,请在循环中检查variant的构建类型:

    def outputPathName = "./apk-release.apk"
    applicationVariants.all { variant ->
        def name = variant.buildType.name

        if (name.equals(com.android.builder.core.BuilderConstants.DEBUG)) {
            return; // Skip debug builds.
        }

        variant.outputs.each { output ->
            output.outputFile = file(outputPathName)
        }
    }

(可能有一种过滤方式,但这就是我一直在使用的......)