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.
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. –
@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