2015-01-30 1 views
5

Мне нужно выполнить собственный код (через javaexec), после того как мой проект андроида был скомпилирован градиентом, но прежде чем он будет упакован в apk (и на самом деле , прежде чем ресурсы будут перенесены в конечный пункт назначения). Поэтому я использовал:Gradle Android Plugin: Захват задачи после компиляции для всех продуктов.

gradlew tasks --all 

Чтобы получить список доступных задач. Я использую ароматы продукта, так что почти все задачи имеют название аромата где-то посередине, как:

assembleFlavorA

или

installFlavorB

и т.д. ..

Что я могу сделать прямо сейчас, выполнить свою собственную задачу до компиляции начинается, зацепив в задачу 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 
} 

EDIT Так что я перепроверил вывод командной строки при создании customerÃ, например, с помощью:

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».

UPDATE 04.02.2015

Вопрос остается открытым, но я изменил мой код, чтобы больше не зависеть от него.Вместо того, чтобы пытаться использовать класс java, который должен быть сначала скомпилирован моим проектом, я создал еще один проект для этого класса, который генерирует файл jar, который, в свою очередь, я думаю, что использование - подробности можно найти здесь:

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

Однако, я думаю, все же может быть интересно узнать ответ на этот вопрос.

+0

Я не уверен, что вы хотите выполнить эту задачу. Помогает ли что-то подобное? http://stackoverflow.com/questions/25997866/gradle-warning-variant-getoutputfile-and-variant-setoutputfile-are-deprecat. Уместно пытаться сделать что-то для каждого APK по мере его создания, но вы можете рисовать некоторое вдохновение от этого. –

+0

@ScottBarta Я наткнулся на вышеупомянутую ссылку u, упомянутую ранее:). Это было полезно для наименования файла apk, но в этом случае крючок должен быть после компиляции (что, на мой взгляд, может быть preBuild), несмотря на название, указывающее на другое: см. Раздел «Редактирование»), но до того, как все это будет упаковано в apk файл и afaik, фрагмент из ссылки фактически выполняет итерацию по выходному сигналу после его упаковки. – AgentKnopf

ответ

8

Вы не можете расширять сборку и строить задачи таким образом, потому что они заменяются соответствующими задачами, связанными с вариантом сборки, непосредственно перед фазой выполнения Gradle. Например: сборка будет собираться.

Вы все еще можете подключиться к процессу сборки, когда граф сборки создается вместе. Если вы хотите, чтобы выполнить свой собственный код прямо перед задачей пакета, вы можете использовать этот фрагмент кода:

task doStuff << { 
    // Do stuff 
} 

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

Этот код не будет делать различия между вариантами сборки; вы можете сделать это в условии if, если это необходимо.

+0

Спасибо! –

Смежные вопросы