【问题标题】:Gradle Module Build Order 2Gradle 模块构建顺序 2
【发布时间】:2020-01-07 08:29:57
【问题描述】:

我有一个带有许多模块的 Android Gradle 项目(只有 AAR,没有 APP)。

因为 Google 不支持胖 AAR,所以我需要自己重新打包(我尝试了多个胖 AAR Gradle 插件,但都没有实际工作,支持对我一点帮助都没有)。

所以我必须自己编写重新打包(作为 Groovy 脚本,直接进入我的 Gradle 构建系统)。

为此我需要:

  • 构建许多 AAR - 这些是多个 Gradle 模块
  • 将所有这些 AAR 重新打包到一个大 AAR 中 - 这是一个特殊的 Gradle 模块(上面的所有 AAR 都设置为此 AAR 的实现依赖项)
  • 然后使用 DexGuard 混淆所有内容(没有 ProGuard/R8 - 这些太弱了)

重新包装对我来说很好。但是...

如果我执行此操作以确保干净的发布版本:

./gradlew clean :MbiSdkLibrary:assembleRelease

它首先清理所有内容,然后尝试构建我的 FAT 库。

问题在于 MbiSdkLibrary AAR 构建与依赖 AAR 的构建并行开始,而其他 AAR 的构建尚未完全完成。换句话说,Gradle 在确定构建顺序时似乎忽略了依赖关系。

随后,MbiSdkLibrary(最终的胖 AAR)的重新打包在来自其他(并行)构建的缺失 AAR 上随机失败(这是一场竞赛)。

当然,我可以通过这种方式实现构建(我测试过,效果很好):

  • 首先使用单独的 gradle 命令构建依赖项 AAR
  • 之后构建最终的胖 AAR(没有 clean 任务)

但是那个解决方案对我来说听起来很愚蠢,我相信 Gradle 不能被限制到无法正确地做这么简单的事情......

我还在 Google 上搜索了很多,并尝试了一些解决方法,例如这个:

我的问题与这个问题有关:Gradle Module Build Order

抱歉,由于某种原因,我不被允许在那里交流,所以我不得不用另一个(非常相似的)问题来淹没 SO。

【问题讨论】:

    标签: android gradle aar


    【解决方案1】:

    我能够使用 GradleBuild 类型的任务解决问题。

    但它使构建速度慢了 5 倍,并且消耗了更多内存。

    这是我的方法

    // Note: This method is a bit hacky solution:
    // - It creates a child Gradle build which can easily cause OOM error
    // Awaiting response for the Gradle related question:
    // - https://stackoverflow.com/questions/59624688/gradle-module-build-order-2
    // - Hopefully someone knows better way hot to do this properly
    
    def aarDependencies_setupModuleDependencies(task) {
        String buildType
        if (task.name == 'preBuild') {
            buildType = ''
        } else if (task.name == 'preDebugBuild') {
            buildType = 'Debug'
        } else if (task.name == 'preReleaseBuild') {
            buildType = 'Release'
        } else {
            return
        }
        List<String> taskList = new ArrayList<>()
        project.ext.REPACKAGING__PROJECT_DEP.each { dirFn ->
            String moduleName = dirFn[1]
            String taskToRun = ":$moduleName:assemble$buildType"
            taskList.add(taskToRun)
        }
        task.dependsOn tasks.create(name: "buildDependenciesFor${buildType}", type: GradleBuild) {
            dir "../../"
            buildFile 'build.gradle'
            setTasks(taskList)
            doFirst {
                aarDependencies_log("Ensuring dependencies for build type '${buildType}' are available...")
            }
            doLast {
                aarDependencies_log("Ensuring dependencies for build type '${buildType}' are available: DONE")
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2014-10-12
      • 2013-07-27
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2013-06-03
      • 2013-09-08
      • 2012-06-23
      相关资源
      最近更新 更多