Подтвердить что ты не робот

Почему Gradle создает мой модуль в режиме Release, когда приложение находится в Debug

Я создаю новый Android-проект со стандартным модулем 'app', а также проект библиотеки (позвольте называть его 'custom_lib'). В файле app build.gradle я свяжу модуль как таковой:

dependencies {
    compile project(':custom_lib')
}

Когда я запускаю процесс сборки (Menu Build > Make Project), я получаю следующий вывод в консоли 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

Меня озадачивает то, что механизм сборки запускает сборку Debug (как говорит первая строка), но почти сразу, Gradle использует задачу :app:preReleaseBuild, которая делает мой модуль custom_lib построенным с конфигурацией Release,

И затем, после того, как приложение полностью построено, Gradle скомпилирует мой модуль с конфигурацией Debug.

Итак, мои вопросы:

  • Почему он делает эту двойную сборку, которая кажется бессвязной?
  • Как я могу убедиться, что библиотека построена с конфигурацией отладки при запуске процесса сборки Debug?

ИЗМЕНИТЬ:

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 {
}

Примечание. Я использую Android Studio 1.0 RC 1/ Gradle 2.2 и воспроизвел эту проблему, создав новый проект с нуля, добавлю пустой модуль библиотеки Android и "вуаля",

4b9b3361

Ответ 1

В окне панели "Варианты сборки" слева вы должны увидеть оба своих модуля, а рядом с ними - текущие "активные" варианты. Например,

app          debug
custom_lib   debug

При вызове Build > Make Project мы строим все модули проекта в их текущем варианте.

Однако из-за ограничения тока Gradle (https://code.google.com/p/android/issues/detail?id=52962), построение app в debug потребует создания release вариант custom_lib, и поэтому вы создадите оба.

Я бы рекомендовал не использовать Make Project, а вместо этого использовать параметр ниже, который говорит Make Module app. Эта опция изменится с app на lib на основе текущего выбора на панели Project или на основе текущего редактора и будет всегда делать только то, что необходимо для создания текущего модуля.

(В этом мы заметили, что для него нет ярлыка, поэтому мы добавляем один).

Ответ 2

Поместите это в зависимости от вашего приложения:

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

и в вашей библиотеке build.gradle add:

android {

    defaultConfig {
        defaultPublishConfig 'release'
        publishNonDefault true
    }

}

Затем библиотека будет построена в том же режиме, что и приложение. Вопреки предыдущим изменениям этого ответа, я подтвердил, что в библиотеке не требуется аромат (это может быть связано с версиями плагина Gradle или Android). Я использую Gradle 2.14 и Android plugin 2.1.0 и сделал не требуется).

Изменить: у вас могут возникнуть проблемы, если вы не очистите/не перестройте после изменения файлов Gradle, как описано в здесь.

Ответ 3

Это близко связанное с этим вопросом.

Похоже, что Gradle строит все ссылочные модули проекта в режиме выпуска. Поскольку custom_lib - это только библиотека, его конфигурация переопределяется модулем, который ссылается на него. Я не стал бы слишком беспокоиться о том, что библиотека строится с помощью метки "release".

Вы заметите, что на вашем выходе Gradle ваш проект правильно компилируется с конфигурацией отладки.

Ответ 4

Gradle теперь поддерживает директиву Flavor-buildType-Compile, поэтому ответ KaneORiley теперь можно улучшить следующим образом:

library build.gradle:

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

app build.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') 
}