为什么android gradle任务在LIB构建之前启动?

为什么android gradle任务在LIB构建之前启动?,android,android-gradle-plugin,Android,Android Gradle Plugin,我正试图启动一个任务,将aar文件(android LIB)复制到一个单独的文件夹中,但该任务在构建开始之前一直被触发 我正在使用这个答案,但它对我不起作用: 这是我的格拉德尔: def buildLibrary = true; if (buildLibrary) { apply plugin: 'com.android.library' } else { apply plugin: 'com.android.application' } apply plugin: 'i

我正试图启动一个任务,将aar文件(android LIB)复制到一个单独的文件夹中,但该任务在构建开始之前一直被触发

我正在使用这个答案,但它对我不起作用:

这是我的格拉德尔:

def buildLibrary = true;

if (buildLibrary) {
    apply plugin: 'com.android.library'
} else {
    apply plugin: 'com.android.application'

}

apply plugin: 'io.fabric'

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
        flatDir {
            dirs 'libs' //this way we can find the .aar file in libs folder
        }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
}

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        if (!buildLibrary) {
            applicationId "myapp.com.mysdk"
        }
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    // Support libraries and widgets
    compile 'com.android.support:support-v13:23.1.0'
    compile 'com.android.support:support-v4:23.1.0'
    compile 'com.android.support:gridlayout-v7:23.1.1'
}


// Why this keeps getting called before the build starts????

task copyAARToCommonLibs(type: Copy) {
    println 'calling copyAARToCommonLibs before libs are built!!!'
    from('../build/outputs/aar') {
        include '*-release.arr'
    }
    into '../MyOutput/libs'
    println 'end of calling!!!'
}

build.finalizedBy(copyAARToCommonLibs)

// This did not work either
tasks.build.doLast(){
    println 'This is never called!!!'
}
以及干净构建的输出:

Executing tasks: [clean, :app:generateDebugSources, :app:generateDebugAndroidTestSources, :app:compileDebugSources, :app:compileDebugAndroidTestSources]

Configuration on demand is an incubating feature.
Crashlytics was applied to an android-library project. 
Android-library support is currently an incubating feature. 
Contact support@fabric.io with any issues.
calling copyAARToCommonLibs before libs are built!!!
end of calling!!!
:clean UP-TO-DATE
:app:clean
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preDebugAndroidTestBuild UP-TO-DATE
:app:preDebugUnitTestBuild UP-TO-DATE
:app:preReleaseBuild UP-TO-DATE
:app:preReleaseUnitTestBuild UP-TO-DATE
... a bunch of stuff
:app:generateDebugAndroidTestBuildConfig
:app:generateDebugAndroidTestAssets UP-TO-DATE
:app:mergeDebugAndroidTestAssets
:app:generateDebugAndroidTestResValues UP-TO-DATE
:app:generateDebugAndroidTestResources
:app:mergeDebugAndroidTestResources
:app:processDebugAndroidTestResources
:app:generateDebugAndroidTestSources
:app:compileDebugAndroidTestJavaWithJavac
:app:compileDebugAndroidTestNdk UP-TO-DATE
:app:compileDebugAndroidTestSources

BUILD SUCCESSFUL

Total time: 13.157 secs

您添加到
copyAARToCommonLibs
的打印语句会误导您。根据它们在任务定义中的位置,它们在配置时独立于任何任务间依赖顺序执行。这就是为什么打印会在生成过程发生之前出现(因为配置不依赖于任务依赖项)

下面是一个简单的例子:

task blahTask() {
    println "Configuring finalizer"

    doLast {
        println "Actually running finalizer"
    }
}

task toFinalize() {
    println "Configuring to finalize"

    doLast {
        println "Actually running thing to finalize"
    }
}

toFinalize.finalizedBy(blahTask)
当我执行
toFinalize
时,输出为:

Configuring finalizer
Configuring to finalize
:app:toFinalize
Actually running thing to finalize
:app:blahTask
Actually running finalizer

BUILD SUCCESSFUL
正如您所见,终结器的配置代码实际上是在待终结任务的配置代码之前执行的(即独立于任务依赖项),而
doLast
代码是按所需顺序运行的

因此,以您现有的方式使用print语句实际上并没有给出复制任务何时运行的指示

需要了解的另一件事是,在您的输出(从您显示的内容)中没有
:app:copyAARToCommonLibs
语句指示任务未实际运行(正在配置,因此打印)。根据协议,如果正在完成的任务(在您的案例中为
构建
)是最新的,则终结器任务将不会运行。引述:

另一方面,如果最终确定的任务没有执行任何工作,例如,如果它被认为是最新的,或者依赖任务失败,则不会执行最终确定器任务


了解详细说明,请与thx联系。然而,我已经将aar文件生成到构建目录中,但这些文件从未被复制。你能找出原因吗?谢谢。