android studio - 为什么 Gradle 忽略 release{} 并在调试构建上实现规则



我不确定这是否发生在以前,但我认为它发生在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{}

安卓工作室版本:1.3。预览 5

释放{}被忽略

没有。build.gradle的每一行代码都在处理脚本时执行。

Gradle 脚本不是在构建时执行代码的。它们用于定义生成过程的对象模型。在 Android Studio 中,Gradle 脚本不会在构建时读入和解释;当项目打开或"将项目与 Gradle 文件同步"时,它们会被读入。正是该对象模型填充了诸如"构建变体"视图之类的内容。

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

如果你愿意。

这就是为什么你通常会在android {}结束时看到这种applicationVariants循环,因为(我认为)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)
        }
    }

(可能有一种更光滑的方法来过滤它,但这就是我一直在使用的方法......

最新更新