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