Трябва да изпълня собствения си код (чрез javaexec), след като проектът ми за Android е компилиран от gradle, но преди да бъде пакетиран в apk (и всъщност преди ресурсите да бъдат преместени до крайната им дестинация). Така че използвах:
gradlew tasks --all
За да получите списък с налични задачи. Използвам аромати на продукти, така че почти всички задачи имат име на аромат някъде по средата като:
assembleFlavorA
or
инсталирайтеFlavorB
и т.н...
Това, което мога да направя в момента, е да изпълня собствената си задача, преди да започне компилирането, като се закача в задачата preBuild:
preBuild <<{
//Do some stuff
}
Горното се извиква за всеки вариант на компилация, което е точно това, което искам. Когато обаче опитам същото със задачата за сглобяване или задачата за изграждане:
assemble <<{
//Get's never executed
}
build <<{
//Get's never executed
}
Кодът по-горе никога не се изпълнява, независимо от вкуса на продукта, който създавам. Разглеждане на списъка със зависимости за 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
Виждам само preBuild, но нито сглобяване, нито изграждане, което е странно, тъй като се показва, когато се изпълнява
gradlew tasks
Но повечето методи в горния списък са специфични за вкуса и не искам да имам една и съща задача 20 пъти, защото имам 20 различни варианта... И така, как мога да изпълня необходимите си задачи, след като компилирането приключи, но APK все още не е опакован за всички вкусове? Нещо като:
//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
}
РЕДАКТИРАНЕ Така че проверих отново изхода от командния ред при изграждане на customerA например чрез:
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
Така че въз основа на горния изход за компилация, бих предположил, че preBuild всъщност се случва след фазата на компилиране? Както е посочено след compileReleaseJava и другите задачи за компилиране. Ако случаят е такъв, тогава "preBuild" би бил достатъчен за моите изисквания.
АКТУАЛИЗАЦИЯ 04.02.2015
Въпросът остава отворен, но промених кода си, за да не зависи повече от него. Вместо да се опитвам да използвам Java клас, който първо трябва да бъде компилиран от моя проект, създадох друг проект за този клас, който генерира jar файл, който от своя страна мисля да използва - подробности можете да намерите тук:
https://stackoverflow.com/a/28303047/1041533
Въпреки това - мисля, че все още може да е интересно да се знае отговорът на този въпрос.