2015-06-19 83 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