android - Gradle 模块构建顺序 2

标签 android gradle aar

我有一个带有许多模块的 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 不能被限制到无法正确地做这么简单的事情......

    我也用谷歌搜索了很多并尝试了一些解决方法,包括例如这个:
  • https://stackoverflow.com/a/42349993/8823423
  • 由于某种原因,它对我不起作用(对其他 Gradle 模块的任务依赖对我不起作用)

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

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

    最佳答案

    我能够使用 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")
            }
        }
    }
    

    关于android - Gradle 模块构建顺序 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59624688/

    相关文章:

    java - 以编程方式将 ImageView 添加到布局

    gradle - 内部 API 构造函数 DefaultDomainObjectSet(Class<T>) 已被弃用。这计划在 Gradle 7.0 中删除

    android - 处理传入消息我的 broadCastReceiver 不工作

    gradle - 将liquibase参数传递给gradle liquibase 'update'任务

    gradle - gradle测试效果不佳

    android - AAR中aapt/AndroidManifest.xml的作用

    android - 如何判断是否已正确添加外部依赖项(.aar)?

    java - 如何防止 Android Archive 库中的重复依赖

    java - 在 webview Android 应用程序中启用 Flash

    android - Google Tasks 使用什么时区?