2016-05-24 6 views
1

Ich versuche, eine Aufgabe zu starten, um die AAR-Dateien (Android-Bibliotheken) in einen separaten Ordner zu kopieren, aber die Aufgabe wird immer ausgelöst, bevor der Build gestartet wird.Warum Android gradle Aufgabe beginnt, bevor libs gebaut werden?

ich diese Antwort bin mit aber es funktioniert nicht für mich:

Is there a method in Gradle to execute some task after the build?

Hier ist meine gradle:

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!!!' 
} 

und die Ausgabe von einem sauberen Build:

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 [email protected] 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 

Antwort

1

Die Druckanweisungen, die Sie zu copyAARToCommonLibs hinzugefügt haben, sind mi Sie zu schlucken. Basierend auf ihrer Position in der Aufgabendefinition werden sie zur Konfigurationszeit unabhängig von einer Inter-Task-Abhängigkeitsreihenfolge ausgeführt. Aus diesem Grund erscheinen die Ausdrucke vor dem Build-Prozess (da die Konfiguration nicht von den Abhängigkeiten der Aufgaben abhängig ist).

Hier ist ein einfaches Beispiel:

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) 

Wenn ich toFinalize auszuführen ist die Ausgabe:

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

BUILD SUCCESSFUL 

Wie Sie den Konfigurationscode des Finalizerthread sehen können, ist tatsächlich vor die Code-Konfiguration ausgeführt für die zu beendende Aufgabe (dh unabhängig von Aufgabenabhängigkeiten), während der Code doLast in der gewünschten Reihenfolge läuft.

Als solche gibt die Verwendung der print-Anweisungen in der Art, wie Sie haben, nicht tatsächlich einen Hinweis darauf, wann der Kopiervorgang ausgeführt wird.

Eine andere Sache zu realisieren ist, dass in Ihrer Ausgabe (von dem, was Sie zeigten) gibt es keine :app:copyAARToCommonLibs Anweisungen, die zeigen, dass die Aufgabe nicht tatsächlich ausgeführt wird Laut der task docs wird eine Finalizer-Task nicht ausgeführt, wenn die abgeschlossene Aufgabe (in Ihrem Fall build) auf dem neuesten Stand war. Zitat:

Auf der anderen Seite, Finalizerthread Aufgaben ausgeführt werden, nicht, wenn die endgültige Aufgabe keine Arbeit zu tun hat, zum Beispiel, wenn es auf dem neuesten Stand oder wenn eine abhängige Aufgabe nicht berücksichtigt wird.

+0

verstanden und THX für die detaillierte Erklärung. Allerdings habe ich aar-Dateien im Build-Verzeichnis generiert, aber diese werden nie kopiert. Kannst du warum sehen? Danke. – gmmo

Verwandte Themen