我不确定这是否发生在以前,但我认为它发生在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)
}
}
(可能有一种更光滑的方法来过滤它,但这就是我一直在使用的方法......