Gradle Android Plugin: Включете се в задача след компилиране за всички вкусове на продукта

Трябва да изпълня собствения си код (чрез 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

Въпреки това - мисля, че все още може да е интересно да се знае отговорът на този въпрос.


person AgentKnopf    schedule 30.01.2015    source източник
comment
Не съм сигурен какво искате да направи тази задача. Помага ли нещо подобно? stackoverflow .com/questions/25997866/ Уместно е да се опитате да направите нещо с всеки APK, докато се генерира, но може да успеете да почерпите малко вдъхновение от него.   -  person Scott Barta    schedule 30.01.2015
comment
@ScottBarta Случайно попаднах на връзката по-горе, спомената по-рано :). Беше полезно за именуване на apk файла, но в този случай куката трябва да е след компилирането (което според мен всъщност може да е preBuild - въпреки че името предполага друго? Вижте Редактиране за подробности), но преди цялото това нещо да бъде пакетирано в apk файл и afaik фрагментът от връзката всъщност итерира изхода, след като е бил пакетиран.   -  person AgentKnopf    schedule 31.01.2015


Отговори (1)


Не можете да разширите задачите за сглобяване и изграждане по този начин, защото те се заменят с подходящите задачи, свързани с вариант на изграждане, точно преди фазата на изпълнение на Gradle. Например: assemble става assembleRelease.

Въпреки това все още можете да се включите в процеса на изграждане, когато графиката на компилациите се сглобява. Ако искате да изпълните свой собствен код точно преди пакетната задача, можете да използвате този фрагмент:

task doStuff << {
    // Do stuff
}

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

Този код няма да прави разлика между вариантите на компилация; можете да направите това в условието if, ако е необходимо.

person kevinpelgrims    schedule 05.04.2015