为什么android gradle任务在LIB构建之前启动?
我正试图启动一个任务,将aar文件(android 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
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文件生成到构建目录中,但这些文件从未被复制。你能找出原因吗?谢谢。