Android Gradle模块构建顺序2
我有一个Android和Gradle项目,有很多模块(只有AAR,没有应用程序) 因为谷歌不支持fat-AAR,我需要自己重新打包(我尝试了多个fat-AAR-Gradle插件,但都不起作用,支持根本帮不了我) 因此,我必须自己编写重新打包(作为Groovy脚本,直接写入Gradle构建系统) 为此,我需要:Android Gradle模块构建顺序2,android,gradle,aar,Android,Gradle,Aar,我有一个Android和Gradle项目,有很多模块(只有AAR,没有应用程序) 因为谷歌不支持fat-AAR,我需要自己重新打包(我尝试了多个fat-AAR-Gradle插件,但都不起作用,支持根本帮不了我) 因此,我必须自己编写重新打包(作为Groovy脚本,直接写入Gradle构建系统) 为此,我需要: 构建许多AAR——这些是多个渐变模块 将所有这些AAR重新打包到一个大AAR中-这是一个特殊的Gradle模块(上面所有的AAR都设置为该AAR的实现依赖项) 然后使用DexGuard(
- 构建许多AAR——这些是多个渐变模块
- 将所有这些AAR重新打包到一个大AAR中-这是一个特殊的Gradle模块(上面所有的AAR都设置为该AAR的实现依赖项)
- 然后使用DexGuard(无ProGuard/R8-这些太弱)混淆所有内容
./gradlew clean :MbiSdkLibrary:assembleRelease
它首先清理所有东西,然后尝试构建我的脂肪库
问题是MbiSdkLibrary AAR构建与依赖AAR的构建并行启动,而其他AAR的构建尚未完全完成。换句话说,Gradle在确定构建顺序时似乎忽略了依赖关系
随后,MbiSdkLibrary(最终fat AAR)的重新打包在其他(并行)构建中丢失的AAR上随机失败(这是一场竞赛)
当然,我可以通过这种方式实现构建(我测试过,它工作得很好):
- 首先使用单独的gradle命令构建依赖项AARs
- 之后构建最终fat AAR(无清洁任务)
- 由于某种原因,它对我不起作用(与其他Gradle模块的任务依赖关系对我不起作用)
抱歉,由于某些原因,我不允许在那里交流,因此我不得不用另一个(非常类似的)问题来回答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")
}
}
}
//注意:这个方法有点老套:
//-它会创建一个子渐变构建,这很容易导致OOM错误
//等待Gradle相关问题的答复:
// - https://stackoverflow.com/questions/59624688/gradle-module-build-order-2
//-希望有人知道更好的方法来正确地做这件事
def aarrependencies_setupModuleDependencies(任务){
字符串构建类型
如果(task.name=='preBuild'){
buildType=“”
}else if(task.name=='preDebugBuild'){
buildType='Debug'
}else if(task.name=='preReleaseBuild'){
buildType='Release'
}否则{
返回
}
List taskList=new ArrayList()
project.ext.repacking\uuuu project\u DEP.each{dirFn->
字符串moduleName=dirFn[1]
字符串taskToRun=“:$moduleName:Assembly$buildType”
任务列表。添加(taskToRun)
}
task.dependsOn tasks.create(名称:“buildDependenciesFor${buildType}”,类型:GradleBuild){
目录“./../”
构建文件“build.gradle”
设置任务(任务列表)
首先{
aarDependencies_日志(“确保生成类型“${buildType}”的依赖项可用…”)
}
多拉斯特{
aarDependencies_log(“确保生成类型“${buildType}”的依赖项可用:完成”)
}
}
}