首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分级模块构建顺序2

分级模块构建顺序2
EN

Stack Overflow用户
提问于 2020-01-07 08:29:57
回答 1查看 110关注 0票数 0

我有很多模块的Android Gradle项目(只有AAR,没有应用程序)。

因为Google不支持fat AAR,所以我需要自己重新打包(我尝试了多个fat AAR Gradle插件,但是没有一个真正起作用,支持根本帮不了我)。

因此,我必须自己编写重新打包(作为Groovy脚本,直接到我的Gradle构建系统中)。

为此,我需要:

modules

  • Repackage (
  • )构建了许多AAR --这些是多级的AAR--所有这些AAR都进入了一个大的AAR--这是一个特殊的等级模块(上面所有的AAR都被设置为对AAR的实现依赖)
  • 然后混淆了使用DexGuard (没有ProGuard/R8 -它们太弱)的所有东西。

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

如果我执行此操作是为了确保生成的版本是干净的:

代码语言:javascript
复制
./gradlew clean :MbiSdkLibrary:assembleRelease

它首先清理所有的东西,然后尝试建立我的脂肪库。

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

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

当然,我可以以这种方式实现构建(我测试了,它运行得很好):

command

  • Build,
  • 首先使用单独的gradle

构建依赖关系AAR,这是最终的fat AAR,之后(没有干净的任务)

但是这个解决方案听起来很愚蠢,我相信Gradle不能有那么有限的能力去做这样一件简单的事情。

我还在谷歌上搜索了很多,并尝试了一些解决办法,比如这个:

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

对不起,由于某些原因,我不允许在那里交流,所以我不得不用另一个(非常类似的)问题淹没。

EN

回答 1

Stack Overflow用户

发布于 2020-01-07 10:35:38

我能够使用GradleBuild类型的任务破解这个问题。

但是它使构建速度慢了5倍,占用了更多的内存。

这是我的方法

代码语言:javascript
复制
// 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")
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59624688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档