我有很多模块的Android Gradle项目(只有AAR,没有应用程序)。
因为Google不支持fat AAR,所以我需要自己重新打包(我尝试了多个fat AAR Gradle插件,但是没有一个真正起作用,支持根本帮不了我)。
因此,我必须自己编写重新打包(作为Groovy脚本,直接到我的Gradle构建系统中)。
为此,我需要:
modules
重新包装对我来说很好。但是..。
如果我执行此操作是为了确保生成的版本是干净的:
./gradlew clean :MbiSdkLibrary:assembleRelease它首先清理所有的东西,然后尝试建立我的脂肪库。
问题是,MbiSdkLibrary AAR构建与依赖关系AAR的构建并行启动,而其他AAR的构建尚未完全完成。换句话说,在确定构建顺序时,Gradle似乎忽略了依赖项。
随后,MbiSdkLibrary (最终fat AAR)的重新打包在其他(并行)构建的缺失AAR上随机失败(这是一个竞赛)。
当然,我可以以这种方式实现构建(我测试了,它运行得很好):
command
构建依赖关系AAR,这是最终的fat AAR,之后(没有干净的任务)
但是这个解决方案听起来很愚蠢,我相信Gradle不能有那么有限的能力去做这样一件简单的事情。
我还在谷歌上搜索了很多,并尝试了一些解决办法,比如这个:
我的问题与这个问题有关:Gradle Module Build Order。
对不起,由于某些原因,我不允许在那里交流,所以我不得不用另一个(非常类似的)问题淹没。
发布于 2020-01-07 10:35:38
我能够使用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")
}
}
}https://stackoverflow.com/questions/59624688
复制相似问题