Мне нужно выполнить собственный код (через 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
Однако, я думаю, все же может быть интересно узнать ответ на этот вопрос.
Я не уверен, что вы хотите выполнить эту задачу. Помогает ли что-то подобное? http://stackoverflow.com/questions/25997866/gradle-warning-variant-getoutputfile-and-variant-setoutputfile-are-deprecat. Уместно пытаться сделать что-то для каждого APK по мере его создания, но вы можете рисовать некоторое вдохновение от этого. –
@ScottBarta Я наткнулся на вышеупомянутую ссылку u, упомянутую ранее:). Это было полезно для наименования файла apk, но в этом случае крючок должен быть после компиляции (что, на мой взгляд, может быть preBuild), несмотря на название, указывающее на другое: см. Раздел «Редактирование»), но до того, как все это будет упаковано в apk файл и afaik, фрагмент из ссылки фактически выполняет итерацию по выходному сигналу после его упаковки. – AgentKnopf