我有一个带有许多模块的 Android Gradle 项目(只有 AAR,没有 APP)。
因为 Google 不支持胖 AAR,所以我需要自己重新打包(我尝试了多个胖 AAR Gradle 插件,但没有一个真正起作用,支持对我一点帮助都没有)。
所以我必须自己编写重新打包(作为 Groovy 脚本,直接进入我的 Gradle 构建系统)。
为此,我需要:
重新包装对我来说很好。但...
如果我执行此操作以确保干净的发布版本:
./gradlew clean :MbiSdkLibrary:assembleRelease
它首先清理所有内容,然后尝试构建我的 FAT 库。
问题是 MbiSdkLibrary AAR 构建与依赖 AAR 的构建并行开始,而其他 AAR 的构建尚未完全完成。换句话说,Gradle 在确定构建顺序时似乎忽略了依赖关系。
随后,MbiSdkLibrary(最终的胖 AAR)的重新打包在来自其他(并行)构建的缺失 AAR 上随机失败(这是一场竞赛)。
当然,我可以通过这种方式实现构建(我测试过,它工作得很好):
但是那个解决方案对我来说听起来很愚蠢,我相信 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/