【问题标题】:Gradle Android Plugin: Hook into post-compile task for all product flavorsGradle Android 插件:挂钩到所有产品风格的编译后任务
【发布时间】:2015-01-30 11:45:59
【问题描述】:

我需要执行我自己的代码(通过 javaexec),在我的 android 项目被 gradle 编译之后,但在它被打包成一个 apk 之前(事实上,在资源被移动到它们的最终目的地之前)。所以我用了:

gradlew tasks --all

获取可用任务的列表。我正在使用产品风味,所以几乎所有任务都有介于两者之间的风味名称:

assembleFlavorA

安装FlavorB

等等……

我现在能做的,是在编译开始之前通过挂钩 preBuild 任务执行我自己的任务:

preBuild <<{
    //Do some stuff
}

对于每个构建变体都会调用上述内容,这正是我想要的。 但是,当我尝试使用 assemble 任务或 build 任务时:

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 但既没有 assemble 也没有 build,这很奇怪,因为它在运行时显示

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

但是 - 我认为知道这个问题的答案可能仍然很有趣。

【问题讨论】:

  • 我不确定你想要这个任务做什么。这样的事情有帮助吗? stackoverflow.com/questions/25997866/… 这与尝试对生成的每个 APK 执行某些操作有关,但您也许可以从中汲取一些灵感。
  • @ScottBarta 我偶然发现了你之前提到的上述链接:)。这对于命名 apk 文件很有用,但在这种情况下,钩子需要在编译之后(我认为 preBuild 实际上可能是 - 尽管名称另有说明?有关详细信息,请参阅编辑)但在整个东西被打包到 apk 之前文件和 afaik 链接中的 sn-p 实际上在打包后迭代输出。

标签: android gradle android-gradle-plugin


【解决方案1】:

您不能像这样扩展 assemble 和 build 任务,因为它们在 Gradle 执行阶段之前被适当的构建变体相关任务替换。例如:assemble 变成 assembleRelease。

不过,当构建图组合在一起时,您仍然可以挂钩到构建过程。如果你想在打包任务之前执行你自己的代码,你可以使用这个sn-p:

task doStuff << {
    // Do stuff
}

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

此代码不会区分构建变体;如有必要,您可以在 if 条件下执行此操作。

【讨论】:

    猜你喜欢
    • 2013-10-01
    • 2014-04-23
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    相关资源
    最近更新 更多