Dlaczego Gradle buduje mój moduł w trybie wydania, gdy aplikacja jest w debugowaniu

Robię nowy projekt Androida, ze standardowym modułem 'app', a także projektem biblioteki (nazwijmy go 'custom_lib'). W pliku app's build.gradle łączę moduł jako taki:

dependencies {
    compile project(':custom_lib')
}

Kiedy uruchamiam proces budowania (Menu Build > Make Project), otrzymuję następujące wyjście w konsoli Gradle

Executing tasks: [clean, :app:compileDebugSources, :custom_lib:compileDebugSources]

Configuration on demand is an incubating feature.
:app:clean
:custom_lib:clean
:app:preBuild
:app:preDebugBuild
:app:checkDebugManifest
:app:preReleaseBuild
:custom_lib:compileLint
:custom_lib:copyReleaseLint UP-TO-DATE
:custom_lib:mergeReleaseProguardFiles UP-TO-DATE
:custom_lib:preBuild
:custom_lib:preReleaseBuild
:custom_lib:checkReleaseManifest
:custom_lib:prepareReleaseDependencies
:custom_lib:compileReleaseAidl
:custom_lib:compileReleaseRenderscript
:custom_lib:generateReleaseBuildConfig
:custom_lib:generateReleaseAssets UP-TO-DATE
:custom_lib:mergeReleaseAssets
:custom_lib:generateReleaseResValues UP-TO-DATE
:custom_lib:generateReleaseResources
:custom_lib:packageReleaseResources
:custom_lib:processReleaseManifest
:custom_lib:processReleaseResources
:custom_lib:generateReleaseSources
:custom_lib:compileReleaseJava
:custom_lib:processReleaseJavaRes UP-TO-DATE
:custom_lib:packageReleaseJar
:custom_lib:compileReleaseNdk
:custom_lib:packageReleaseJniLibs UP-TO-DATE
:custom_lib:packageReleaseLocalJar UP-TO-DATE
:custom_lib:packageReleaseRenderscript UP-TO-DATE
:custom_lib:bundleRelease
:app:prepareComAndroidSupportAppcompatV72102Library
:app:prepareComAndroidSupportSupportV42102Library
:app:prepareTestDoubleBuildCustom_libUnspecifiedLibrary
:app:prepareDebugDependencies
:app:compileDebugAidl
:app:compileDebugRenderscript
:app:generateDebugBuildConfig
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources
:app:mergeDebugResources
:app:processDebugManifest
:app:processDebugResources
:app:generateDebugSources
:app:compileDebugJava
:app:compileDebugNdk
:app:compileDebugSources
:custom_lib:preDebugBuild
:custom_lib:checkDebugManifest
:custom_lib:prepareDebugDependencies
:custom_lib:compileDebugAidl
:custom_lib:compileDebugRenderscript
:custom_lib:generateDebugBuildConfig
:custom_lib:generateDebugAssets UP-TO-DATE
:custom_lib:mergeDebugAssets
:custom_lib:generateDebugResValues UP-TO-DATE
:custom_lib:generateDebugResources
:custom_lib:packageDebugResources
:custom_lib:processDebugManifest
:custom_lib:processDebugResources
:custom_lib:generateDebugSources
:custom_lib:compileDebugJava
:custom_lib:compileDebugNdk
:custom_lib:compileDebugSources

BUILD SUCCESSFUL

Total time: 2.184 secs

Zastanawia mnie to, że mechanizm build uruchamia debug build( jak mówi pierwsza linia), ale prawie natychmiast Gradle używa zadania :app:preReleaseBuild, które sprawia, że moje custom_lib moduł do zbudowania z konfiguracją Release.

A następnie, po pełnym zbudowaniu aplikacji, Gradle kompiluje mój moduł z konfiguracją debugowania.

Więc moje pytania to:

  • dlaczego robi to podwójne budowanie, które wydaje się niespójne ?
  • Jak mogę się upewnić, że Biblioteka jest zbudowana z konfiguracją debugowania podczas uruchamiania procesu budowania debugowania ?

EDIT:

App / build.gradle :

apply plugin: 'com.android.application'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.deezer.testdoublebuild"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    buildTypes {
        debug{
            debuggable true
        }
        release {
            debuggable false
            minifyEnabled false
        }
    }
}

dependencies {
    compile project(':custom_lib')
}

Custom_lib / build.gradle:

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "21.1.1"

    defaultConfig {
        applicationId "com.deezer.mylibrary"
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
}

Uwaga : używam Android Studio 1.0 RC 1 / Gradle 2.2 i odtworzyłem ten problem, tworząc nowy projekt od podstaw, dodając pusty moduł Biblioteki Androida i"voila"

Author: XGouchet, 2014-12-03

4 answers

W oknie Panelu "Build Variants" po lewej stronie powinieneś zobaczyć oba swoje moduły, a obok nich obecne" aktywne " warianty. Na przykład

app          debug
custom_lib   debug

Wywołując Build > Make Project budujemy wszystkie moduły w projekcie w ich aktualnym wariancie.

Jednak ze względu na obecne ograniczenie Gradle ( https://code.google.com/p/android/issues/detail?id=52962 ), budowanie app w debug będzie wymagało zbudowania release wariantu custom_lib, a więc kończy się budując jedno i drugie.

Zalecałbym, aby nie używać Make Project, ale zamiast tego użyć opcji poniżej, która mówi Make Module app. Ta opcja zmieni się z app na lib na podstawie bieżącego wyboru w panelu Project lub na podstawie bieżącego edytora i będzie zawsze robić tylko to, co jest potrzebne do zbudowania bieżącego modułu.

(patrząc na to, zauważyliśmy, że nie ma na to skrótu, więc dodajemy jeden).

 21
Author: Xavier Ducrohet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-03 17:50:52

Umieść to w zależności aplikacji:

dependencies {
    debugCompile project(path: ':custom_lib', configuration: "debug")
    releaseCompile project(path: ':custom_lib', configuration: "release")
}

I w budowaniu biblioteki.gradle add:

android {

    defaultConfig {
        defaultPublishConfig 'release'
        publishNonDefault true
    }

}

Wtedy Biblioteka zostanie zbudowana w tym samym trybie co aplikacja. W przeciwieństwie do poprzednich wersji tej odpowiedzi, potwierdziłem smak nie jest wymagane w bibliotece (może to być spowodowane Gradle lub Android plugin wersje - używam Gradle 2.14 i Android plugin 2.1.0 i nie wymaga).

Edit: możesz mieć problemy, jeśli nie wyczyścisz/odbudujesz po modyfikacji pliki gradle, jak opisano w tej odpowiedzi tutaj.

 64
Author: Kane O'Riley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:21

Gradle obsługuje teraz dyrektywę Flavor-buildType-Compile, więc odpowiedź Kaneorileya może zostać ulepszona w następujący sposób:

Budowa Biblioteki."gradle": {]}

android {
    defaultPublishConfig 'release'
    publishNonDefault true
    productFlavors {
        library {
    }
}

Budowa aplikacji."gradle": {]}

configurations {
    devDebugCompile
    devReleaseCompile
    storeDebugCompile
    storeReleaseCompile
}

android {
    .....
}

dependencies {
    (...)
    devDebugCompile    project(path: ':path:to:lib', configuration: 'devDebug')
    devReleaseCompile  project(path: ':path:to:lib', configuration: 'devRelease')
    storeDebugCompile  project(path: ':path:to:lib', configuration: 'storeDebug')
    storeReleaseCompile project(path: ':path:to:lib', configuration: 'storeRelease') 
}
 3
Author: Phileo99,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 00:41:48

Jest to ściśle związane z tym pytaniem .

Wygląda na to, że Gradle buduje wszystkie odwołujące się Moduły projektu w trybie release. Ponieważ custom_lib jest tylko biblioteką, jej konfiguracja jest nadpisywana przez moduł, który się do niej odwołuje. Nie martwiłbym się zbytnio o to, że Biblioteka jest budowana z etykietą "release".

Zauważ, że w Twoim wyjściu gradle, Twój projekt jest poprawnie skompilowany z konfiguracją debugowania.

 2
Author: Paul Lammertsma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:25