2015-06-19 81 views
0

我不确定这是否发生过,但我认为它发生在Android Studio及其Gradle的最新更新之后。为什么Gradle会忽略release {}并在调试版本上实现规则?

即,我试图设置释放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) 
      } 
     } 
    } 
} 

这是一个代码将从其默认位置(/build/outputs/apk)移动APK和旁边的build.gradle文件放置。

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

这是怎么发生的? Android Studio Gradle中的错误还是我的代码中的错误?

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

Android Studio版本:1.3。预览5

+2

这不是无视'release {}';这是它不按照你期望的方式工作。在构建的配置阶段,无论您正在做什么构建,它都会执行该块中的所有脚本;事实上,在配置阶段,它甚至不知道。直到它开始运行任务的执行阶段,构建类型才更为传统。 –

+0

@ScottBarta谢谢苏格兰人。是的,我错误地理解它,因为我不知道执行时间。我认为这是在构建过程中。 CommonsWare也很好地解释了这一点。 – sandalone

回答

2

释放{}被忽略

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

Gradle脚本不会在构建时执行代码。他们在那里定义构建过程的对象模型。在Android Studio中,Gradle脚本不会在构建时读入和解释;他们在项目打开时或在“使用Gradle文件同步项目”时读入。正是这种对象模型填充了像Build Variants视图这样的东西。

release closure并不是说“这只是应该在发布版本上完成的东西”。它只是说:“嘿,任何你无法识别的东西,如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是摇篮的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) 
     } 
    } 

(有可能是一个过滤此的巧妙方式,但是这是我一直在使用...)

+0

哇,哇,哇!每当我想到我知道什么时,你就把我放在地上,我知道我的无知有多大:)。非常感谢! – sandalone