2015-01-30 10 views
5

Potrzebuję wykonać swój własny kod (przez javaexec), po tym jak mój androidowy projekt został skompilowany przez gradle, ale zanim zostanie spakowany do apk (i tak naprawdę , zanim zasoby zostaną przeniesione do miejsca docelowego). Użyłem:Gradle Android Plugin: Zajmij się zadaniem po kompilacji dla wszystkich smaków produktów

gradlew tasks --all 

Aby uzyskać listę dostępnych zadań. Używam smaki produktów, więc prawie wszystkie zadania mają nazwę smak gdzieś pośrodku jak:

assembleFlavorA

lub

installFlavorB

etc. ..

Co mogę zrobić teraz, to wykonać własne zadanie przed kompilacją rozpoczyna zaczepiając do zadania prebuild:

preBuild <<{ 
    //Do some stuff 
} 

Powyższe jest wywoływana dla każdego wariantu budowy, który jest dokładnie to, co chcę. Jednak gdy próbuję to samo zadanie zmontować lub zadania kompilacji:

assemble <<{ 
    //Get's never executed 
} 

build <<{ 
    //Get's never executed 
} 

Powyższy kod nie jest wykonywany, niezależnie od tego, jaki produkt smak buduję. Patrząc na listę zależnościach dla releaseFlavorA:

myapp:assembleFlavorARelease - Assembles the Release build for flavor FlavorA [library:bundleRelease] 
    myapp:checkFlavorAReleaseManifest 
    myapp:compileFlavorAReleaseAidl 
    myapp:compileFlavorAReleaseJava 
    myapp:compileFlavorAReleaseNdk 
    myapp:compileFlavorAReleaseRenderscript 
    myapp:dexFlavorARelease 
    myapp:generateFlavorAReleaseAssets 
    myapp:generateFlavorAReleaseBuildConfig 
    myapp:generateFlavorAReleaseResValues 
    myapp:generateFlavorAReleaseResources 
    myapp:generateFlavorAReleaseSources 
    myapp:lintVitalFlavorARelease - Runs lint on just the fatal issues in the FlavorARelease build 
    myapp:mergeFlavorAReleaseAssets 
    myapp:mergeFlavorAReleaseResources 
    myapp:packageFlavorARelease 
    myapp:preFlavorADebugBuild 
    myapp:preFlavorAReleaseBuild 
    myapp:preAltdorfDebugBuild 
    myapp:preAltdorfReleaseBuild 
    myapp:preBerlinDebugBuild 
    myapp:preBerlinReleaseBuild 
    myapp:preBuild 
    myapp:prepareFlavorAReleaseDependencies 
    myapp:prepareComAndroidSupportAppcompatV71910Library - Prepare com.android.support:appcompat-v7:19.1.0 
    myapp:prepareTrunkGradleLibraryUnspecifiedLibrary - Prepare trunk-gradle:library:unspecified 
    myapp:processFlavorAReleaseJavaRes 
    myapp:processFlavorAReleaseManifest 
    myapp:processFlavorAReleaseResources 
    myapp:validateReleaseSigning 
    myapp:zipalignFlavorARelease 

widzę tylko prebuild ale ani zmontować ani budować, co jest dziwne, ponieważ jest to pokazane podczas uruchamiania

gradlew tasks 

Ale większość metod w powyższym wykazie są smak specyficzny i nie chcę mieć tego samego zadania 20 razy, ponieważ mam 20 różnych smaków ... Jak mogę wykonywać niezbędne zadania, gdy kompilacja zostanie ukończona, ale pakiet APK nie został jeszcze spakowany dla wszystkich smaki? Coś jak:

//I know there is no task called "postCompile" - so anything post compiling and pre-packaging would be fine 
postCompile << { 
    //Do something that needs to be done for all flavors 
} 

EDIT Więc ponownie sprawdzić wyjście wiersza poleceń przy budowie customerâ na przykład poprzez:

gradlew assembleCustomerARelease

C:\Users\user\workspace\android\trunk-gradle>gradlew assembleCustomerARelease 
:library:compileLint 
:library:copyReleaseLint UP-TO-DATE 
:library:mergeReleaseProguardFiles UP-TO-DATE 
:library:preBuild 
:library:preReleaseBuild 
:library:checkReleaseManifest 
:library:preDebugBuild 
:library:preDebugTestBuild 
:library:prepareComAndroidSupportAppcompatV71910Library UP-TO-DATE 
:library:prepareReleaseDependencies 
:library:compileReleaseAidl UP-TO-DATE 
:library:compileReleaseRenderscript UP-TO-DATE 
:library:generateReleaseBuildConfig UP-TO-DATE 
:library:generateReleaseAssets UP-TO-DATE 
:library:mergeReleaseAssets UP-TO-DATE 
:library:generateReleaseResValues UP-TO-DATE 
:library:generateReleaseResources UP-TO-DATE 
:library:mergeReleaseResources UP-TO-DATE 
:library:processReleaseManifest UP-TO-DATE 
:library:processReleaseResources UP-TO-DATE 
:library:generateReleaseSources UP-TO-DATE 
:library:compileReleaseJava UP-TO-DATE 
:library:processReleaseJavaRes UP-TO-DATE 
:library:packageReleaseJar UP-TO-DATE 
:library:compileReleaseNdk UP-TO-DATE 
:library:packageReleaseJniLibs UP-TO-DATE 
:library:packageReleaseLocalJar UP-TO-DATE 
:library:packageReleaseRenderscript UP-TO-DATE 
:library:packageReleaseResources UP-TO-DATE 
:library:bundleRelease UP-TO-DATE 
:myapp:preBuild 
Path to customer file: C:\Users\user\workspace\android\trunk-gradle\myapp\src\CustomerA\res\xml\customer.xml 
Selected server: release 
:myapp:preCustomerAReleaseBuild 
:myapp:checkCustomerAReleaseManifest 
:myapp:preCustomerADebugBuild 
:myapp:preCustomerBDebugBuild 
:myapp:preCustomerBReleaseBuild 
:myapp:preCustomerCDebugBuild 
:myapp:preCustomerCReleaseBuild 
:myapp:prepareComAndroidSupportAppcompatV71910Library UP-TO-DATE 
:myapp:prepareTrunkGradleLibraryUnspecifiedLibrary UP-TO-DATE 
:myapp:prepareCustomerAReleaseDependencies 
:myapp:compileCustomerAReleaseAidl UP-TO-DATE 
:myapp:compileCustomerAReleaseRenderscript UP-TO-DATE 
:myapp:generateCustomerAReleaseBuildConfig UP-TO-DATE 
:myapp:generateCustomerAReleaseAssets UP-TO-DATE 
:myapp:mergeCustomerAReleaseAssets UP-TO-DATE 
:myapp:generateCustomerAReleaseResValues UP-TO-DATE 
:myapp:generateCustomerAReleaseResources UP-TO-DATE 
:myapp:mergeCustomerAReleaseResources UP-TO-DATE 
:myapp:processCustomerAReleaseManifest UP-TO-DATE 
:myapp:processCustomerAReleaseResources UP-TO-DATE 
:myapp:generateCustomerAReleaseSources UP-TO-DATE 
:myapp:compileCustomerAReleaseJava UP-TO-DATE 
:myapp:lintVitalCustomerARelease 
//Some logoutput from the dex-ing task not really relevant in this case 
:myapp:dexCustomerARelease UP-TO-DATE 
:myapp:processCustomerAReleaseJavaRes UP-TO-DATE 
:myapp:validateReleaseSigning 
:myapp:packageCustomerARelease UP-TO-DATE 
:myapp:zipalignCustomerARelease UP-TO-DATE 
:myapp:assembleCustomerARelease 

BUILD SUCCESSFUL 

Total time: 25.451 secs 

Więc na podstawie powyższej kompilacji wyjściowy, zakładam, że preBuild faktycznie dzieje się po fazie kompilacji? Jak jest wymienione po compileReleaseJava i innych zadań kompilacji. W takim przypadku "preBuild" wystarczyłoby dla mnie.

UPDATE 04.02.2015

Pytanie pozostaje otwarte, ale zmieniły mojego kodu już nie zależy od niego.Zamiast próbować użyć klasy java, którą najpierw musiałby skompilować mój projekt, utworzyłem inny projekt dla tej klasy, który generuje plik jar, który z kolei uważam za użyteczny - szczegóły można znaleźć tutaj:

https://stackoverflow.com/a/28303047/1041533

Jednak - myślę, że nadal może być interesujące poznanie odpowiedzi na to pytanie.

+0

Nie jestem pewien, co chcesz zrobić to zadanie. Czy coś takiego pomaga? http://stackoverflow.com/questions/25997866/gradle-warning-variant-getoutputfile-and-variant-setoutputfile-are-deprecat Ważne jest, aby spróbować coś zrobić dla każdego pliku APK, ponieważ jest on generowany, ale możesz być w stanie narysować inspiracja. –

+0

@ScottBarta natknąłem się na powyższy link wspomniany wcześniej:). Przydaje się do nazywania pliku APK, ale w tym przypadku hak musi być po kompilacji (co, jak myślę, może być preBuildem - pomimo nazwy sugerującej inaczej? Zobacz Edycja dla szczegółów), ale zanim to wszystko zostanie zapakowane do pliku apk plik i afaik fragment kodu z odnośnika faktycznie iteruje nad wyjściem po jego zapakowaniu. – AgentKnopf

Odpowiedz

8

Nie można rozszerzyć zadań składania i tworzenia, ponieważ zastępowane są odpowiednimi zadaniami związanymi z wariantem kompilacji tuż przed fazą wykonywania Gradle. Na przykład: assemble staje się assembleRelease.

Nadal można przechwycić proces kompilacji, gdy budowany jest wykres budowania. Jeśli chcesz wykonać własny kod tuż przed zadaniem pakietu, można użyć tego fragmentu:

task doStuff << { 
    // Do stuff 
} 

tasks.whenTaskAdded { theTask -> 
    if (theTask.name.contains('package')) { 
     theTask.dependsOn 'doStuff' 
    } 
} 

Ten kod nie dokonują rozróżnienia pomiędzy wariantami kompilacji; możesz to zrobić w razie, jeśli to konieczne.

+0

Dzięki za to! –

Powiązane problemy